Message ID | 20240226181337.24148-4-eric.auger@redhat.com |
---|---|
State | New |
Headers | show |
Series | VIRTIO-IOMMU: Set default granule to host page size | expand |
Hi Eric, >-----Original Message----- >From: Eric Auger <eric.auger@redhat.com> >Subject: [PATCH v5 3/3] virtio-iommu: Change the default granule to the >host page size > >We used to set the default granule to 4KB but with VFIO assignment >it makes more sense to use the actual host page size. > >Indeed when hotplugging a VFIO device protected by a virtio-iommu >on a 64kB/64kB host/guest config, we current get a qemu crash: > >"vfio: DMA mapping failed, unable to continue" > >This is due to the hot-attached VFIO device calling >memory_region_iommu_set_page_size_mask() with 64kB granule >whereas the virtio-iommu granule was already frozen to 4KB on >machine init done. > >Set the granule property to "host" and introduce a new compat. >The page size mask used before 9.0 was qemu_target_page_mask(). >Since the virtio-iommu currently only supports x86_64 and aarch64, >this matched a 4KB granule. > >Note that the new default will prevent 4kB guest on 64kB host >because the granule will be set to 64kB which would be larger >than the guest page size. In that situation, the virtio-iommu >driver fails on viommu_domain_finalise() with >"granule 0x10000 larger than system page size 0x1000". > >In that case the workaround is to request 4K granule. > >The current limitation of global granule in the virtio-iommu >should be removed and turned into per domain granule. But >until we get this upgraded, this new default is probably >better because I don't think anyone is currently interested in >running a 4KB page size guest with virtio-iommu on a 64KB host. >However supporting 64kB guest on 64kB host with virtio-iommu and >VFIO looks a more important feature. > >Signed-off-by: Eric Auger <eric.auger@redhat.com> >Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Thanks Zhenzhong > >--- > >v4 -> v5 >- use low case, mandated by the jason qapi >--- > hw/core/machine.c | 1 + > hw/virtio/virtio-iommu.c | 2 +- > 2 files changed, 2 insertions(+), 1 deletion(-) > >diff --git a/hw/core/machine.c b/hw/core/machine.c >index 70ac96954c..56f38b6579 100644 >--- a/hw/core/machine.c >+++ b/hw/core/machine.c >@@ -35,6 +35,7 @@ > > GlobalProperty hw_compat_8_2[] = { > { TYPE_VIRTIO_IOMMU_PCI, "aw-bits", "64" }, >+ { TYPE_VIRTIO_IOMMU_PCI, "granule", "4k" }, > }; > const size_t hw_compat_8_2_len = G_N_ELEMENTS(hw_compat_8_2); > >diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c >index 33e0520bc8..6831446e29 100644 >--- a/hw/virtio/virtio-iommu.c >+++ b/hw/virtio/virtio-iommu.c >@@ -1548,7 +1548,7 @@ static Property virtio_iommu_properties[] = { > DEFINE_PROP_BOOL("boot-bypass", VirtIOIOMMU, boot_bypass, true), > DEFINE_PROP_UINT8("aw-bits", VirtIOIOMMU, aw_bits, 0), > DEFINE_PROP_GRANULE_MODE("granule", VirtIOIOMMU, granule_mode, >- GRANULE_MODE_4K), >+ GRANULE_MODE_HOST), > DEFINE_PROP_END_OF_LIST(), > }; > >-- >2.41.0
diff --git a/hw/core/machine.c b/hw/core/machine.c index 70ac96954c..56f38b6579 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -35,6 +35,7 @@ GlobalProperty hw_compat_8_2[] = { { TYPE_VIRTIO_IOMMU_PCI, "aw-bits", "64" }, + { TYPE_VIRTIO_IOMMU_PCI, "granule", "4k" }, }; const size_t hw_compat_8_2_len = G_N_ELEMENTS(hw_compat_8_2); diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c index 33e0520bc8..6831446e29 100644 --- a/hw/virtio/virtio-iommu.c +++ b/hw/virtio/virtio-iommu.c @@ -1548,7 +1548,7 @@ static Property virtio_iommu_properties[] = { DEFINE_PROP_BOOL("boot-bypass", VirtIOIOMMU, boot_bypass, true), DEFINE_PROP_UINT8("aw-bits", VirtIOIOMMU, aw_bits, 0), DEFINE_PROP_GRANULE_MODE("granule", VirtIOIOMMU, granule_mode, - GRANULE_MODE_4K), + GRANULE_MODE_HOST), DEFINE_PROP_END_OF_LIST(), };