[RFC PATCH v2 0/4] vhost: register and change IOMMU flag depending on ATS state

Viktor Prutyanov posted 4 patches 1 year ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20230501020221.188376-1-viktor@daynix.com
Maintainers: "Michael S. Tsirkin" <mst@redhat.com>, Jason Wang <jasowang@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
There is a newer version of this series
hw/net/vhost_net.c                | 11 +++++++++++
hw/net/virtio-net.c               |  8 ++++++++
hw/pci/pcie.c                     | 22 ++++++++++++++++++++++
hw/virtio/vhost-backend.c         |  6 ++++++
hw/virtio/vhost.c                 | 26 ++++++++++++++++++++++++--
hw/virtio/virtio-pci.c            | 17 +++++++++++++++++
include/hw/pci/pcie.h             |  5 +++++
include/hw/virtio/vhost-backend.h |  4 ++++
include/hw/virtio/vhost.h         |  1 +
include/hw/virtio/virtio.h        |  2 ++
include/net/vhost_net.h           |  2 ++
11 files changed, 102 insertions(+), 2 deletions(-)
[RFC PATCH v2 0/4] vhost: register and change IOMMU flag depending on ATS state
Posted by Viktor Prutyanov 1 year ago
When IOMMU and vhost are enabled together, QEMU tracks IOTLB or
Device-TLB unmap events depending on whether Device-TLB is enabled. But
even if Device-TLB and PCI ATS is enabled, the guest can reject to use
it. For example, this situation appears when Windows Server 2022 is
running with intel-iommu with device-iotlb=on and virtio-net-pci with
vhost=on. The guest implies that no address translation info cached in
device IOTLB and doesn't send device IOTLB invalidation commands. So,
it leads to irrelevant address translations in vhost-net in the host
kernel. Therefore network frames from the guest in host tap interface
contains wrong payload data.

This series adds checking of ATS state for proper unmap flag register
(IOMMU_NOTIFIER_UNMAP or IOMMU_NOTIFIER_DEVIOTLB_UNMAP).

Tested on Windows Server 2022, Windows 11 and Fedora guests with
 -device virtio-net-pci,bus=pci.3,netdev=nd0,iommu_platform=on,ats=on
 -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,vhost=on
 -device intel-iommu,intremap=on,eim=on,device-iotlb=on/off

Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2001312

Viktor Prutyanov (4):
  pci: add handling of Enable bit in ATS Control Register
  virtio-pci: add handling of ATS and Device-TLB enable
  vhost: register and change IOMMU flag depending on Device-TLB state
  virtio-net: pass Device-TLB enable/disable events to vhost

 hw/net/vhost_net.c                | 11 +++++++++++
 hw/net/virtio-net.c               |  8 ++++++++
 hw/pci/pcie.c                     | 22 ++++++++++++++++++++++
 hw/virtio/vhost-backend.c         |  6 ++++++
 hw/virtio/vhost.c                 | 26 ++++++++++++++++++++++++--
 hw/virtio/virtio-pci.c            | 17 +++++++++++++++++
 include/hw/pci/pcie.h             |  5 +++++
 include/hw/virtio/vhost-backend.h |  4 ++++
 include/hw/virtio/vhost.h         |  1 +
 include/hw/virtio/virtio.h        |  2 ++
 include/net/vhost_net.h           |  2 ++
 11 files changed, 102 insertions(+), 2 deletions(-)

-- 
2.35.1
Re: [RFC PATCH v2 0/4] vhost: register and change IOMMU flag depending on ATS state
Posted by Jason Wang 12 months ago
On Mon, May 1, 2023 at 10:02 AM Viktor Prutyanov <viktor@daynix.com> wrote:
>
> When IOMMU and vhost are enabled together, QEMU tracks IOTLB or
> Device-TLB unmap events depending on whether Device-TLB is enabled. But
> even if Device-TLB and PCI ATS is enabled, the guest can reject to use
> it. For example, this situation appears when Windows Server 2022 is
> running with intel-iommu with device-iotlb=on and virtio-net-pci with
> vhost=on. The guest implies that no address translation info cached in
> device IOTLB and doesn't send device IOTLB invalidation commands. So,
> it leads to irrelevant address translations in vhost-net in the host
> kernel. Therefore network frames from the guest in host tap interface
> contains wrong payload data.
>
> This series adds checking of ATS state for proper unmap flag register
> (IOMMU_NOTIFIER_UNMAP or IOMMU_NOTIFIER_DEVIOTLB_UNMAP).
>
> Tested on Windows Server 2022, Windows 11 and Fedora guests with
>  -device virtio-net-pci,bus=pci.3,netdev=nd0,iommu_platform=on,ats=on
>  -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,vhost=on
>  -device intel-iommu,intremap=on,eim=on,device-iotlb=on/off
>
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2001312

It would be better if we can have a change log here.

Thanks

>
> Viktor Prutyanov (4):
>   pci: add handling of Enable bit in ATS Control Register
>   virtio-pci: add handling of ATS and Device-TLB enable
>   vhost: register and change IOMMU flag depending on Device-TLB state
>   virtio-net: pass Device-TLB enable/disable events to vhost
>
>  hw/net/vhost_net.c                | 11 +++++++++++
>  hw/net/virtio-net.c               |  8 ++++++++
>  hw/pci/pcie.c                     | 22 ++++++++++++++++++++++
>  hw/virtio/vhost-backend.c         |  6 ++++++
>  hw/virtio/vhost.c                 | 26 ++++++++++++++++++++++++--
>  hw/virtio/virtio-pci.c            | 17 +++++++++++++++++
>  include/hw/pci/pcie.h             |  5 +++++
>  include/hw/virtio/vhost-backend.h |  4 ++++
>  include/hw/virtio/vhost.h         |  1 +
>  include/hw/virtio/virtio.h        |  2 ++
>  include/net/vhost_net.h           |  2 ++
>  11 files changed, 102 insertions(+), 2 deletions(-)
>
> --
> 2.35.1
>