• Joao Martins's avatar
    iommu: Add iommu_domain ops for dirty tracking · 750e2e90
    Joao Martins authored
    Add to iommu domain operations a set of callbacks to perform dirty
    tracking, particulary to start and stop tracking and to read and clear the
    dirty data.
    
    Drivers are generally expected to dynamically change its translation
    structures to toggle the tracking and flush some form of control state
    structure that stands in the IOVA translation path. Though it's not
    mandatory, as drivers can also enable dirty tracking at boot, and just
    clear the dirty bits before setting dirty tracking. For each of the newly
    added IOMMU core APIs:
    
    iommu_cap::IOMMU_CAP_DIRTY_TRACKING: new device iommu_capable value when
    probing for capabilities of the device.
    
    .set_dirty_tracking(): an iommu driver is expected to change its
    translation structures and enable dirty tracking for the devices in the
    iommu_domain. For drivers making dirty tracking always-enabled, it should
    just return 0.
    
    .read_and_clear_dirty(): an iommu driver is expected to walk the pagetables
    for the iova range passed in and use iommu_dirty_bitmap_record() to record
    dirty info per IOVA. When detecting that a given IOVA is dirty it should
    also clear its dirty state from the PTE, *unless* the flag
    IOMMU_DIRTY_NO_CLEAR is passed in -- flushing is steered from the caller of
    the domain_op via iotlb_gather. The iommu core APIs use the same data
    structure in use for dirty tracking for VFIO device dirty (struct
    iova_bitmap) abstracted by iommu_dirty_bitmap_record() helper function.
    
    domain::dirty_ops: IOMMU domains will store the dirty ops depending on
    whether the iommu device supports dirty tracking or not. iommu drivers can
    then use this field to figure if the dirty tracking is supported+enforced
    on attach. The enforcement is enable via domain_alloc_user() which is done
    via IOMMUFD hwpt flag introduced later.
    
    Link: https://lore.kernel.org/r/20231024135109.73787-5-joao.m.martins@oracle.comSigned-off-by: default avatarJoao Martins <joao.m.martins@oracle.com>
    Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    750e2e90
iommu.h 39.7 KB