On 18/10/2023 21:27, Joao Martins wrote: > diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h > index 9e1721e38819..efeb12c1aaeb 100644 > --- a/include/uapi/linux/iommufd.h > +++ b/include/uapi/linux/iommufd.h > @@ -48,6 +48,7 @@ enum { > IOMMUFD_CMD_HWPT_ALLOC, > IOMMUFD_CMD_GET_HW_INFO, > IOMMUFD_CMD_HWPT_SET_DIRTY, > + IOMMUFD_CMD_HWPT_GET_DIRTY_IOVA, > }; > > /** > @@ -479,4 +480,31 @@ struct iommu_hwpt_set_dirty { > __u32 __reserved; > }; > #define IOMMU_HWPT_SET_DIRTY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_SET_DIRTY) > + > +/** > + * struct iommu_hwpt_get_dirty_iova - ioctl(IOMMU_HWPT_GET_DIRTY_IOVA) > + * @size: sizeof(struct iommu_hwpt_get_dirty_iova) > + * @hwpt_id: HW pagetable ID that represents the IOMMU domain. > + * @flags: Flags to control dirty tracking status. > + * @iova: base IOVA of the bitmap first bit > + * @length: IOVA range size > + * @page_size: page size granularity of each bit in the bitmap > + * @data: bitmap where to set the dirty bits. The bitmap bits each > + * represent a page_size which you deviate from an arbitrary iova. > + * Checking a given IOVA is dirty: > + * > + * data[(iova / page_size) / 64] & (1ULL << (iova % 64)) > + */ > +struct iommu_hwpt_get_dirty_iova { > + __u32 size; > + __u32 hwpt_id; > + __u32 flags; > + __u32 __reserved; > + __aligned_u64 iova; > + __aligned_u64 length; > + __aligned_u64 page_size; > + __aligned_u64 *data; > +}; > +#define IOMMU_HWPT_GET_DIRTY_IOVA _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_GET_DIRTY_IOVA) > + > #endif I added this extra chunk: diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 6b26045f6577..3349347cb766 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -502,7 +502,7 @@ struct iommu_hwpt_set_dirty { * struct iommu_hwpt_get_dirty_iova - ioctl(IOMMU_HWPT_GET_DIRTY_IOVA) * @size: sizeof(struct iommu_hwpt_get_dirty_iova) * @hwpt_id: HW pagetable ID that represents the IOMMU domain. - * @flags: Flags to control dirty tracking status. + * @flags: Flags to control the fetching of dirty IOVAs. * @iova: base IOVA of the bitmap first bit * @length: IOVA range size * @page_size: page size granularity of each bit in the bitmap @@ -511,6 +511,10 @@ struct iommu_hwpt_set_dirty { * Checking a given IOVA is dirty: * * data[(iova / page_size) / 64] & (1ULL << (iova % 64)) + * + * Walk the IOMMU pagetables for a given IOVA range to return a bitmap + * with the dirty IOVAs. In doing so it will also by default clear any + * dirty bit metadata set in the IOPTE. */ struct iommu_hwpt_get_dirty_iova { __u32 size;