On Fri, May 19, 2017 at 09:07:49AM +0000, Tian, Kevin wrote: > > From: Liu, Yi L [mailto:yi.l.liu@xxxxxxxxxxxxxxx] > > Sent: Friday, May 19, 2017 1:24 PM > > > > Hi Alex, > > > > What's your opinion with Tianyu's question? Is it accepatable > > to use VFIO API in intel_iommu emulator? > > Did you actually need such translation at all? SID should be > filled by kernel IOMMU driver based on which device is > requested with invalidation request, regardless of which > guest SID is used in user space. Qemu only needs to know > which fd corresponds to guest SID, and then initiates an > invalidation request on that fd? Kevin, It actually depends on the svm binding behavior we expect in host IOMMU driver side. If we want to have the binding per-device, this translation is needed in Qemu either in VFIO or intel_iommu emulator. So that the host SID could be used as a device selector when looping devices in a group. If we can use VFIO API directly, we also may trigger the svm bind/qi propagation straightforwardly instead of using notifier. Thanks, Yi L > > > > Thanks, > > Yi L > > On Fri, Apr 28, 2017 at 02:46:16PM +0800, Lan Tianyu wrote: > > > On 2017年04月26日 18:06, Liu, Yi L wrote: > > > > With vIOMMU exposed to guest, vIOMMU emulator needs to do > > translation > > > > between host and guest. e.g. a device-selective TLB flush, vIOMMU > > > > emulator needs to replace guest SID with host SID so that to limit > > > > the invalidation. This patch introduces a new callback > > > > iommu_ops->record_device() to notify vIOMMU emulator to record > > necessary > > > > information about the assigned device. > > > > > > This patch is to prepare to translate guest sbdf to host sbdf. > > > > > > Alex: > > > Could we add a new vfio API to do such translation? This will be more > > > straight forward than storing host sbdf in the vIOMMU device model. > > > > > > > > > > > Signed-off-by: Liu, Yi L <yi.l.liu@xxxxxxxxxxxxxxx> > > > > --- > > > > include/exec/memory.h | 11 +++++++++++ > > > > memory.c | 12 ++++++++++++ > > > > 2 files changed, 23 insertions(+) > > > > > > > > diff --git a/include/exec/memory.h b/include/exec/memory.h > > > > index 7bd13ab..49087ef 100644 > > > > --- a/include/exec/memory.h > > > > +++ b/include/exec/memory.h > > > > @@ -203,6 +203,8 @@ struct MemoryRegionIOMMUOps { > > > > IOMMUNotifierFlag new_flags); > > > > /* Set this up to provide customized IOMMU replay function */ > > > > void (*replay)(MemoryRegion *iommu, IOMMUNotifier *notifier); > > > > + void (*record_device)(MemoryRegion *iommu, > > > > + void *device_info); > > > > }; > > > > > > > > typedef struct CoalescedMemoryRange CoalescedMemoryRange; > > > > @@ -708,6 +710,15 @@ void > > memory_region_notify_iommu(MemoryRegion *mr, > > > > void memory_region_notify_one(IOMMUNotifier *notifier, > > > > IOMMUTLBEntry *entry); > > > > > > > > +/* > > > > + * memory_region_notify_device_record: notify IOMMU to record > > assign > > > > + * device. > > > > + * @mr: the memory region to notify > > > > + * @ device_info: device information > > > > + */ > > > > +void memory_region_notify_device_record(MemoryRegion *mr, > > > > + void *info); > > > > + > > > > /** > > > > * memory_region_register_iommu_notifier: register a notifier for > > changes to > > > > * IOMMU translation entries. > > > > diff --git a/memory.c b/memory.c > > > > index 0728e62..45ef069 100644 > > > > --- a/memory.c > > > > +++ b/memory.c > > > > @@ -1600,6 +1600,18 @@ static void > > memory_region_update_iommu_notify_flags(MemoryRegion *mr) > > > > mr->iommu_notify_flags = flags; > > > > } > > > > > > > > +void memory_region_notify_device_record(MemoryRegion *mr, > > > > + void *info) > > > > +{ > > > > + assert(memory_region_is_iommu(mr)); > > > > + > > > > + if (mr->iommu_ops->record_device) { > > > > + mr->iommu_ops->record_device(mr, info); > > > > + } > > > > + > > > > + return; > > > > +} > > > > + > > > > void memory_region_register_iommu_notifier(MemoryRegion *mr, > > > > IOMMUNotifier *n) > > > > { > > > > > > > > > >