[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH 6/8] intel_iommu: support device iotlb descr
From: |
Peter Xu |
Subject: |
Re: [Qemu-devel] [RFC PATCH 6/8] intel_iommu: support device iotlb descriptor |
Date: |
Mon, 28 Mar 2016 11:37:53 +0800 |
User-agent: |
Mutt/1.5.24 (2015-08-30) |
On Fri, Mar 25, 2016 at 10:13:27AM +0800, Jason Wang wrote:
> This patch enables device IOTLB support for intel iommu. The major
> work is to implement QI device IOTLB descriptor processing and notify
> the device through iommu notifier.
>
> Cc: Paolo Bonzini <address@hidden>
> Cc: Richard Henderson <address@hidden>
> Cc: Eduardo Habkost <address@hidden>
> Cc: Michael S. Tsirkin <address@hidden>
> Signed-off-by: Jason Wang <address@hidden>
> ---
> hw/i386/intel_iommu.c | 81
> ++++++++++++++++++++++++++++++++++++++----
> hw/i386/intel_iommu_internal.h | 13 +++++--
> 2 files changed, 86 insertions(+), 8 deletions(-)
>
[...]
> +static bool vtd_process_device_iotlb_desc(IntelIOMMUState *s,
> + VTDInvDesc *inv_desc)
> +{
> + VTDAddressSpace *vtd_dev_as;
> + IOMMUTLBEntry entry;
> + struct VTDBus *vtd_bus;
> + hwaddr addr;
> + uint64_t sz;
> + uint16_t sid;
> + uint8_t devfn;
> + bool size;
> + uint8_t bus_num;
> +
> + addr = VTD_INV_DESC_DEVICE_IOTLB_ADDR(inv_desc->hi);
> + sid = VTD_INV_DESC_DEVICE_IOTLB_SID(inv_desc->lo);
> + devfn = sid & 0xff;
> + bus_num = sid >> 8;
> + size = VTD_INV_DESC_DEVICE_IOTLB_SIZE(inv_desc->hi);
> +
> + if ((inv_desc->lo & VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO) ||
> + (inv_desc->hi & VTD_INV_DESC_DEVICE_IOTLB_RSVD_HI)) {
> + VTD_DPRINTF(GENERAL, "error: non-zero reserved field in Device "
> + "IOTLB Invalidate Descriptor hi 0x%"PRIx64 " lo
> 0x%"PRIx64,
> + inv_desc->hi, inv_desc->lo);
> + return false;
> + }
> +
> + vtd_bus = vtd_find_as_from_bus_num(s, bus_num);
> + if (!vtd_bus) {
> + goto done;
> + }
> +
> + vtd_dev_as = vtd_bus->dev_as[devfn];
> + if (!vtd_dev_as) {
> + goto done;
> + }
> +
> + if (size) {
> + sz = ffsll(~(addr >> VTD_PAGE_SHIFT));
> + addr = addr & ~((1 << (sz + VTD_PAGE_SHIFT)) - 1);
> + sz = VTD_PAGE_SIZE << sz;
For these three lines, could it be shorter like:
sz = 1 << ffsll(~addr);
addr &= ~(sz - 1);
It seems that we can avoid using VTD_PAGE_*.
> + } else {
> + sz = VTD_PAGE_SIZE;
> + }
> +
> + entry.target_as = &vtd_dev_as->as;
> + entry.addr_mask = sz - 1;
> + entry.iova = addr;
> + memory_region_notify_iommu(entry.target_as->root, entry);
Here, we seems to be posting this invalidation to all registered
notifiers. Since this is a device-tlb invalidation, and we should
know which device (BDF) that we should invalidate, is there any way
that we can directly route this info to that specific device?
E.g., if we enable VFIO with current patch, this notify will
possibly be passed to VFIO devices as well, even it's actually for
vhost devices. Not sure whether there would be problem.
Another thing totally not related to this patch: I see that the
second parameter for memory_region_notify_iommu() is IOMMUTLBEntry,
rather than its pointer. While inside of the funccall, it only
passes in the pointer directly:
void memory_region_notify_iommu(MemoryRegion *mr,
IOMMUTLBEntry entry)
{
assert(memory_region_is_iommu(mr));
notifier_list_notify(&mr->iommu_notify, &entry);
}
Shall we change "entry" into a pointer as well? I found no reason
why we need to keep this IOMMUTLBEntry in stack twice...
Thanks.
-- peterx
- Re: [Qemu-devel] [RFC PATCH 2/8] intel_iommu: name vtd address space with devfn, (continued)
- [Qemu-devel] [RFC PATCH 3/8] intel_iommu: allocate new key when creating new address space, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 1/8] virtio: convert to use DMA api, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 4/8] exec: introduce address_space_get_iotlb_entry(), Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 5/8] virtio-pci: address space translation service (ATS) support, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 6/8] intel_iommu: support device iotlb descriptor, Jason Wang, 2016/03/24
- Re: [Qemu-devel] [RFC PATCH 6/8] intel_iommu: support device iotlb descriptor,
Peter Xu <=
- [Qemu-devel] [RFC PATCH 7/8] memory: handle alias for iommu notifier, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 8/8] vhost_net: device IOTLB support, Jason Wang, 2016/03/24