[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v10 09/10] virtio-iommu: Set supported page size mask
From: |
Jean-Philippe Brucker |
Subject: |
[PATCH v10 09/10] virtio-iommu: Set supported page size mask |
Date: |
Thu, 8 Oct 2020 19:15:57 +0200 |
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>
---
v10: Use global page mask, allowing VFIO to override it until boot.
---
hw/virtio/virtio-iommu.c | 51 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
index 8823bfc804a..dd0b3093d1b 100644
--- a/hw/virtio/virtio-iommu.c
+++ b/hw/virtio/virtio-iommu.c
@@ -914,6 +914,56 @@ static int
virtio_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu_mr,
return 0;
}
+static int virtio_iommu_set_page_size_mask(IOMMUMemoryRegion *mr,
+ uint64_t page_size_mask,
+ Error **errp)
+{
+ int new_granule, old_granule;
+ IOMMUDevice *sdev = container_of(mr, IOMMUDevice, iommu_mr);
+ VirtIOIOMMU *s = sdev->viommu;
+
+ if (!page_size_mask) {
+ return -1;
+ }
+
+ new_granule = ctz64(page_size_mask);
+ old_granule = ctz64(s->config.page_size_mask);
+
+ /*
+ * Modifying the page size after machine initialization isn't supported.
+ * Having a different mask is possible but the guest will use sub-optimal
+ * block sizes, so warn about it.
+ */
+ if (qdev_hotplug) {
+ if (new_granule != old_granule) {
+ error_setg(errp,
+ "virtio-iommu page mask 0x%"PRIx64
+ " is incompatible with mask 0x%"PRIx64,
+ s->config.page_size_mask, page_size_mask);
+ return -1;
+ } else if (page_size_mask != s->config.page_size_mask) {
+ warn_report("virtio-iommu page mask 0x%"PRIx64
+ " does not match 0x%"PRIx64,
+ s->config.page_size_mask, page_size_mask);
+ }
+ return 0;
+ }
+
+ /*
+ * Disallow shrinking the page size. For example if an endpoint only
+ * supports 64kB pages, we can't globally enable 4kB pages. But that
+ * shouldn't happen, the host is unlikely to setup differing page granules.
+ * The other bits are only hints describing optimal block sizes.
+ */
+ if (new_granule < old_granule) {
+ error_setg(errp, "memory region shrinks the virtio-iommu page
granule");
+ return -1;
+ }
+
+ s->config.page_size_mask = page_size_mask;
+ return 0;
+}
+
static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
{
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
@@ -1146,6 +1196,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 = {
--
2.28.0
- Re: [PATCH v10 03/10] virtio-iommu: Add memory notifiers for map/unmap, (continued)
- [PATCH v10 05/10] virtio-iommu: Add replay() memory region callback, Jean-Philippe Brucker, 2020/10/08
- [PATCH v10 06/10] virtio-iommu: Add notify_flag_changed() memory region callback, Jean-Philippe Brucker, 2020/10/08
- [PATCH v10 07/10] memory: Add interface to set iommu page size mask, Jean-Philippe Brucker, 2020/10/08
- [PATCH v10 09/10] virtio-iommu: Set supported page size mask,
Jean-Philippe Brucker <=
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Auger Eric, 2020/10/16
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Peter Xu, 2020/10/19
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Jean-Philippe Brucker, 2020/10/22
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Peter Xu, 2020/10/22
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Jean-Philippe Brucker, 2020/10/23
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Peter Xu, 2020/10/23
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Jean-Philippe Brucker, 2020/10/27
- Re: [PATCH v10 09/10] virtio-iommu: Set supported page size mask, Michael S. Tsirkin, 2020/10/30
[PATCH v10 08/10] vfio: Set IOMMU page size as per host supported page size, Jean-Philippe Brucker, 2020/10/08