Every IOMMU driver should be able to implement the needed iommu domain ops to control dirty tracking. Connect a hw_pagetable to the IOMMU core dirty tracking ops, specifically the ability to enable/disable dirty tracking on an IOMMU domain (hw_pagetable id). To that end add an io_pagetable kernel API to toggle dirty tracking: * iopt_set_dirty_tracking(iopt, [domain], state) The intended caller of this is via the hw_pagetable object that is created. Internally it will ensure the leftover dirty state is cleared /right before/ dirty tracking starts. This is also useful for iommu drivers which may decide that dirty tracking is always-enabled at boot without wanting to toggle dynamically via corresponding iommu domain op.
Showing the changes to include/uapi (1 of 5 files). Show all
Unified · Split
| @@ -47,6 +47,7 @@ enum { · 46 unmodified lines | |||
| 47 | IOMMUFD_CMD_VFIO_IOAS, | 47 | IOMMUFD_CMD_VFIO_IOAS, |
| 48 | IOMMUFD_CMD_HWPT_ALLOC, | 48 | IOMMUFD_CMD_HWPT_ALLOC, |
| 49 | IOMMUFD_CMD_GET_HW_INFO, | 49 | IOMMUFD_CMD_GET_HW_INFO, |
| 50 | IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING, | ||
| 50 | }; | 51 | }; |
| 51 | 52 | ||
| 52 | /** | 53 | /** |
| @@ -453,4 +454,31 @@ struct iommu_hw_info { · 400 unmodified lines | |||
| 453 | __u32 __reserved; | 454 | __u32 __reserved; |
| 454 | }; | 455 | }; |
| 455 | #define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO) | 456 | #define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO) |
| 457 | |||
| 458 | /* | ||
| 459 | * enum iommufd_hwpt_set_dirty_tracking_flags - Flags for steering dirty | ||
| 460 | * tracking | ||
| 461 | * @IOMMU_HWPT_DIRTY_TRACKING_ENABLE: Enable dirty tracking | ||
| 462 | */ | ||
| 463 | enum iommufd_hwpt_set_dirty_tracking_flags { | ||
| 464 | IOMMU_HWPT_DIRTY_TRACKING_ENABLE = 1, | ||
| 465 | }; | ||
| 466 | |||
| 467 | /** | ||
| 468 | * struct iommu_hwpt_set_dirty_tracking - ioctl(IOMMU_HWPT_SET_DIRTY_TRACKING) | ||
| 469 | * @size: sizeof(struct iommu_hwpt_set_dirty_tracking) | ||
| 470 | * @flags: Combination of enum iommufd_hwpt_set_dirty_tracking_flags | ||
| 471 | * @hwpt_id: HW pagetable ID that represents the IOMMU domain | ||
| 472 | * @__reserved: Must be 0 | ||
| 473 | * | ||
| 474 | * Toggle dirty tracking on an HW pagetable. | ||
| 475 | */ | ||
| 476 | struct iommu_hwpt_set_dirty_tracking { | ||
| 477 | __u32 size; | ||
| 478 | __u32 flags; | ||
| 479 | __u32 hwpt_id; | ||
| 480 | __u32 __reserved; | ||
| 481 | }; | ||
| 482 | #define IOMMU_HWPT_SET_DIRTY_TRACKING _IO(IOMMUFD_TYPE, \ | ||
| 483 | IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING) | ||
| 456 | #endif | 484 | #endif |