2024-04-09 01:50:32

by lyx634449800

[permalink] [raw]
Subject: [PATCH v3] vp_vdpa: fix the method of calculating vectors

When there is a ctlq and it doesn't require interrupt
callbacks,the original method of calculating vectors
wastes hardware msi or msix resources as well as system
IRQ resources.

When conducting performance testing using testpmd in the
guest os, it was found that the performance was lower compared
to directly using vfio-pci to passthrough the device

In scenarios where the virtio device in the guest os does
not utilize interrupts, the vdpa driver still configures
the hardware's msix vector. Therefore, the hardware still
sends interrupts to the host os. Because of this unnecessary
action by the hardware, hardware performance decreases, and
it also affects the performance of the host os.

Before modification:(interrupt mode)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(interrupt mode)
32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config

Before modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config

To verify the use of the virtio PMD mode in the guest operating
system, the following patch needs to be applied to QEMU:
https://lore.kernel.org/all/[email protected]

Signed-off-by: lyx634449800 <[email protected]>
---

V3: delete unused variables and add validation records
V2: fix when allocating IRQs, scan all queues

drivers/vdpa/virtio_pci/vp_vdpa.c | 35 +++++++++++++++++++------------
1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index df5f4a3bccb5..cd3aeb3b8f21 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -160,22 +160,31 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
struct pci_dev *pdev = mdev->pci_dev;
int i, ret, irq;
int queues = vp_vdpa->queues;
- int vectors = queues + 1;
+ int msix_vec, allocated_vectors = 0;

- ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
- if (ret != vectors) {
+ for (i = 0; i < queues; i++) {
+ if (vp_vdpa->vring[i].cb.callback)
+ allocated_vectors++;
+ }
+ allocated_vectors = allocated_vectors + 1;
+
+ ret = pci_alloc_irq_vectors(pdev, allocated_vectors, allocated_vectors,
+ PCI_IRQ_MSIX);
+ if (ret != allocated_vectors) {
dev_err(&pdev->dev,
"vp_vdpa: fail to allocate irq vectors want %d but %d\n",
- vectors, ret);
+ allocated_vectors, ret);
return ret;
}
-
- vp_vdpa->vectors = vectors;
+ vp_vdpa->vectors = allocated_vectors;

for (i = 0; i < queues; i++) {
+ if (!vp_vdpa->vring[i].cb.callback)
+ continue;
+
snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
"vp-vdpa[%s]-%d\n", pci_name(pdev), i);
- irq = pci_irq_vector(pdev, i);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq,
vp_vdpa_vq_handler,
0, vp_vdpa->vring[i].msix_name,
@@ -185,23 +194,23 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
"vp_vdpa: fail to request irq for vq %d\n", i);
goto err;
}
- vp_modern_queue_vector(mdev, i, i);
+ vp_modern_queue_vector(mdev, i, msix_vec);
vp_vdpa->vring[i].irq = irq;
+ msix_vec++;
}

snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
- pci_name(pdev));
- irq = pci_irq_vector(pdev, queues);
+ pci_name(pdev));
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
vp_vdpa->msix_name, vp_vdpa);
if (ret) {
dev_err(&pdev->dev,
- "vp_vdpa: fail to request irq for vq %d\n", i);
+ "vp_vdpa: fail to request irq for config\n");
goto err;
}
- vp_modern_config_vector(mdev, queues);
+ vp_modern_config_vector(mdev, msix_vec);
vp_vdpa->config_irq = irq;
-
return 0;
err:
vp_vdpa_free_irq(vp_vdpa);
--
2.43.0



2024-04-09 03:56:24

by Jason Wang

[permalink] [raw]
Subject: Re: [PATCH v3] vp_vdpa: fix the method of calculating vectors

On Tue, Apr 9, 2024 at 9:49 AM lyx634449800 <[email protected]> wrote:
>
> When there is a ctlq and it doesn't require interrupt
> callbacks,the original method of calculating vectors
> wastes hardware msi or msix resources as well as system
> IRQ resources.
>
> When conducting performance testing using testpmd in the
> guest os, it was found that the performance was lower compared
> to directly using vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does
> not utilize interrupts, the vdpa driver still configures
> the hardware's msix vector. Therefore, the hardware still
> sends interrupts to the host os. Because of this unnecessary
> action by the hardware, hardware performance decreases, and
> it also affects the performance of the host os.
>
> Before modification:(interrupt mode)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(interrupt mode)
> 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
>
> Before modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
>
> To verify the use of the virtio PMD mode in the guest operating
> system, the following patch needs to be applied to QEMU:
> https://lore.kernel.org/all/[email protected]
>
> Signed-off-by: lyx634449800 <[email protected]>
> ---
>
> V3: delete unused variables and add validation records
> V2: fix when allocating IRQs, scan all queues
>
> drivers/vdpa/virtio_pci/vp_vdpa.c | 35 +++++++++++++++++++------------
> 1 file changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index df5f4a3bccb5..cd3aeb3b8f21 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -160,22 +160,31 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> struct pci_dev *pdev = mdev->pci_dev;
> int i, ret, irq;
> int queues = vp_vdpa->queues;
> - int vectors = queues + 1;
> + int msix_vec, allocated_vectors = 0;
>
> - ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> - if (ret != vectors) {
> + for (i = 0; i < queues; i++) {
> + if (vp_vdpa->vring[i].cb.callback)
> + allocated_vectors++;
> + }
> + allocated_vectors = allocated_vectors + 1;
> +
> + ret = pci_alloc_irq_vectors(pdev, allocated_vectors, allocated_vectors,
> + PCI_IRQ_MSIX);
> + if (ret != allocated_vectors) {
> dev_err(&pdev->dev,
> "vp_vdpa: fail to allocate irq vectors want %d but %d\n",
> - vectors, ret);
> + allocated_vectors, ret);
> return ret;
> }
> -
> - vp_vdpa->vectors = vectors;
> + vp_vdpa->vectors = allocated_vectors;
>
> for (i = 0; i < queues; i++) {
> + if (!vp_vdpa->vring[i].cb.callback)
> + continue;
> +
> snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> - irq = pci_irq_vector(pdev, i);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq,
> vp_vdpa_vq_handler,
> 0, vp_vdpa->vring[i].msix_name,
> @@ -185,23 +194,23 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> "vp_vdpa: fail to request irq for vq %d\n", i);
> goto err;
> }
> - vp_modern_queue_vector(mdev, i, i);
> + vp_modern_queue_vector(mdev, i, msix_vec);
> vp_vdpa->vring[i].irq = irq;
> + msix_vec++;
> }
>
> snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> - pci_name(pdev));
> - irq = pci_irq_vector(pdev, queues);
> + pci_name(pdev));
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> vp_vdpa->msix_name, vp_vdpa);
> if (ret) {
> dev_err(&pdev->dev,
> - "vp_vdpa: fail to request irq for vq %d\n", i);
> + "vp_vdpa: fail to request irq for config\n");
> goto err;
> }
> - vp_modern_config_vector(mdev, queues);
> + vp_modern_config_vector(mdev, msix_vec);
> vp_vdpa->config_irq = irq;
> -

Unnecessary changes.

Others look good.

Acked-by: Jason Wang <[email protected]>

Thanks

> return 0;
> err:
> vp_vdpa_free_irq(vp_vdpa);
> --
> 2.43.0
>


2024-04-09 05:40:56

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH v3] vp_vdpa: fix the method of calculating vectors

better subject:

vp_vdpa: don't allocate unused msix vectors

to make it clear it's not a bugfix.




more comments below, but most importantly this
looks like it adds a bug.

On Tue, Apr 09, 2024 at 09:49:35AM +0800, lyx634449800 wrote:
> When there is a ctlq and it doesn't require interrupt
> callbacks,the original method of calculating vectors
> wastes hardware msi or msix resources as well as system
> IRQ resources.
>
> When conducting performance testing using testpmd in the
> guest os, it was found that the performance was lower compared
> to directly using vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does
> not utilize interrupts, the vdpa driver still configures
> the hardware's msix vector. Therefore, the hardware still
> sends interrupts to the host os. Because of this unnecessary
> action by the hardware, hardware performance decreases, and
> it also affects the performance of the host os.
>
> Before modification:(interrupt mode)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(interrupt mode)
> 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
>
> Before modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
>
> To verify the use of the virtio PMD mode in the guest operating
> system, the following patch needs to be applied to QEMU:
> https://lore.kernel.org/all/[email protected]
>
> Signed-off-by: lyx634449800 <[email protected]>


Bad S.O.B format. Should be

Signed-off-by: Real Name <email>


> ---
>
> V3: delete unused variables and add validation records
> V2: fix when allocating IRQs, scan all queues
>
> drivers/vdpa/virtio_pci/vp_vdpa.c | 35 +++++++++++++++++++------------
> 1 file changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index df5f4a3bccb5..cd3aeb3b8f21 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -160,22 +160,31 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> struct pci_dev *pdev = mdev->pci_dev;
> int i, ret, irq;
> int queues = vp_vdpa->queues;
> - int vectors = queues + 1;
> + int msix_vec, allocated_vectors = 0;


I would actually call allocated_vectors -> vectors, make the patch
smaller.

>
> - ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> - if (ret != vectors) {
> + for (i = 0; i < queues; i++) {
> + if (vp_vdpa->vring[i].cb.callback)
> + allocated_vectors++;
> + }
> + allocated_vectors = allocated_vectors + 1;

better:
allocated_vectors++; /* extra one for config */

> +
> + ret = pci_alloc_irq_vectors(pdev, allocated_vectors, allocated_vectors,
> + PCI_IRQ_MSIX);
> + if (ret != allocated_vectors) {
> dev_err(&pdev->dev,
> "vp_vdpa: fail to allocate irq vectors want %d but %d\n",
> - vectors, ret);
> + allocated_vectors, ret);
> return ret;
> }
> -
> - vp_vdpa->vectors = vectors;
> + vp_vdpa->vectors = allocated_vectors;
>
> for (i = 0; i < queues; i++) {
> + if (!vp_vdpa->vring[i].cb.callback)
> + continue;
> +
> snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> - irq = pci_irq_vector(pdev, i);
> + irq = pci_irq_vector(pdev, msix_vec);

using uninitialized msix_vec here?

I would expect compiler to warn about it.


pay attention to compiler warnings pls.


> ret = devm_request_irq(&pdev->dev, irq,
> vp_vdpa_vq_handler,
> 0, vp_vdpa->vring[i].msix_name,
> @@ -185,23 +194,23 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> "vp_vdpa: fail to request irq for vq %d\n", i);
> goto err;
> }
> - vp_modern_queue_vector(mdev, i, i);
> + vp_modern_queue_vector(mdev, i, msix_vec);
> vp_vdpa->vring[i].irq = irq;
> + msix_vec++;
> }
>
> snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> - pci_name(pdev));
> - irq = pci_irq_vector(pdev, queues);
> + pci_name(pdev));


don't move pci_name - don't make unrelated code changes.

> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> vp_vdpa->msix_name, vp_vdpa);
> if (ret) {
> dev_err(&pdev->dev,
> - "vp_vdpa: fail to request irq for vq %d\n", i);
> + "vp_vdpa: fail to request irq for config\n");

I would report ret here too.

> goto err;
> }
> - vp_modern_config_vector(mdev, queues);
> + vp_modern_config_vector(mdev, msix_vec);
> vp_vdpa->config_irq = irq;
> -

don't make unrelated code changes.


> return 0;
> err:
> vp_vdpa_free_irq(vp_vdpa);
> --
> 2.43.0


2024-04-09 08:58:43

by lyx634449800

[permalink] [raw]
Subject: [PATCH v4] vp_vdpa: don't allocate unused msix vectors

From: Yuxue Liu <[email protected]>

When there is a ctlq and it doesn't require interrupt
callbacks,the original method of calculating vectors
wastes hardware msi or msix resources as well as system
IRQ resources.

When conducting performance testing using testpmd in the
guest os, it was found that the performance was lower compared
to directly using vfio-pci to passthrough the device

In scenarios where the virtio device in the guest os does
not utilize interrupts, the vdpa driver still configures
the hardware's msix vector. Therefore, the hardware still
sends interrupts to the host os. Because of this unnecessary
action by the hardware, hardware performance decreases, and
it also affects the performance of the host os.

Before modification:(interrupt mode)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(interrupt mode)
32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config

Before modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config

To verify the use of the virtio PMD mode in the guest operating
system, the following patch needs to be applied to QEMU:
https://lore.kernel.org/all/[email protected]

Signed-off-by: Yuxue Liu <[email protected]>
Acked-by: Jason Wang <[email protected]>
---
V4: Update the title and assign values to uninitialized variables
V3: delete unused variables and add validation records
V2: fix when allocating IRQs, scan all queues

drivers/vdpa/virtio_pci/vp_vdpa.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index df5f4a3bccb5..74bc8adfc7e8 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -160,7 +160,14 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
struct pci_dev *pdev = mdev->pci_dev;
int i, ret, irq;
int queues = vp_vdpa->queues;
- int vectors = queues + 1;
+ int vectors = 0;
+ int msix_vec = 0;
+
+ for (i = 0; i < queues; i++) {
+ if (vp_vdpa->vring[i].cb.callback)
+ vectors++;
+ }
+ vectors++;

ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
if (ret != vectors) {
@@ -173,9 +180,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
vp_vdpa->vectors = vectors;

for (i = 0; i < queues; i++) {
+ if (!vp_vdpa->vring[i].cb.callback)
+ continue;
+
snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
"vp-vdpa[%s]-%d\n", pci_name(pdev), i);
- irq = pci_irq_vector(pdev, i);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq,
vp_vdpa_vq_handler,
0, vp_vdpa->vring[i].msix_name,
@@ -185,21 +195,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
"vp_vdpa: fail to request irq for vq %d\n", i);
goto err;
}
- vp_modern_queue_vector(mdev, i, i);
+ vp_modern_queue_vector(mdev, i, msix_vec);
vp_vdpa->vring[i].irq = irq;
+ msix_vec++;
}

snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
pci_name(pdev));
- irq = pci_irq_vector(pdev, queues);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
vp_vdpa->msix_name, vp_vdpa);
if (ret) {
dev_err(&pdev->dev,
- "vp_vdpa: fail to request irq for vq %d\n", i);
+ "vp_vdpa: fail to request irq for config, ret %d\n", ret);
goto err;
}
- vp_modern_config_vector(mdev, queues);
+ vp_modern_config_vector(mdev, msix_vec);
vp_vdpa->config_irq = irq;

return 0;
--
2.43.0


2024-04-09 09:31:16

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH v4] vp_vdpa: don't allocate unused msix vectors

Good and clear subject, I like it.

On Tue, Apr 09, 2024 at 04:58:18PM +0800, lyx634449800 wrote:
> From: Yuxue Liu <[email protected]>
>
> When there is a ctlq and it doesn't require interrupt
> callbacks,the original method of calculating vectors
> wastes hardware msi or msix resources as well as system
> IRQ resources.
>
> When conducting performance testing using testpmd in the
> guest os, it was found that the performance was lower compared
> to directly using vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does
> not utilize interrupts, the vdpa driver still configures
> the hardware's msix vector. Therefore, the hardware still
> sends interrupts to the host os. Because of this unnecessary
> action by the hardware, hardware performance decreases, and
> it also affects the performance of the host os.
>
> Before modification:(interrupt mode)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(interrupt mode)
> 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
>
> Before modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
>
> To verify the use of the virtio PMD mode in the guest operating
> system, the following patch needs to be applied to QEMU:
> https://lore.kernel.org/all/[email protected]
>
> Signed-off-by: Yuxue Liu <[email protected]>
> Acked-by: Jason Wang <[email protected]>

Much better, thanks!
A couple of small tweaks to polish it up and it'll be ready.

> ---
> V4: Update the title and assign values to uninitialized variables
> V3: delete unused variables and add validation records
> V2: fix when allocating IRQs, scan all queues
>
> drivers/vdpa/virtio_pci/vp_vdpa.c | 23 +++++++++++++++++------
> 1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index df5f4a3bccb5..74bc8adfc7e8 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -160,7 +160,14 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> struct pci_dev *pdev = mdev->pci_dev;
> int i, ret, irq;
> int queues = vp_vdpa->queues;
> - int vectors = queues + 1;
> + int vectors = 0;
> + int msix_vec = 0;
> +
> + for (i = 0; i < queues; i++) {
> + if (vp_vdpa->vring[i].cb.callback)
> + vectors++;
> + }
> + vectors++;


Actually even easier: int vectors = 1; and then we do not need
this last line.
Sorry I only noticed now.

>
> ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> if (ret != vectors) {
> @@ -173,9 +180,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> vp_vdpa->vectors = vectors;
>
> for (i = 0; i < queues; i++) {
> + if (!vp_vdpa->vring[i].cb.callback)
> + continue;
> +
> snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> - irq = pci_irq_vector(pdev, i);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq,
> vp_vdpa_vq_handler,
> 0, vp_vdpa->vring[i].msix_name,
> @@ -185,21 +195,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> "vp_vdpa: fail to request irq for vq %d\n", i);
> goto err;
> }
> - vp_modern_queue_vector(mdev, i, i);
> + vp_modern_queue_vector(mdev, i, msix_vec);
> vp_vdpa->vring[i].irq = irq;
> + msix_vec++;
> }
>
> snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> pci_name(pdev));
> - irq = pci_irq_vector(pdev, queues);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> vp_vdpa->msix_name, vp_vdpa);
> if (ret) {
> dev_err(&pdev->dev,
> - "vp_vdpa: fail to request irq for vq %d\n", i);
> + "vp_vdpa: fail to request irq for config, ret %d\n", ret);

As long as we are here let's fix the grammar, and there's no need to
say "ret":
"vp_vdpa: failed to request irq for config: %d\n", ret);


> goto err;
> }
> - vp_modern_config_vector(mdev, queues);
> + vp_modern_config_vector(mdev, msix_vec);
> vp_vdpa->config_irq = irq;
>
> return 0;
> --
> 2.43.0


2024-04-09 09:57:39

by Heng Qi

[permalink] [raw]
Subject: Re: [PATCH v4] vp_vdpa: don't allocate unused msix vectors



在 2024/4/9 下午4:58, lyx634449800 写道:
> From: Yuxue Liu <[email protected]>
>
> When there is a ctlq and it doesn't require interrupt
> callbacks,the original method of calculating vectors
> wastes hardware msi or msix resources as well as system
> IRQ resources.
>
> When conducting performance testing using testpmd in the
> guest os, it was found that the performance was lower compared
> to directly using vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does
> not utilize interrupts, the vdpa driver still configures
> the hardware's msix vector. Therefore, the hardware still
> sends interrupts to the host os. Because of this unnecessary
> action by the hardware, hardware performance decreases, and
> it also affects the performance of the host os.
>
> Before modification:(interrupt mode)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(interrupt mode)
> 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
>
> Before modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
>
> To verify the use of the virtio PMD mode in the guest operating
> system, the following patch needs to be applied to QEMU:
> https://lore.kernel.org/all/[email protected]
>
> Signed-off-by: Yuxue Liu <[email protected]>
> Acked-by: Jason Wang <[email protected]>
> ---
> V4: Update the title and assign values to uninitialized variables
> V3: delete unused variables and add validation records
> V2: fix when allocating IRQs, scan all queues
>
> drivers/vdpa/virtio_pci/vp_vdpa.c | 23 +++++++++++++++++------
> 1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index df5f4a3bccb5..74bc8adfc7e8 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -160,7 +160,14 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> struct pci_dev *pdev = mdev->pci_dev;
> int i, ret, irq;
> int queues = vp_vdpa->queues;
> - int vectors = queues + 1;
> + int vectors = 0;
> + int msix_vec = 0;
> +
> + for (i = 0; i < queues; i++) {
> + if (vp_vdpa->vring[i].cb.callback)
> + vectors++;
> + }
> + vectors++;
>
> ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> if (ret != vectors) {
> @@ -173,9 +180,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> vp_vdpa->vectors = vectors;
>
> for (i = 0; i < queues; i++) {
> + if (!vp_vdpa->vring[i].cb.callback)
> + continue;
> +
> snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> - irq = pci_irq_vector(pdev, i);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq,
> vp_vdpa_vq_handler,
> 0, vp_vdpa->vring[i].msix_name,
> @@ -185,21 +195,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> "vp_vdpa: fail to request irq for vq %d\n", i);
> goto err;
> }
> - vp_modern_queue_vector(mdev, i, i);
> + vp_modern_queue_vector(mdev, i, msix_vec);
> vp_vdpa->vring[i].irq = irq;
> + msix_vec++;
> }
>
> snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> pci_name(pdev));
> - irq = pci_irq_vector(pdev, queues);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> vp_vdpa->msix_name, vp_vdpa);
> if (ret) {
> dev_err(&pdev->dev,
> - "vp_vdpa: fail to request irq for vq %d\n", i);
> + "vp_vdpa: fail to request irq for config, ret %d\n", ret);
> goto err;
> }
> - vp_modern_config_vector(mdev, queues);
> + vp_modern_config_vector(mdev, msix_vec);
> vp_vdpa->config_irq = irq;
>
> return 0;

Reviewed-by: Heng Qi <[email protected]>

2024-04-10 03:31:15

by lyx634449800

[permalink] [raw]
Subject: [PATCH v5] vp_vdpa: don't allocate unused msix vectors

From: Yuxue Liu <[email protected]>

When there is a ctlq and it doesn't require interrupt
callbacks,the original method of calculating vectors
wastes hardware msi or msix resources as well as system
IRQ resources.

When conducting performance testing using testpmd in the
guest os, it was found that the performance was lower compared
to directly using vfio-pci to passthrough the device

In scenarios where the virtio device in the guest os does
not utilize interrupts, the vdpa driver still configures
the hardware's msix vector. Therefore, the hardware still
sends interrupts to the host os. Because of this unnecessary
action by the hardware, hardware performance decreases, and
it also affects the performance of the host os.

Before modification:(interrupt mode)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(interrupt mode)
32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config

Before modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config

To verify the use of the virtio PMD mode in the guest operating
system, the following patch needs to be applied to QEMU:
https://lore.kernel.org/all/[email protected]

Signed-off-by: Yuxue Liu <[email protected]>
Acked-by: Jason Wang <[email protected]>
Reviewed-by: Heng Qi <[email protected]>
---
V5: modify the description of the printout when an exception occurs
V4: update the title and assign values to uninitialized variables
V3: delete unused variables and add validation records
V2: fix when allocating IRQs, scan all queues

drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index df5f4a3bccb5..8de0224e9ec2 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
struct pci_dev *pdev = mdev->pci_dev;
int i, ret, irq;
int queues = vp_vdpa->queues;
- int vectors = queues + 1;
+ int vectors = 1;
+ int msix_vec = 0;
+
+ for (i = 0; i < queues; i++) {
+ if (vp_vdpa->vring[i].cb.callback)
+ vectors++;
+ }

ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
if (ret != vectors) {
@@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
vp_vdpa->vectors = vectors;

for (i = 0; i < queues; i++) {
+ if (!vp_vdpa->vring[i].cb.callback)
+ continue;
+
snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
"vp-vdpa[%s]-%d\n", pci_name(pdev), i);
- irq = pci_irq_vector(pdev, i);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq,
vp_vdpa_vq_handler,
0, vp_vdpa->vring[i].msix_name,
@@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
"vp_vdpa: fail to request irq for vq %d\n", i);
goto err;
}
- vp_modern_queue_vector(mdev, i, i);
+ vp_modern_queue_vector(mdev, i, msix_vec);
vp_vdpa->vring[i].irq = irq;
+ msix_vec++;
}

snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
pci_name(pdev));
- irq = pci_irq_vector(pdev, queues);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
vp_vdpa->msix_name, vp_vdpa);
if (ret) {
dev_err(&pdev->dev,
- "vp_vdpa: fail to request irq for vq %d\n", i);
+ "vp_vdpa: fail to request irq for config: %d\n", ret);
goto err;
}
- vp_modern_config_vector(mdev, queues);
+ vp_modern_config_vector(mdev, msix_vec);
vp_vdpa->config_irq = irq;

return 0;
--
2.43.0


2024-04-22 10:59:54

by Gavin Liu

[permalink] [raw]
Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors

Dear Michael,

I hope this email finds you well. I am reaching out to request your assistance in reviewing a patch.

The patch in question is titled "[PATCH v5] vp_vdpa: don't allocate unused msix vectors". I believe your expertise and insights would be invaluable in ensuring the quality and effectiveness of this patch.

Your feedback and review are highly appreciated. Please let me know if you have any questions or require further information.

Thank you for your time and consideration.

Best regards,
Yuxue Liu



-----Original Message-----
From: Gavin Liu
Sent: April 10, 2024 11:31
To: [email protected]; [email protected]
Cc: Angus Chen [email protected]; [email protected]; [email protected]; Gavin Liu [email protected]; [email protected]; Heng Qi [email protected]
Subject: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
From: Yuxue Liu <[email protected]>

When there is a ctlq and it doesn't require interrupt callbacks,the original method of calculating vectors wastes hardware msi or msix resources as well as system IRQ resources.

When conducting performance testing using testpmd in the guest os, it was found that the performance was lower compared to directly using vfio-pci to passthrough the device

In scenarios where the virtio device in the guest os does not utilize interrupts, the vdpa driver still configures the hardware's msix vector. Therefore, the hardware still sends interrupts to the host os. Because of this unnecessary action by the hardware, hardware performance decreases, and it also affects the performance of the host os.

Before modification:(interrupt mode)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(interrupt mode)
32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config

Before modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config

After modification:(virtio pmd mode for guest os)
32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config

To verify the use of the virtio PMD mode in the guest operating system, the following patch needs to be applied to QEMU:
https://lore.kernel.org/all/[email protected]

Signed-off-by: Yuxue Liu <[email protected]>
Acked-by: Jason Wang <[email protected]>
Reviewed-by: Heng Qi <[email protected]>
---
V5: modify the description of the printout when an exception occurs
V4: update the title and assign values to uninitialized variables
V3: delete unused variables and add validation records
V2: fix when allocating IRQs, scan all queues

drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index df5f4a3bccb5..8de0224e9ec2 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
struct pci_dev *pdev = mdev->pci_dev;
int i, ret, irq;
int queues = vp_vdpa->queues;
- int vectors = queues + 1;
+ int vectors = 1;
+ int msix_vec = 0;
+
+ for (i = 0; i < queues; i++) {
+ if (vp_vdpa->vring[i].cb.callback)
+ vectors++;
+ }

ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
if (ret != vectors) {
@@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
vp_vdpa->vectors = vectors;

for (i = 0; i < queues; i++) {
+ if (!vp_vdpa->vring[i].cb.callback)
+ continue;
+
snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
"vp-vdpa[%s]-%d\n", pci_name(pdev), i);
- irq = pci_irq_vector(pdev, i);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq,
vp_vdpa_vq_handler,
0, vp_vdpa->vring[i].msix_name, @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
"vp_vdpa: fail to request irq for vq %d\n", i);
goto err;
}
- vp_modern_queue_vector(mdev, i, i);
+ vp_modern_queue_vector(mdev, i, msix_vec);
vp_vdpa->vring[i].irq = irq;
+ msix_vec++;
}

snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
pci_name(pdev));
- irq = pci_irq_vector(pdev, queues);
+ irq = pci_irq_vector(pdev, msix_vec);
ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
vp_vdpa->msix_name, vp_vdpa);
if (ret) {
dev_err(&pdev->dev,
- "vp_vdpa: fail to request irq for vq %d\n", i);
+ "vp_vdpa: fail to request irq for config: %d\n", ret);
goto err;
}
- vp_modern_config_vector(mdev, queues);
+ vp_modern_config_vector(mdev, msix_vec);
vp_vdpa->config_irq = irq;

return 0;
--
2.43.0


2024-04-22 12:08:51

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors

On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> From: Yuxue Liu <[email protected]>
>
> When there is a ctlq and it doesn't require interrupt
> callbacks,the original method of calculating vectors
> wastes hardware msi or msix resources as well as system
> IRQ resources.
>
> When conducting performance testing using testpmd in the
> guest os, it was found that the performance was lower compared
> to directly using vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does
> not utilize interrupts, the vdpa driver still configures
> the hardware's msix vector. Therefore, the hardware still
> sends interrupts to the host os.

I just have a question on this part. How come hardware
sends interrupts does not guest driver disable them?

> Because of this unnecessary
> action by the hardware, hardware performance decreases, and
> it also affects the performance of the host os.
>
> Before modification:(interrupt mode)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(interrupt mode)
> 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
>
> Before modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
>
> To verify the use of the virtio PMD mode in the guest operating
> system, the following patch needs to be applied to QEMU:
> https://lore.kernel.org/all/[email protected]
>
> Signed-off-by: Yuxue Liu <[email protected]>
> Acked-by: Jason Wang <[email protected]>
> Reviewed-by: Heng Qi <[email protected]>
> ---
> V5: modify the description of the printout when an exception occurs
> V4: update the title and assign values to uninitialized variables
> V3: delete unused variables and add validation records
> V2: fix when allocating IRQs, scan all queues
>
> drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index df5f4a3bccb5..8de0224e9ec2 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> struct pci_dev *pdev = mdev->pci_dev;
> int i, ret, irq;
> int queues = vp_vdpa->queues;
> - int vectors = queues + 1;
> + int vectors = 1;
> + int msix_vec = 0;
> +
> + for (i = 0; i < queues; i++) {
> + if (vp_vdpa->vring[i].cb.callback)
> + vectors++;
> + }
>
> ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> if (ret != vectors) {
> @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> vp_vdpa->vectors = vectors;
>
> for (i = 0; i < queues; i++) {
> + if (!vp_vdpa->vring[i].cb.callback)
> + continue;
> +
> snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> - irq = pci_irq_vector(pdev, i);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq,
> vp_vdpa_vq_handler,
> 0, vp_vdpa->vring[i].msix_name,
> @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> "vp_vdpa: fail to request irq for vq %d\n", i);
> goto err;
> }
> - vp_modern_queue_vector(mdev, i, i);
> + vp_modern_queue_vector(mdev, i, msix_vec);
> vp_vdpa->vring[i].irq = irq;
> + msix_vec++;
> }
>
> snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> pci_name(pdev));
> - irq = pci_irq_vector(pdev, queues);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> vp_vdpa->msix_name, vp_vdpa);
> if (ret) {
> dev_err(&pdev->dev,
> - "vp_vdpa: fail to request irq for vq %d\n", i);
> + "vp_vdpa: fail to request irq for config: %d\n", ret);
> goto err;
> }
> - vp_modern_config_vector(mdev, queues);
> + vp_modern_config_vector(mdev, msix_vec);
> vp_vdpa->config_irq = irq;
>
> return 0;
> --
> 2.43.0


2024-04-23 01:39:35

by Gavin Liu

[permalink] [raw]
Subject: 回复: [PATCH v5] vp_vdpa: don't allocate unus ed msix vectors

On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> From: Yuxue Liu <[email protected]>
>
> When there is a ctlq and it doesn't require interrupt callbacks,the
> original method of calculating vectors wastes hardware msi or msix
> resources as well as system IRQ resources.
>
> When conducting performance testing using testpmd in the guest os, it
> was found that the performance was lower compared to directly using
> vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does not utilize
> interrupts, the vdpa driver still configures the hardware's msix
> vector. Therefore, the hardware still sends interrupts to the host os.

>I just have a question on this part. How come hardware sends interrupts does not guest driver disable them?

1??Assuming the guest OS's Virtio device is using PMD mode, QEMU sets the call fd to -1
2??On the host side, the vhost_vdpa program will set vp_vdpa->vring[i].cb.callback to invalid
3??Before the modification, the vp_vdpa_request_irq function does not check whether
vp_vdpa->vring[i].cb.callback is valid. Instead, it enables the hardware's MSIX
interrupts based on the number of queues of the device




----- Original Message -----
From: Michael S. Tsirkin [email protected]
Sent: April 22, 2024 20:09
To: Gavin Liu [email protected]
Cc: [email protected]; Angus Chen [email protected]; [email protected]; [email protected]; [email protected]; Heng Qi [email protected]
Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors



External Mail: This email originated from OUTSIDE of the organization!
Do not click links, open attachments or provide ANY information unless you recognize the sender and know the content is safe.


On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> From: Yuxue Liu <[email protected]>
>
> When there is a ctlq and it doesn't require interrupt callbacks,the
> original method of calculating vectors wastes hardware msi or msix
> resources as well as system IRQ resources.
>
> When conducting performance testing using testpmd in the guest os, it
> was found that the performance was lower compared to directly using
> vfio-pci to passthrough the device
>
> In scenarios where the virtio device in the guest os does not utilize
> interrupts, the vdpa driver still configures the hardware's msix
> vector. Therefore, the hardware still sends interrupts to the host os.

I just have a question on this part. How come hardware sends interrupts does not guest driver disable them?

> Because of this unnecessary
> action by the hardware, hardware performance decreases, and it also
> affects the performance of the host os.
>
> Before modification:(interrupt mode)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(interrupt mode)
> 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
>
> Before modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
>
> After modification:(virtio pmd mode for guest os)
> 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
>
> To verify the use of the virtio PMD mode in the guest operating
> system, the following patch needs to be applied to QEMU:
> https://lore.kernel.org/all/20240408073311.2049-1-yuxue.liu@jaguarmicr
> o.com
>
> Signed-off-by: Yuxue Liu <[email protected]>
> Acked-by: Jason Wang <[email protected]>
> Reviewed-by: Heng Qi <[email protected]>
> ---
> V5: modify the description of the printout when an exception occurs
> V4: update the title and assign values to uninitialized variables
> V3: delete unused variables and add validation records
> V2: fix when allocating IRQs, scan all queues
>
> drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c
> b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index df5f4a3bccb5..8de0224e9ec2 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> struct pci_dev *pdev = mdev->pci_dev;
> int i, ret, irq;
> int queues = vp_vdpa->queues;
> - int vectors = queues + 1;
> + int vectors = 1;
> + int msix_vec = 0;
> +
> + for (i = 0; i < queues; i++) {
> + if (vp_vdpa->vring[i].cb.callback)
> + vectors++;
> + }
>
> ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> if (ret != vectors) {
> @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> vp_vdpa->vectors = vectors;
>
> for (i = 0; i < queues; i++) {
> + if (!vp_vdpa->vring[i].cb.callback)
> + continue;
> +
> snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> - irq = pci_irq_vector(pdev, i);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq,
> vp_vdpa_vq_handler,
> 0, vp_vdpa->vring[i].msix_name,
> @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> "vp_vdpa: fail to request irq for vq %d\n", i);
> goto err;
> }
> - vp_modern_queue_vector(mdev, i, i);
> + vp_modern_queue_vector(mdev, i, msix_vec);
> vp_vdpa->vring[i].irq = irq;
> + msix_vec++;
> }
>
> snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> pci_name(pdev));
> - irq = pci_irq_vector(pdev, queues);
> + irq = pci_irq_vector(pdev, msix_vec);
> ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> vp_vdpa->msix_name, vp_vdpa);
> if (ret) {
> dev_err(&pdev->dev,
> - "vp_vdpa: fail to request irq for vq %d\n", i);
> + "vp_vdpa: fail to request irq for config: %d\n",
> + ret);
> goto err;
> }
> - vp_modern_config_vector(mdev, queues);
> + vp_modern_config_vector(mdev, msix_vec);
> vp_vdpa->config_irq = irq;
>
> return 0;
> --
> 2.43.0

2024-04-23 08:35:35

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: 回复 : [PATCH v5] vp_vdpa: don't allocate unused msix vectors

On Tue, Apr 23, 2024 at 01:39:17AM +0000, Gavin Liu wrote:
> On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > From: Yuxue Liu <[email protected]>
> >
> > When there is a ctlq and it doesn't require interrupt callbacks,the
> > original method of calculating vectors wastes hardware msi or msix
> > resources as well as system IRQ resources.
> >
> > When conducting performance testing using testpmd in the guest os, it
> > was found that the performance was lower compared to directly using
> > vfio-pci to passthrough the device
> >
> > In scenarios where the virtio device in the guest os does not utilize
> > interrupts, the vdpa driver still configures the hardware's msix
> > vector. Therefore, the hardware still sends interrupts to the host os.
>
> >I just have a question on this part. How come hardware sends interrupts does not guest driver disable them?
>
> 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU sets the call fd to -1
> 2:On the host side, the vhost_vdpa program will set vp_vdpa->vring[i].cb.callback to invalid
> 3:Before the modification, the vp_vdpa_request_irq function does not check whether
> vp_vdpa->vring[i].cb.callback is valid. Instead, it enables the hardware's MSIX
> interrupts based on the number of queues of the device
>

So MSIX is enabled but why would it trigger? virtio PMD in poll mode
presumably suppresses interrupts after all.

>
>
> ----- Original Message -----
> From: Michael S. Tsirkin [email protected]
> Sent: April 22, 2024 20:09
> To: Gavin Liu [email protected]
> Cc: [email protected]; Angus Chen [email protected]; [email protected]; [email protected]; [email protected]; Heng Qi [email protected]
> Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
>
>
>
> External Mail: This email originated from OUTSIDE of the organization!
> Do not click links, open attachments or provide ANY information unless you recognize the sender and know the content is safe.
>
>
> On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > From: Yuxue Liu <[email protected]>
> >
> > When there is a ctlq and it doesn't require interrupt callbacks,the
> > original method of calculating vectors wastes hardware msi or msix
> > resources as well as system IRQ resources.
> >
> > When conducting performance testing using testpmd in the guest os, it
> > was found that the performance was lower compared to directly using
> > vfio-pci to passthrough the device
> >
> > In scenarios where the virtio device in the guest os does not utilize
> > interrupts, the vdpa driver still configures the hardware's msix
> > vector. Therefore, the hardware still sends interrupts to the host os.
>
> I just have a question on this part. How come hardware sends interrupts does not guest driver disable them?
>
> > Because of this unnecessary
> > action by the hardware, hardware performance decreases, and it also
> > affects the performance of the host os.
> >
> > Before modification:(interrupt mode)
> > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> >
> > After modification:(interrupt mode)
> > 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
> >
> > Before modification:(virtio pmd mode for guest os)
> > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> >
> > After modification:(virtio pmd mode for guest os)
> > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
> >
> > To verify the use of the virtio PMD mode in the guest operating
> > system, the following patch needs to be applied to QEMU:
> > https://lore.kernel.org/all/20240408073311.2049-1-yuxue.liu@jaguarmicr
> > o.com
> >
> > Signed-off-by: Yuxue Liu <[email protected]>
> > Acked-by: Jason Wang <[email protected]>
> > Reviewed-by: Heng Qi <[email protected]>
> > ---
> > V5: modify the description of the printout when an exception occurs
> > V4: update the title and assign values to uninitialized variables
> > V3: delete unused variables and add validation records
> > V2: fix when allocating IRQs, scan all queues
> >
> > drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> > 1 file changed, 16 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > index df5f4a3bccb5..8de0224e9ec2 100644
> > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> > struct pci_dev *pdev = mdev->pci_dev;
> > int i, ret, irq;
> > int queues = vp_vdpa->queues;
> > - int vectors = queues + 1;
> > + int vectors = 1;
> > + int msix_vec = 0;
> > +
> > + for (i = 0; i < queues; i++) {
> > + if (vp_vdpa->vring[i].cb.callback)
> > + vectors++;
> > + }
> >
> > ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> > if (ret != vectors) {
> > @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> > vp_vdpa->vectors = vectors;
> >
> > for (i = 0; i < queues; i++) {
> > + if (!vp_vdpa->vring[i].cb.callback)
> > + continue;
> > +
> > snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
> > "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> > - irq = pci_irq_vector(pdev, i);
> > + irq = pci_irq_vector(pdev, msix_vec);
> > ret = devm_request_irq(&pdev->dev, irq,
> > vp_vdpa_vq_handler,
> > 0, vp_vdpa->vring[i].msix_name,
> > @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
> > "vp_vdpa: fail to request irq for vq %d\n", i);
> > goto err;
> > }
> > - vp_modern_queue_vector(mdev, i, i);
> > + vp_modern_queue_vector(mdev, i, msix_vec);
> > vp_vdpa->vring[i].irq = irq;
> > + msix_vec++;
> > }
> >
> > snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
> > pci_name(pdev));
> > - irq = pci_irq_vector(pdev, queues);
> > + irq = pci_irq_vector(pdev, msix_vec);
> > ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0,
> > vp_vdpa->msix_name, vp_vdpa);
> > if (ret) {
> > dev_err(&pdev->dev,
> > - "vp_vdpa: fail to request irq for vq %d\n", i);
> > + "vp_vdpa: fail to request irq for config: %d\n",
> > + ret);
> > goto err;
> > }
> > - vp_modern_config_vector(mdev, queues);
> > + vp_modern_config_vector(mdev, msix_vec);
> > vp_vdpa->config_irq = irq;
> >
> > return 0;
> > --
> > 2.43.0
>


2024-04-23 08:46:31

by Angus Chen

[permalink] [raw]
Subject: RE: 回复: [PATCH v5] vp_vdpa: don't allocat e unused msix vectors

Hi mst.

> -----Original Message-----
> From: Michael S. Tsirkin <[email protected]>
> Sent: Tuesday, April 23, 2024 4:35 PM
> To: Gavin Liu <[email protected]>
> Cc: [email protected]; Angus Chen <[email protected]>;
> [email protected]; [email protected];
> [email protected]; Heng Qi <[email protected]>
> Subject: Re: 回复: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
>
> On Tue, Apr 23, 2024 at 01:39:17AM +0000, Gavin Liu wrote:
> > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > From: Yuxue Liu <[email protected]>
> > >
> > > When there is a ctlq and it doesn't require interrupt callbacks,the
> > > original method of calculating vectors wastes hardware msi or msix
> > > resources as well as system IRQ resources.
> > >
> > > When conducting performance testing using testpmd in the guest os, it
> > > was found that the performance was lower compared to directly using
> > > vfio-pci to passthrough the device
> > >
> > > In scenarios where the virtio device in the guest os does not utilize
> > > interrupts, the vdpa driver still configures the hardware's msix
> > > vector. Therefore, the hardware still sends interrupts to the host os.
> >
> > >I just have a question on this part. How come hardware sends interrupts does
> not guest driver disable them?
> >
> > 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU sets
> the call fd to -1
> > 2:On the host side, the vhost_vdpa program will set
> vp_vdpa->vring[i].cb.callback to invalid
> > 3:Before the modification, the vp_vdpa_request_irq function does not
> check whether
> > vp_vdpa->vring[i].cb.callback is valid. Instead, it enables the
> hardware's MSIX
> > interrupts based on the number of queues of the device
> >
>
> So MSIX is enabled but why would it trigger? virtio PMD in poll mode
> presumably suppresses interrupts after all.
Virtio pmd is in the guest,but in host side,the msix is enabled,then the device will triger
Interrupt normally. I analysed this bug before,and I think gavin is right.
Did I make it clear?
>
> >
> >
> > ----- Original Message -----
> > From: Michael S. Tsirkin [email protected]
> > Sent: April 22, 2024 20:09
> > To: Gavin Liu [email protected]
> > Cc: [email protected]; Angus Chen [email protected];
> [email protected]; [email protected];
> [email protected]; Heng Qi [email protected]
> > Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
> >
> >
> >
> > External Mail: This email originated from OUTSIDE of the organization!
> > Do not click links, open attachments or provide ANY information unless you
> recognize the sender and know the content is safe.
> >
> >
> > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > From: Yuxue Liu <[email protected]>
> > >
> > > When there is a ctlq and it doesn't require interrupt callbacks,the
> > > original method of calculating vectors wastes hardware msi or msix
> > > resources as well as system IRQ resources.
> > >
> > > When conducting performance testing using testpmd in the guest os, it
> > > was found that the performance was lower compared to directly using
> > > vfio-pci to passthrough the device
> > >
> > > In scenarios where the virtio device in the guest os does not utilize
> > > interrupts, the vdpa driver still configures the hardware's msix
> > > vector. Therefore, the hardware still sends interrupts to the host os.
> >
> > I just have a question on this part. How come hardware sends interrupts does
> not guest driver disable them?
> >
> > > Because of this unnecessary
> > > action by the hardware, hardware performance decreases, and it also
> > > affects the performance of the host os.
> > >
> > > Before modification:(interrupt mode)
> > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > After modification:(interrupt mode)
> > > 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > Before modification:(virtio pmd mode for guest os)
> > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > After modification:(virtio pmd mode for guest os)
> > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > To verify the use of the virtio PMD mode in the guest operating
> > > system, the following patch needs to be applied to QEMU:
> > > https://lore.kernel.org/all/20240408073311.2049-1-yuxue.liu@jaguarmicr
> > > o.com
> > >
> > > Signed-off-by: Yuxue Liu <[email protected]>
> > > Acked-by: Jason Wang <[email protected]>
> > > Reviewed-by: Heng Qi <[email protected]>
> > > ---
> > > V5: modify the description of the printout when an exception occurs
> > > V4: update the title and assign values to uninitialized variables
> > > V3: delete unused variables and add validation records
> > > V2: fix when allocating IRQs, scan all queues
> > >
> > > drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> > > 1 file changed, 16 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > index df5f4a3bccb5..8de0224e9ec2 100644
> > > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> *vp_vdpa)
> > > struct pci_dev *pdev = mdev->pci_dev;
> > > int i, ret, irq;
> > > int queues = vp_vdpa->queues;
> > > - int vectors = queues + 1;
> > > + int vectors = 1;
> > > + int msix_vec = 0;
> > > +
> > > + for (i = 0; i < queues; i++) {
> > > + if (vp_vdpa->vring[i].cb.callback)
> > > + vectors++;
> > > + }
> > >
> > > ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> > > if (ret != vectors) {
> > > @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> *vp_vdpa)
> > > vp_vdpa->vectors = vectors;
> > >
> > > for (i = 0; i < queues; i++) {
> > > + if (!vp_vdpa->vring[i].cb.callback)
> > > + continue;
> > > +
> > > snprintf(vp_vdpa->vring[i].msix_name,
> VP_VDPA_NAME_SIZE,
> > > "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> > > - irq = pci_irq_vector(pdev, i);
> > > + irq = pci_irq_vector(pdev, msix_vec);
> > > ret = devm_request_irq(&pdev->dev, irq,
> > > vp_vdpa_vq_handler,
> > > 0,
> vp_vdpa->vring[i].msix_name,
> > > @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> *vp_vdpa)
> > > "vp_vdpa: fail to request irq for
> vq %d\n", i);
> > > goto err;
> > > }
> > > - vp_modern_queue_vector(mdev, i, i);
> > > + vp_modern_queue_vector(mdev, i, msix_vec);
> > > vp_vdpa->vring[i].irq = irq;
> > > + msix_vec++;
> > > }
> > >
> > > snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-config\n",
> > > pci_name(pdev));
> > > - irq = pci_irq_vector(pdev, queues);
> > > + irq = pci_irq_vector(pdev, msix_vec);
> > > ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler,
> 0,
> > > vp_vdpa->msix_name, vp_vdpa);
> > > if (ret) {
> > > dev_err(&pdev->dev,
> > > - "vp_vdpa: fail to request irq for vq %d\n", i);
> > > + "vp_vdpa: fail to request irq for config: %d\n",
> > > + ret);
> > > goto err;
> > > }
> > > - vp_modern_config_vector(mdev, queues);
> > > + vp_modern_config_vector(mdev, msix_vec);
> > > vp_vdpa->config_irq = irq;
> > >
> > > return 0;
> > > --
> > > 2.43.0
> >

2024-04-23 09:32:45

by Gavin Liu

[permalink] [raw]
Subject: 回复: 回复: [PATCH v5] vp_vdpa: don't all ocate unused msix vectors

> > When there is a ctlq and it doesn't require interrupt callbacks,the
> > original method of calculating vectors wastes hardware msi or msix
> > resources as well as system IRQ resources.
> >
> > When conducting performance testing using testpmd in the guest os,
> > it was found that the performance was lower compared to directly
> > using vfio-pci to passthrough the device
> >
> > In scenarios where the virtio device in the guest os does not
> > utilize interrupts, the vdpa driver still configures the hardware's
> > msix vector. Therefore, the hardware still sends interrupts to the host os.
>
> >I just have a question on this part. How come hardware sends interrupts does not guest driver disable them?
>
> 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU sets the call fd to -1
> 2:On the host side, the vhost_vdpa program will set vp_vdpa->vring[i].cb.callback to invalid
> 3:Before the modification, the vp_vdpa_request_irq function does not check whether
> vp_vdpa->vring[i].cb.callback is valid. Instead, it enables the hardware's MSIX
> interrupts based on the number of queues of the device
>

> So MSIX is enabled but why would it trigger? virtio PMD in poll mode presumably suppresses interrupts after all.

I didn't express the test model clearly. The testing model is as follows:
----testpmd---- ----testpmd---
^ ^
| |
| |
| |
v v
----vfio pci--- ---vfio pci---
----pci device --- --pci device--
----guest os ----- ----guest os ------


---virtio device-- ---vfio device--
------qemu------- ------qemu-------
^ ^
| |
| |
| |
v v
----vhost_vdpa---- ----vfio pci----
------------------------host os--------------------------
----------------------hw----------------------------
VF1 VF2
After the hardware completes DMA, it will still send an interrupt to the host OS.




-----Original Message-----
From: Angus Chen [email protected]
Sent: April 23, 2024 16:43
To: Michael S. Tsirkin [email protected]; Gavin Liu [email protected]
Cc: [email protected]; [email protected]; [email protected]; [email protected]; Heng Qi [email protected]
Subject: RE: Reply: [PATCH v5] vp_vdpa: don't allocate unused msix vectors


Hi mst.

> -----Original Message-----
> From: Michael S. Tsirkin <[email protected]>
> Sent: Tuesday, April 23, 2024 4:35 PM
> To: Gavin Liu <[email protected]>
> Cc: [email protected]; Angus Chen <[email protected]>;
> [email protected]; [email protected];
> [email protected]; Heng Qi <[email protected]>
> Subject: Re: 回复: [PATCH v5] vp_vdpa: don't allocate unused msix
> vectors
>
> On Tue, Apr 23, 2024 at 01:39:17AM +0000, Gavin Liu wrote:
> > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > From: Yuxue Liu <[email protected]>
> > >
> > > When there is a ctlq and it doesn't require interrupt
> > > callbacks,the original method of calculating vectors wastes
> > > hardware msi or msix resources as well as system IRQ resources.
> > >
> > > When conducting performance testing using testpmd in the guest os,
> > > it was found that the performance was lower compared to directly
> > > using vfio-pci to passthrough the device
> > >
> > > In scenarios where the virtio device in the guest os does not
> > > utilize interrupts, the vdpa driver still configures the
> > > hardware's msix vector. Therefore, the hardware still sends interrupts to the host os.
> >
> > >I just have a question on this part. How come hardware sends
> > >interrupts does
> not guest driver disable them?
> >
> > 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU
> > sets
> the call fd to -1
> > 2:On the host side, the vhost_vdpa program will set
> vp_vdpa->vring[i].cb.callback to invalid
> > 3:Before the modification, the vp_vdpa_request_irq function does
> > not
> check whether
> > vp_vdpa->vring[i].cb.callback is valid. Instead, it enables
> > the
> hardware's MSIX
> > interrupts based on the number of queues of the device
> >
>
> So MSIX is enabled but why would it trigger? virtio PMD in poll mode
> presumably suppresses interrupts after all.
Virtio pmd is in the guest,but in host side,the msix is enabled,then the device will triger Interrupt normally. I analysed this bug before,and I think gavin is right.
Did I make it clear?
>
> >
> >
> > ----- Original Message -----
> > From: Michael S. Tsirkin [email protected]
> > Sent: April 22, 2024 20:09
> > To: Gavin Liu [email protected]
> > Cc: [email protected]; Angus Chen [email protected];
> [email protected]; [email protected];
> [email protected]; Heng Qi [email protected]
> > Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
> >
> >
> >
> > External Mail: This email originated from OUTSIDE of the organization!
> > Do not click links, open attachments or provide ANY information
> > unless you
> recognize the sender and know the content is safe.
> >
> >
> > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > From: Yuxue Liu <[email protected]>
> > >
> > > When there is a ctlq and it doesn't require interrupt
> > > callbacks,the original method of calculating vectors wastes
> > > hardware msi or msix resources as well as system IRQ resources.
> > >
> > > When conducting performance testing using testpmd in the guest os,
> > > it was found that the performance was lower compared to directly
> > > using vfio-pci to passthrough the device
> > >
> > > In scenarios where the virtio device in the guest os does not
> > > utilize interrupts, the vdpa driver still configures the
> > > hardware's msix vector. Therefore, the hardware still sends interrupts to the host os.
> >
> > I just have a question on this part. How come hardware sends
> > interrupts does
> not guest driver disable them?
> >
> > > Because of this unnecessary
> > > action by the hardware, hardware performance decreases, and it
> > > also affects the performance of the host os.
> > >
> > > Before modification:(interrupt mode)
> > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > After modification:(interrupt mode)
> > > 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > Before modification:(virtio pmd mode for guest os)
> > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > After modification:(virtio pmd mode for guest os)
> > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
> > >
> > > To verify the use of the virtio PMD mode in the guest operating
> > > system, the following patch needs to be applied to QEMU:
> > > https://lore.kernel.org/all/20240408073311.2049-1-yuxue.liu@jaguar
> > > micr
> > > o.com
> > >
> > > Signed-off-by: Yuxue Liu <[email protected]>
> > > Acked-by: Jason Wang <[email protected]>
> > > Reviewed-by: Heng Qi <[email protected]>
> > > ---
> > > V5: modify the description of the printout when an exception
> > > occurs
> > > V4: update the title and assign values to uninitialized variables
> > > V3: delete unused variables and add validation records
> > > V2: fix when allocating IRQs, scan all queues
> > >
> > > drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> > > 1 file changed, 16 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > index df5f4a3bccb5..8de0224e9ec2 100644
> > > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> *vp_vdpa)
> > > struct pci_dev *pdev = mdev->pci_dev;
> > > int i, ret, irq;
> > > int queues = vp_vdpa->queues;
> > > - int vectors = queues + 1;
> > > + int vectors = 1;
> > > + int msix_vec = 0;
> > > +
> > > + for (i = 0; i < queues; i++) {
> > > + if (vp_vdpa->vring[i].cb.callback)
> > > + vectors++;
> > > + }
> > >
> > > ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> > > if (ret != vectors) {
> > > @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> *vp_vdpa)
> > > vp_vdpa->vectors = vectors;
> > >
> > > for (i = 0; i < queues; i++) {
> > > + if (!vp_vdpa->vring[i].cb.callback)
> > > + continue;
> > > +
> > > snprintf(vp_vdpa->vring[i].msix_name,
> VP_VDPA_NAME_SIZE,
> > > "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> > > - irq = pci_irq_vector(pdev, i);
> > > + irq = pci_irq_vector(pdev, msix_vec);
> > > ret = devm_request_irq(&pdev->dev, irq,
> > > vp_vdpa_vq_handler,
> > > 0,
> vp_vdpa->vring[i].msix_name,
> > > @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct
> > > vp_vdpa
> *vp_vdpa)
> > > "vp_vdpa: fail to request irq for
> vq %d\n", i);
> > > goto err;
> > > }
> > > - vp_modern_queue_vector(mdev, i, i);
> > > + vp_modern_queue_vector(mdev, i, msix_vec);
> > > vp_vdpa->vring[i].irq = irq;
> > > + msix_vec++;
> > > }
> > >
> > > snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE,
> "vp-vdpa[%s]-config\n",
> > > pci_name(pdev));
> > > - irq = pci_irq_vector(pdev, queues);
> > > + irq = pci_irq_vector(pdev, msix_vec);
> > > ret = devm_request_irq(&pdev->dev, irq,
> > > vp_vdpa_config_handler,
> 0,
> > > vp_vdpa->msix_name, vp_vdpa);
> > > if (ret) {
> > > dev_err(&pdev->dev,
> > > - "vp_vdpa: fail to request irq for vq %d\n", i);
> > > + "vp_vdpa: fail to request irq for config:
> > > + %d\n", ret);
> > > goto err;
> > > }
> > > - vp_modern_config_vector(mdev, queues);
> > > + vp_modern_config_vector(mdev, msix_vec);
> > > vp_vdpa->config_irq = irq;
> > >
> > > return 0;
> > > --
> > > 2.43.0
> >

2024-04-25 22:19:39

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: 回复 : [PATCH v5] vp_vdpa: don't allocate unused msix vectors

On Tue, Apr 23, 2024 at 08:42:57AM +0000, Angus Chen wrote:
> Hi mst.
>
> > -----Original Message-----
> > From: Michael S. Tsirkin <[email protected]>
> > Sent: Tuesday, April 23, 2024 4:35 PM
> > To: Gavin Liu <[email protected]>
> > Cc: [email protected]; Angus Chen <[email protected]>;
> > [email protected]; [email protected];
> > [email protected]; Heng Qi <[email protected]>
> > Subject: Re: 回复: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
> >
> > On Tue, Apr 23, 2024 at 01:39:17AM +0000, Gavin Liu wrote:
> > > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > > From: Yuxue Liu <[email protected]>
> > > >
> > > > When there is a ctlq and it doesn't require interrupt callbacks,the
> > > > original method of calculating vectors wastes hardware msi or msix
> > > > resources as well as system IRQ resources.
> > > >
> > > > When conducting performance testing using testpmd in the guest os, it
> > > > was found that the performance was lower compared to directly using
> > > > vfio-pci to passthrough the device
> > > >
> > > > In scenarios where the virtio device in the guest os does not utilize
> > > > interrupts, the vdpa driver still configures the hardware's msix
> > > > vector. Therefore, the hardware still sends interrupts to the host os.
> > >
> > > >I just have a question on this part. How come hardware sends interrupts does
> > not guest driver disable them?
> > >
> > > 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU sets
> > the call fd to -1
> > > 2:On the host side, the vhost_vdpa program will set
> > vp_vdpa->vring[i].cb.callback to invalid
> > > 3:Before the modification, the vp_vdpa_request_irq function does not
> > check whether
> > > vp_vdpa->vring[i].cb.callback is valid. Instead, it enables the
> > hardware's MSIX
> > > interrupts based on the number of queues of the device
> > >
> >
> > So MSIX is enabled but why would it trigger? virtio PMD in poll mode
> > presumably suppresses interrupts after all.
> Virtio pmd is in the guest,but in host side,the msix is enabled,then the device will triger
> Interrupt normally. I analysed this bug before,and I think gavin is right.
> Did I make it clear?

Not really. Guest disables interrupts presumably (it's polling)
why does device still send them?


> >
> > >
> > >
> > > ----- Original Message -----
> > > From: Michael S. Tsirkin [email protected]
> > > Sent: April 22, 2024 20:09
> > > To: Gavin Liu [email protected]
> > > Cc: [email protected]; Angus Chen [email protected];
> > [email protected]; [email protected];
> > [email protected]; Heng Qi [email protected]
> > > Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors
> > >
> > >
> > >
> > > External Mail: This email originated from OUTSIDE of the organization!
> > > Do not click links, open attachments or provide ANY information unless you
> > recognize the sender and know the content is safe.
> > >
> > >
> > > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > > From: Yuxue Liu <[email protected]>
> > > >
> > > > When there is a ctlq and it doesn't require interrupt callbacks,the
> > > > original method of calculating vectors wastes hardware msi or msix
> > > > resources as well as system IRQ resources.
> > > >
> > > > When conducting performance testing using testpmd in the guest os, it
> > > > was found that the performance was lower compared to directly using
> > > > vfio-pci to passthrough the device
> > > >
> > > > In scenarios where the virtio device in the guest os does not utilize
> > > > interrupts, the vdpa driver still configures the hardware's msix
> > > > vector. Therefore, the hardware still sends interrupts to the host os.
> > >
> > > I just have a question on this part. How come hardware sends interrupts does
> > not guest driver disable them?
> > >
> > > > Because of this unnecessary
> > > > action by the hardware, hardware performance decreases, and it also
> > > > affects the performance of the host os.
> > > >
> > > > Before modification:(interrupt mode)
> > > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > After modification:(interrupt mode)
> > > > 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > > 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > Before modification:(virtio pmd mode for guest os)
> > > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > After modification:(virtio pmd mode for guest os)
> > > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > To verify the use of the virtio PMD mode in the guest operating
> > > > system, the following patch needs to be applied to QEMU:
> > > > https://lore.kernel.org/all/20240408073311.2049-1-yuxue.liu@jaguarmicr
> > > > o.com
> > > >
> > > > Signed-off-by: Yuxue Liu <[email protected]>
> > > > Acked-by: Jason Wang <[email protected]>
> > > > Reviewed-by: Heng Qi <[email protected]>
> > > > ---
> > > > V5: modify the description of the printout when an exception occurs
> > > > V4: update the title and assign values to uninitialized variables
> > > > V3: delete unused variables and add validation records
> > > > V2: fix when allocating IRQs, scan all queues
> > > >
> > > > drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> > > > 1 file changed, 16 insertions(+), 6 deletions(-)
> > > >
> > > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > index df5f4a3bccb5..8de0224e9ec2 100644
> > > > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> > *vp_vdpa)
> > > > struct pci_dev *pdev = mdev->pci_dev;
> > > > int i, ret, irq;
> > > > int queues = vp_vdpa->queues;
> > > > - int vectors = queues + 1;
> > > > + int vectors = 1;
> > > > + int msix_vec = 0;
> > > > +
> > > > + for (i = 0; i < queues; i++) {
> > > > + if (vp_vdpa->vring[i].cb.callback)
> > > > + vectors++;
> > > > + }
> > > >
> > > > ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> > > > if (ret != vectors) {
> > > > @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> > *vp_vdpa)
> > > > vp_vdpa->vectors = vectors;
> > > >
> > > > for (i = 0; i < queues; i++) {
> > > > + if (!vp_vdpa->vring[i].cb.callback)
> > > > + continue;
> > > > +
> > > > snprintf(vp_vdpa->vring[i].msix_name,
> > VP_VDPA_NAME_SIZE,
> > > > "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> > > > - irq = pci_irq_vector(pdev, i);
> > > > + irq = pci_irq_vector(pdev, msix_vec);
> > > > ret = devm_request_irq(&pdev->dev, irq,
> > > > vp_vdpa_vq_handler,
> > > > 0,
> > vp_vdpa->vring[i].msix_name,
> > > > @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct vp_vdpa
> > *vp_vdpa)
> > > > "vp_vdpa: fail to request irq for
> > vq %d\n", i);
> > > > goto err;
> > > > }
> > > > - vp_modern_queue_vector(mdev, i, i);
> > > > + vp_modern_queue_vector(mdev, i, msix_vec);
> > > > vp_vdpa->vring[i].irq = irq;
> > > > + msix_vec++;
> > > > }
> > > >
> > > > snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE,
> > "vp-vdpa[%s]-config\n",
> > > > pci_name(pdev));
> > > > - irq = pci_irq_vector(pdev, queues);
> > > > + irq = pci_irq_vector(pdev, msix_vec);
> > > > ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler,
> > 0,
> > > > vp_vdpa->msix_name, vp_vdpa);
> > > > if (ret) {
> > > > dev_err(&pdev->dev,
> > > > - "vp_vdpa: fail to request irq for vq %d\n", i);
> > > > + "vp_vdpa: fail to request irq for config: %d\n",
> > > > + ret);
> > > > goto err;
> > > > }
> > > > - vp_modern_config_vector(mdev, queues);
> > > > + vp_modern_config_vector(mdev, msix_vec);
> > > > vp_vdpa->config_irq = irq;
> > > >
> > > > return 0;
> > > > --
> > > > 2.43.0
> > >
>


2024-04-26 03:13:06

by Gavin Liu

[permalink] [raw]
Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix vectors

Hi mst.

> > > >I just have a question on this part. How come hardware sends
> > > >interrupts does
> > not guest driver disable them?
> > >
> > > 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU
> > > sets
> > the call fd to -1
> > > 2:On the host side, the vhost_vdpa program will set
> > vp_vdpa->vring[i].cb.callback to invalid
> > > 3:Before the modification, the vp_vdpa_request_irq function
> > > does not
> > check whether
> > > vp_vdpa->vring[i].cb.callback is valid. Instead, it enables
> > > the
> > hardware's MSIX
> > > interrupts based on the number of queues of the device
> > >
> >
> > So MSIX is enabled but why would it trigger? virtio PMD in poll mode
> > presumably suppresses interrupts after all.
>> Virtio pmd is in the guest,but in host side,the msix is enabled,then
> >the device will triger Interrupt normally. I analysed this bug before,and I think gavin is right.
> >Did I make it clear?

>Not really. Guest disables interrupts presumably (it's polling) why does device still send them?

The testing model is as follows:
----testpmd---- ----testpmd---
^ ^
| |
| |
| |
v v
----vfio pci--- ---vfio pci---
----pci device --- --pci device--
----guest os ----- ----guest os ------


---virtio device-- ---vfio device--
------qemu------- ------qemu-------
^ ^
| |
| |
| |
v v
----vhost_vdpa---- ----vfio pci----
------------------------host os--------------------------
----------------------hw---------------------------------
VF1 VF2

1:The guest os uses PMD mode, so the guest os won't receive interrupts. We can reach a consensus on this point.

2:Note that the MSIX interrupts mentioned here refer to the interrupts received by PCI devices on the host from the hardware.

3:In the guest OS, Virtio devices use PMD mode. The host does not need to enable the MSIX capability of the PCI device,
nor does it need to register interrupt callbacks. Do you agree with this?

4: Note that the patch is proposed to ensure that PCI devices on the host are not disturbed by interrupts.



----- Forwarded Message -----
From: Michael S. Tsirkin [email protected]
Sent: April 26, 2024 6:10 AM
To: Angus Chen [email protected]
Cc: Gavin Liu [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Heng Qi [email protected]
Subject: Re: Reply: [PATCH v5] vp_vdpa: don't allocate unused msix vectors


External Mail: This email originated from OUTSIDE of the organization!
Do not click links, open attachments or provide ANY information unless you recognize the sender and know the content is safe.


On Tue, Apr 23, 2024 at 08:42:57AM +0000, Angus Chen wrote:
> Hi mst.
>
> > -----Original Message-----
> > From: Michael S. Tsirkin <[email protected]>
> > Sent: Tuesday, April 23, 2024 4:35 PM
> > To: Gavin Liu <[email protected]>
> > Cc: [email protected]; Angus Chen <[email protected]>;
> > [email protected]; [email protected];
> > [email protected]; Heng Qi <[email protected]>
> > Subject: Re: 回复: [PATCH v5] vp_vdpa: don't allocate unused msix
> > vectors
> >
> > On Tue, Apr 23, 2024 at 01:39:17AM +0000, Gavin Liu wrote:
> > > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > > From: Yuxue Liu <[email protected]>
> > > >
> > > > When there is a ctlq and it doesn't require interrupt
> > > > callbacks,the original method of calculating vectors wastes
> > > > hardware msi or msix resources as well as system IRQ resources.
> > > >
> > > > When conducting performance testing using testpmd in the guest
> > > > os, it was found that the performance was lower compared to
> > > > directly using vfio-pci to passthrough the device
> > > >
> > > > In scenarios where the virtio device in the guest os does not
> > > > utilize interrupts, the vdpa driver still configures the
> > > > hardware's msix vector. Therefore, the hardware still sends interrupts to the host os.
> > >
> > > >I just have a question on this part. How come hardware sends
> > > >interrupts does
> > not guest driver disable them?
> > >
> > > 1:Assuming the guest OS's Virtio device is using PMD mode, QEMU
> > > sets
> > the call fd to -1
> > > 2:On the host side, the vhost_vdpa program will set
> > vp_vdpa->vring[i].cb.callback to invalid
> > > 3:Before the modification, the vp_vdpa_request_irq function
> > > does not
> > check whether
> > > vp_vdpa->vring[i].cb.callback is valid. Instead, it enables
> > > the
> > hardware's MSIX
> > > interrupts based on the number of queues of the device
> > >
> >
> > So MSIX is enabled but why would it trigger? virtio PMD in poll mode
> > presumably suppresses interrupts after all.
> Virtio pmd is in the guest,but in host side,the msix is enabled,then
> the device will triger Interrupt normally. I analysed this bug before,and I think gavin is right.
> Did I make it clear?

Not really. Guest disables interrupts presumably (it's polling) why does device still send them?


> >
> > >
> > >
> > > ----- Original Message -----
> > > From: Michael S. Tsirkin [email protected]
> > > Sent: April 22, 2024 20:09
> > > To: Gavin Liu [email protected]
> > > Cc: [email protected]; Angus Chen [email protected];
> > [email protected]; [email protected];
> > [email protected]; Heng Qi [email protected]
> > > Subject: Re: [PATCH v5] vp_vdpa: don't allocate unused msix
> > > vectors
> > >
> > >
> > >
> > > External Mail: This email originated from OUTSIDE of the organization!
> > > Do not click links, open attachments or provide ANY information
> > > unless you
> > recognize the sender and know the content is safe.
> > >
> > >
> > > On Wed, Apr 10, 2024 at 11:30:20AM +0800, lyx634449800 wrote:
> > > > From: Yuxue Liu <[email protected]>
> > > >
> > > > When there is a ctlq and it doesn't require interrupt
> > > > callbacks,the original method of calculating vectors wastes
> > > > hardware msi or msix resources as well as system IRQ resources.
> > > >
> > > > When conducting performance testing using testpmd in the guest
> > > > os, it was found that the performance was lower compared to
> > > > directly using vfio-pci to passthrough the device
> > > >
> > > > In scenarios where the virtio device in the guest os does not
> > > > utilize interrupts, the vdpa driver still configures the
> > > > hardware's msix vector. Therefore, the hardware still sends interrupts to the host os.
> > >
> > > I just have a question on this part. How come hardware sends
> > > interrupts does
> > not guest driver disable them?
> > >
> > > > Because of this unnecessary
> > > > action by the hardware, hardware performance decreases, and it
> > > > also affects the performance of the host os.
> > > >
> > > > Before modification:(interrupt mode)
> > > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > After modification:(interrupt mode)
> > > > 32: 0 0 1 7 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > > 33: 36 0 3 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > Before modification:(virtio pmd mode for guest os)
> > > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-0
> > > > 33: 0 0 0 0 PCI-MSI 32769-edge vp-vdpa[0000:00:02.0]-1
> > > > 34: 0 0 0 0 PCI-MSI 32770-edge vp-vdpa[0000:00:02.0]-2
> > > > 35: 0 0 0 0 PCI-MSI 32771-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > After modification:(virtio pmd mode for guest os)
> > > > 32: 0 0 0 0 PCI-MSI 32768-edge vp-vdpa[0000:00:02.0]-config
> > > >
> > > > To verify the use of the virtio PMD mode in the guest operating
> > > > system, the following patch needs to be applied to QEMU:
> > > > https://lore.kernel.org/all/20240408073311.2049-1-yuxue.liu@jagu
> > > > armicr
> > > > o.com
> > > >
> > > > Signed-off-by: Yuxue Liu <[email protected]>
> > > > Acked-by: Jason Wang <[email protected]>
> > > > Reviewed-by: Heng Qi <[email protected]>
> > > > ---
> > > > V5: modify the description of the printout when an exception
> > > > occurs
> > > > V4: update the title and assign values to uninitialized
> > > > variables
> > > > V3: delete unused variables and add validation records
> > > > V2: fix when allocating IRQs, scan all queues
> > > >
> > > > drivers/vdpa/virtio_pci/vp_vdpa.c | 22 ++++++++++++++++------
> > > > 1 file changed, 16 insertions(+), 6 deletions(-)
> > > >
> > > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > index df5f4a3bccb5..8de0224e9ec2 100644
> > > > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> > > > @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct
> > > > vp_vdpa
> > *vp_vdpa)
> > > > struct pci_dev *pdev = mdev->pci_dev;
> > > > int i, ret, irq;
> > > > int queues = vp_vdpa->queues;
> > > > - int vectors = queues + 1;
> > > > + int vectors = 1;
> > > > + int msix_vec = 0;
> > > > +
> > > > + for (i = 0; i < queues; i++) {
> > > > + if (vp_vdpa->vring[i].cb.callback)
> > > > + vectors++;
> > > > + }
> > > >
> > > > ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
> > > > if (ret != vectors) {
> > > > @@ -173,9 +179,12 @@ static int vp_vdpa_request_irq(struct
> > > > vp_vdpa
> > *vp_vdpa)
> > > > vp_vdpa->vectors = vectors;
> > > >
> > > > for (i = 0; i < queues; i++) {
> > > > + if (!vp_vdpa->vring[i].cb.callback)
> > > > + continue;
> > > > +
> > > > snprintf(vp_vdpa->vring[i].msix_name,
> > VP_VDPA_NAME_SIZE,
> > > > "vp-vdpa[%s]-%d\n", pci_name(pdev), i);
> > > > - irq = pci_irq_vector(pdev, i);
> > > > + irq = pci_irq_vector(pdev, msix_vec);
> > > > ret = devm_request_irq(&pdev->dev, irq,
> > > > vp_vdpa_vq_handler,
> > > > 0,
> > vp_vdpa->vring[i].msix_name,
> > > > @@ -185,21 +194,22 @@ static int vp_vdpa_request_irq(struct
> > > > vp_vdpa
> > *vp_vdpa)
> > > > "vp_vdpa: fail to request irq for
> > vq %d\n", i);
> > > > goto err;
> > > > }
> > > > - vp_modern_queue_vector(mdev, i, i);
> > > > + vp_modern_queue_vector(mdev, i, msix_vec);
> > > > vp_vdpa->vring[i].irq = irq;
> > > > + msix_vec++;
> > > > }
> > > >
> > > > snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE,
> > "vp-vdpa[%s]-config\n",
> > > > pci_name(pdev));
> > > > - irq = pci_irq_vector(pdev, queues);
> > > > + irq = pci_irq_vector(pdev, msix_vec);
> > > > ret = devm_request_irq(&pdev->dev, irq,
> > > > vp_vdpa_config_handler,
> > 0,
> > > > vp_vdpa->msix_name, vp_vdpa);
> > > > if (ret) {
> > > > dev_err(&pdev->dev,
> > > > - "vp_vdpa: fail to request irq for vq %d\n", i);
> > > > + "vp_vdpa: fail to request irq for config:
> > > > + %d\n", ret);
> > > > goto err;
> > > > }
> > > > - vp_modern_config_vector(mdev, queues);
> > > > + vp_modern_config_vector(mdev, msix_vec);
> > > > vp_vdpa->config_irq = irq;
> > > >
> > > > return 0;
> > > > --
> > > > 2.43.0
> > >
>