qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Stefano Garzarella <sgarzare@redhat.com>
Cc: Huaitong Han <oenhan@gmail.com>,
	marcel.apfelbaum@gmail.com, cohuck@redhat.com,
	pasic@linux.ibm.com, farman@linux.ibm.com,
	borntraeger@linux.ibm.com, leiyang@redhat.com,
	qemu-devel@nongnu.org, qemu-stable@nongnu.org,
	Huaitong Han <hanht2@chinatelecom.cn>,
	Zhiyuan Yuan <yuanzhiyuan@chinatelecom.cn>,
	Jidong Xia <xiajd@chinatelecom.cn>
Subject: Re: [PATCH V2] vhost: Don't set vring call if guest notifier is unused
Date: Tue, 20 May 2025 08:00:38 -0400	[thread overview]
Message-ID: <20250520080030-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <ypbprsw5lngenryzn7txs3gpoljgxr4yso4zjqfr5467nl5bkn@k5zgrfhqagq4>

On Tue, May 20, 2025 at 01:04:10PM +0200, Stefano Garzarella wrote:
> On Fri, May 16, 2025 at 09:03:33PM +0800, Huaitong Han wrote:
> > Stefano Garzarella <sgarzare@redhat.com> 于2025年5月16日周五 16:19写道:
> > > 
> > > On Tue, May 13, 2025 at 07:28:25PM +0800, oenhan@gmail.com wrote:
> > > >From: Huaitong Han <hanht2@chinatelecom.cn>
> > > >
> > > >The vring call fd is set even when the guest does not use MSI-X (e.g., in the
> > > >case of virtio PMD), leading to unnecessary CPU overhead for processing
> > > >interrupts.
> > > >
> > > >The commit 96a3d98d2c("vhost: don't set vring call if no vector") optimized the
> > > >case where MSI-X is enabled but the queue vector is unset. However, there's an
> > > >additional case where the guest uses INTx and the INTx_DISABLED bit in the PCI
> > > >config is set, meaning that no interrupt notifier will actually be used.
> > > >
> > > >In such cases, the vring call fd should also be cleared to avoid redundant
> > > >interrupt handling.
> > > >
> > > >Fixes: 96a3d98d2c("vhost: don't set vring call if no vector")
> > > >Reported-by: Zhiyuan Yuan <yuanzhiyuan@chinatelecom.cn>
> > > >Signed-off-by: Jidong Xia <xiajd@chinatelecom.cn>
> > > >Signed-off-by: Huaitong Han <hanht2@chinatelecom.cn>
> > > >---
> > > >V2:
> > > >- Retain the name `query_guest_notifiers`
> > > >- All qtest/unit test cases pass
> > > >- Fix V1 patch style problems
> > > >
> > > > hw/pci/pci.c                   |  2 +-
> > > > hw/s390x/virtio-ccw.c          |  7 +++++--
> > > > hw/virtio/vhost.c              |  3 +--
> > > > hw/virtio/virtio-pci.c         | 10 ++++++++--
> > > > include/hw/pci/pci.h           |  1 +
> > > > include/hw/virtio/virtio-bus.h |  2 +-
> > > > 6 files changed, 17 insertions(+), 8 deletions(-)
> > > >
> > > >diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > > >index 352b3d12c8..45b491412a 100644
> > > >--- a/hw/pci/pci.c
> > > >+++ b/hw/pci/pci.c
> > > >@@ -1712,7 +1712,7 @@ static void pci_update_mappings(PCIDevice *d)
> > > >     pci_update_vga(d);
> > > > }
> > > >
> > > >-static inline int pci_irq_disabled(PCIDevice *d)
> > > >+int pci_irq_disabled(PCIDevice *d)
> > > 
> > > Since it was inline, will it be better to move the whole function to
> > > include/hw/pci/pci.h and keep it inline?
> > > 
> > I did try moving the function to include/hw/pci/pci.h and marking it
> > inline, but ran into compilation issues due to the use of the incomplete
> > PCIDevice type.
> > Specifically, accessing d->config triggers the following error:
> > include/hw/pci/pci.h:674:26: error: invalid use of incomplete typedef
> > ‘PCIDevice’
> > return pci_get_word(d->config + PCI_COMMAND) & PCI_COMMAND_INTX_DISABLE;
> > Including hw/pci/pci_device.h in pci.h to resolve this introduces
> > further issues, so I suggest to keep the function as a non-inline
> > helper in the .c file.
> 
> I see. If Michael is happy with that, it's fine by me!
> 
> Thanks,
> Stefano
> 

I think it's fine.

> > > Thanks,
> > > Stefano
> > > 
> > > > {
> > > >     return pci_get_word(d->config + PCI_COMMAND) & PCI_COMMAND_INTX_DISABLE;
> > > > }
> > > >diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
> > > >index d2f85b39f3..632708ba4d 100644
> > > >--- a/hw/s390x/virtio-ccw.c
> > > >+++ b/hw/s390x/virtio-ccw.c
> > > >@@ -936,11 +936,14 @@ static void virtio_ccw_vmstate_change(DeviceState *d, bool running)
> > > >     }
> > > > }
> > > >
> > > >-static bool virtio_ccw_query_guest_notifiers(DeviceState *d)
> > > >+static bool virtio_ccw_query_guest_notifiers(DeviceState *d, int n)
> > > > {
> > > >     CcwDevice *dev = CCW_DEVICE(d);
> > > >+    VirtioCcwDevice *vdev = VIRTIO_CCW_DEVICE(d);
> > > >+    VirtIODevice *virtio_dev = virtio_bus_get_device(&vdev->bus);
> > > >
> > > >-    return !!(dev->sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ENA);
> > > >+    return !!(dev->sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ENA)
> > > >+            && virtio_queue_vector(virtio_dev, n) != VIRTIO_NO_VECTOR;
> > > > }
> > > >
> > > > static int virtio_ccw_get_mappings(VirtioCcwDevice *dev)
> > > >diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> > > >index 4cae7c1664..2a9a839763 100644
> > > >--- a/hw/virtio/vhost.c
> > > >+++ b/hw/virtio/vhost.c
> > > >@@ -1341,8 +1341,7 @@ int vhost_virtqueue_start(struct vhost_dev *dev,
> > > >     }
> > > >
> > > >     if (k->query_guest_notifiers &&
> > > >-        k->query_guest_notifiers(qbus->parent) &&
> > > >-        virtio_queue_vector(vdev, idx) == VIRTIO_NO_VECTOR) {
> > > >+        !k->query_guest_notifiers(qbus->parent, idx)) {
> > > >         file.fd = -1;
> > > >         r = dev->vhost_ops->vhost_set_vring_call(dev, &file);
> > > >         if (r) {
> > > >diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > > >index 0fa8fe4955..d62e199489 100644
> > > >--- a/hw/virtio/virtio-pci.c
> > > >+++ b/hw/virtio/virtio-pci.c
> > > >@@ -1212,10 +1212,16 @@ static int virtio_pci_set_guest_notifier(DeviceState *d, int n, bool assign,
> > > >     return 0;
> > > > }
> > > >
> > > >-static bool virtio_pci_query_guest_notifiers(DeviceState *d)
> > > >+static bool virtio_pci_query_guest_notifiers(DeviceState *d, int n)
> > > > {
> > > >     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
> > > >-    return msix_enabled(&proxy->pci_dev);
> > > >+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> > > >+
> > > >+    if (msix_enabled(&proxy->pci_dev)) {
> > > >+        return virtio_queue_vector(vdev, n) != VIRTIO_NO_VECTOR;
> > > >+    } else {
> > > >+        return !pci_irq_disabled(&proxy->pci_dev);
> > > >+    }
> > > > }
> > > >
> > > > static int virtio_pci_set_guest_notifiers(DeviceState *d, int nvqs, bool assign)
> > > >diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> > > >index c2fe6caa2c..8c24bd97db 100644
> > > >--- a/include/hw/pci/pci.h
> > > >+++ b/include/hw/pci/pci.h
> > > >@@ -668,6 +668,7 @@ void lsi53c8xx_handle_legacy_cmdline(DeviceState *lsi_dev);
> > > >
> > > > qemu_irq pci_allocate_irq(PCIDevice *pci_dev);
> > > > void pci_set_irq(PCIDevice *pci_dev, int level);
> > > >+int pci_irq_disabled(PCIDevice *d);
> > > >
> > > > static inline void pci_irq_assert(PCIDevice *pci_dev)
> > > > {
> > > >diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h
> > > >index 7ab8c9dab0..75d43b508a 100644
> > > >--- a/include/hw/virtio/virtio-bus.h
> > > >+++ b/include/hw/virtio/virtio-bus.h
> > > >@@ -48,7 +48,7 @@ struct VirtioBusClass {
> > > >     int (*load_done)(DeviceState *d, QEMUFile *f);
> > > >     int (*load_extra_state)(DeviceState *d, QEMUFile *f);
> > > >     bool (*has_extra_state)(DeviceState *d);
> > > >-    bool (*query_guest_notifiers)(DeviceState *d);
> > > >+    bool (*query_guest_notifiers)(DeviceState *d, int n);
> > > >     int (*set_guest_notifiers)(DeviceState *d, int nvqs, bool assign);
> > > >     int (*set_host_notifier_mr)(DeviceState *d, int n,
> > > >                                 MemoryRegion *mr, bool assign);
> > > >--
> > > >2.43.5
> > > >
> > > 
> > 



  reply	other threads:[~2025-05-20 12:01 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-13 11:28 [PATCH V2] vhost: Don't set vring call if guest notifier is unused oenhan
2025-05-16  8:19 ` Stefano Garzarella
2025-05-16 13:03   ` Huaitong Han
2025-05-20 11:04     ` Stefano Garzarella
2025-05-20 12:00       ` Michael S. Tsirkin [this message]
2025-05-20 11:41 ` Stefano Garzarella
2025-05-20 12:30   ` Huaitong Han
2025-05-20 12:53     ` Stefano Garzarella
2025-05-22  3:39       ` Huaitong Han
2025-05-22  7:44         ` Stefano Garzarella

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=20250520080030-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=borntraeger@linux.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=farman@linux.ibm.com \
    --cc=hanht2@chinatelecom.cn \
    --cc=leiyang@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=oenhan@gmail.com \
    --cc=pasic@linux.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    --cc=sgarzare@redhat.com \
    --cc=xiajd@chinatelecom.cn \
    --cc=yuanzhiyuan@chinatelecom.cn \
    /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).