qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Bharat Bhushan <bbhushan2@marvell.com>,
	Eric Auger <eric.auger@redhat.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>
Subject: [PULL v3 21/31] virtio-iommu: Set supported page size mask
Date: Wed, 4 Nov 2020 13:42:17 -0500	[thread overview]
Message-ID: <20201104184040.285057-22-mst@redhat.com> (raw)
In-Reply-To: <20201104184040.285057-1-mst@redhat.com>

From: Bharat Bhushan <bbhushan2@marvell.com>

The virtio-iommu device can deal with arbitrary page sizes for virtual
endpoints, but for endpoints assigned with VFIO it must follow the page
granule used by the host IOMMU driver.

Implement the interface to set the vIOMMU page size mask, called by VFIO
for each endpoint. We assume that all host IOMMU drivers use the same
page granule (the host page granule). Override the page_size_mask field
in the virtio config space.

Signed-off-by: Bharat Bhushan <bbhushan2@marvell.com>
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Message-Id: <20201030180510.747225-10-jean-philippe@linaro.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/virtio/virtio-iommu.c | 50 ++++++++++++++++++++++++++++++++++++++++
 hw/virtio/trace-events   |  1 +
 2 files changed, 51 insertions(+)

diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
index 78e07aa40a..fc5c75d693 100644
--- a/hw/virtio/virtio-iommu.c
+++ b/hw/virtio/virtio-iommu.c
@@ -899,6 +899,55 @@ static int virtio_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu_mr,
     return 0;
 }
 
+/*
+ * The default mask (TARGET_PAGE_MASK) is the smallest supported guest granule,
+ * for example 0xfffffffffffff000. When an assigned device has page size
+ * restrictions due to the hardware IOMMU configuration, apply this restriction
+ * to the mask.
+ */
+static int virtio_iommu_set_page_size_mask(IOMMUMemoryRegion *mr,
+                                           uint64_t new_mask,
+                                           Error **errp)
+{
+    IOMMUDevice *sdev = container_of(mr, IOMMUDevice, iommu_mr);
+    VirtIOIOMMU *s = sdev->viommu;
+    uint64_t cur_mask = s->config.page_size_mask;
+
+    trace_virtio_iommu_set_page_size_mask(mr->parent_obj.name, cur_mask,
+                                          new_mask);
+
+    if ((cur_mask & new_mask) == 0) {
+        error_setg(errp, "virtio-iommu page mask 0x%"PRIx64
+                   " is incompatible with mask 0x%"PRIx64, cur_mask, new_mask);
+        return -1;
+    }
+
+    /*
+     * After the machine is finalized, we can't change the mask anymore. If by
+     * chance the hotplugged device supports the same granule, we can still
+     * accept it. Having a different masks is possible but the guest will use
+     * sub-optimal block sizes, so warn about it.
+     */
+    if (qdev_hotplug) {
+        int new_granule = ctz64(new_mask);
+        int cur_granule = ctz64(cur_mask);
+
+        if (new_granule != cur_granule) {
+            error_setg(errp, "virtio-iommu page mask 0x%"PRIx64
+                       " is incompatible with mask 0x%"PRIx64, cur_mask,
+                       new_mask);
+            return -1;
+        } else if (new_mask != cur_mask) {
+            warn_report("virtio-iommu page mask 0x%"PRIx64
+                        " does not match 0x%"PRIx64, cur_mask, new_mask);
+        }
+        return 0;
+    }
+
+    s->config.page_size_mask &= new_mask;
+    return 0;
+}
+
 static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
@@ -1130,6 +1179,7 @@ static void virtio_iommu_memory_region_class_init(ObjectClass *klass,
     imrc->translate = virtio_iommu_translate;
     imrc->replay = virtio_iommu_replay;
     imrc->notify_flag_changed = virtio_iommu_notify_flag_changed;
+    imrc->iommu_set_page_size_mask = virtio_iommu_set_page_size_mask;
 }
 
 static const TypeInfo virtio_iommu_info = {
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
index 982d0002a6..2060a144a2 100644
--- a/hw/virtio/trace-events
+++ b/hw/virtio/trace-events
@@ -109,6 +109,7 @@ virtio_iommu_fill_resv_property(uint32_t devid, uint8_t subtype, uint64_t start,
 virtio_iommu_notify_map(const char *name, uint64_t virt_start, uint64_t virt_end, uint64_t phys_start, uint32_t flags) "mr=%s virt_start=0x%"PRIx64" virt_end=0x%"PRIx64" phys_start=0x%"PRIx64" flags=%d"
 virtio_iommu_notify_unmap(const char *name, uint64_t virt_start, uint64_t virt_end) "mr=%s virt_start=0x%"PRIx64" virt_end=0x%"PRIx64
 virtio_iommu_remap(const char *name, uint64_t virt_start, uint64_t virt_end, uint64_t phys_start) "mr=%s virt_start=0x%"PRIx64" virt_end=0x%"PRIx64" phys_start=0x%"PRIx64
+virtio_iommu_set_page_size_mask(const char *name, uint64_t old, uint64_t new) "mr=%s old_mask=0x%"PRIx64" new_mask=0x%"PRIx64
 virtio_iommu_notify_flag_add(const char *name) "add notifier to mr %s"
 virtio_iommu_notify_flag_del(const char *name) "del notifier from mr %s"
 
-- 
MST



  parent reply	other threads:[~2020-11-04 18:53 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-04 18:41 [PULL v3 00/31] pc,pci,vhost,virtio: fixes Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 01/31] pc: comment style fixup Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 02/31] virtio-mem: Make sure "addr" is always multiples of the block size Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 03/31] virtio-mem: Make sure "usable_region_size" " Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 04/31] virtio-mem: Probe THP size to determine default " Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 05/31] memory-device: Support big alignment requirements Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 06/31] memory-device: Add get_min_alignment() callback Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 07/31] virito-mem: Implement get_min_alignment() Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 08/31] hw/acpi : Don't use '#' flag of printf format Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 09/31] hw/acpi : add space before the open parenthesis '(' Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 10/31] hw/acpi : add spaces around operator Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 11/31] hw/virtio/vhost-backend: Fix Coverity CID 1432871 Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 12/31] hw/smbios: Fix leaked fd in save_opt_one() error path Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 13/31] virtio-iommu: Fix virtio_iommu_mr() Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 14/31] virtio-iommu: Store memory region in endpoint struct Michael S. Tsirkin
2020-11-04 18:41 ` [PULL v3 15/31] virtio-iommu: Add memory notifiers for map/unmap Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 16/31] virtio-iommu: Call memory notifiers in attach/detach Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 17/31] virtio-iommu: Add replay() memory region callback Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 18/31] virtio-iommu: Add notify_flag_changed() " Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 19/31] memory: Add interface to set iommu page size mask Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 20/31] vfio: Set IOMMU page size as per host supported page size Michael S. Tsirkin
2020-11-04 18:42 ` Michael S. Tsirkin [this message]
2020-11-04 18:42 ` [PULL v3 22/31] vfio: Don't issue full 2^64 unmap Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 23/31] vhost-vdpa: Add qemu_close in vhost_vdpa_cleanup Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 24/31] net: Add vhost-vdpa in show_netdevs() Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 25/31] Revert "vhost-blk: set features before setting inflight feature" Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 26/31] vhost-blk: set features before setting inflight feature Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 27/31] libvhost-user: follow QEMU comment style Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 28/31] configure: introduce --enable-vhost-user-blk-server Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 29/31] block/export: make vhost-user-blk config space little-endian Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 30/31] block/export: fix vhost-user-blk get_config() information leak Michael S. Tsirkin
2020-11-04 18:42 ` [PULL v3 31/31] contrib/vhost-user-blk: fix " Michael S. Tsirkin
2020-11-05 16:14 ` [PULL v3 00/31] pc,pci,vhost,virtio: fixes Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201104184040.285057-22-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=bbhushan2@marvell.com \
    --cc=eric.auger@redhat.com \
    --cc=jean-philippe@linaro.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).