[PATCH v3 2/4] iommu/io-pgtable-arm: Add read_and_clear_dirty() support
Jason Gunthorpe
jgg at nvidia.com
Wed May 22 09:56:40 PDT 2024
On Wed, May 22, 2024 at 03:37:57PM +0100, Joao Martins wrote:
> This is just to catch the case where IOMMUFD can call into read_and_clear()
> without dirty tracking enabled and without a bitmap structure to clear dirty
> bits -- in order to ensure a clean PTE data snapshot after start().
Is that broken then?
iopt_clear_dirty_data() sets the NULL:
iommu_dirty_bitmap_init(&dirty, NULL, &gather);
ret = ops->read_and_clear_dirty(domain, iopt_area_iova(area),
iopt_area_length(area), 0,
&dirty);
But AMD, for instance, does nothing:
spin_lock_irqsave(&pdomain->lock, lflags);
if (!pdomain->dirty_tracking && dirty->bitmap) {
spin_unlock_irqrestore(&pdomain->lock, lflags);
return -EINVAL;
}
spin_unlock_irqrestore(&pdomain->lock, lflags);
return ops->read_and_clear_dirty(ops, iova, size, flags, dirty);
It certainly didn't clear the IOPTEs.
AFAIK the NULL should be ignored here:
static inline void iommu_dirty_bitmap_record(struct iommu_dirty_bitmap *dirty,
unsigned long iova,
unsigned long length)
{
if (dirty->bitmap)
iova_bitmap_set(dirty->bitmap, iova, length);
Not above. That looks like a bug. Yes?
Thanks,
Jason
More information about the linux-arm-kernel
mailing list