On Fri, May 02, 2025 at 02:15:46AM +0000, Alejandro Jimenez wrote: > Invalidating the entire address space (i.e. range of [0, ~0ULL]) is a > valid and required operation by vIOMMU implementations. However, such > invalidations currently trigger an assertion unless they originate from > device IOTLB invalidations. > > Although in recent Linux guests this case is not exercised by the VTD > implementation due to various optimizations, the assertion will be hit > by upcoming AMD vIOMMU changes to support DMA address translation. More > specifically, when running a Linux guest with VFIO passthrough device, > and a kernel that does not contain commmit 3f2571fed2fa ("iommu/amd: > Remove redundant domain flush from attach_device()"). > > Remove the assertion altogether and adjust the range to ensure it does > not cross notifier boundaries. > > Signed-off-by: Alejandro Jimenez <alejandro.j.jime...@oracle.com>
Looks legit: Acked-by: Michael S. Tsirkin <m...@redhat.com> can we get an ack from memory API supporters? > --- > system/memory.c | 10 +++------- > 1 file changed, 3 insertions(+), 7 deletions(-) > > diff --git a/system/memory.c b/system/memory.c > index 71434e7ad02c..7ad2fc098341 100644 > --- a/system/memory.c > +++ b/system/memory.c > @@ -2021,13 +2021,9 @@ void memory_region_notify_iommu_one(IOMMUNotifier > *notifier, > return; > } > > - if (notifier->notifier_flags & IOMMU_NOTIFIER_DEVIOTLB_UNMAP) { > - /* Crop (iova, addr_mask) to range */ > - tmp.iova = MAX(tmp.iova, notifier->start); > - tmp.addr_mask = MIN(entry_end, notifier->end) - tmp.iova; > - } else { > - assert(entry->iova >= notifier->start && entry_end <= notifier->end); > - } > + /* Crop (iova, addr_mask) to range */ > + tmp.iova = MAX(tmp.iova, notifier->start); > + tmp.addr_mask = MIN(entry_end, notifier->end) - tmp.iova; > > if (event->type & notifier->notifier_flags) { > notifier->notify(notifier, &tmp); > -- > 2.43.5