On 2023/2/3 18:38, Maxime Coquelin wrote:


On 1/28/23 04:06, Hao Chen wrote:
When 'virtio_is_Ready' returns 1, 'vdpa_dev->ops->dev_conf' will be
called, and the vdpa driver called 'rte_vhost_get_vhost_vring' to
get the vring addr info from 'vhost_devices->virtqueue[]'.
virtio_is_ready's nr_vring is VIRTIO_BUILTIN_NUM_VQS_TO_BE_READY(2),
multi-queue's nr_vring is greater than 2.
Only 'vhost_devices->virtqueue[0]' and 'vhost_devices->virtqueue[1]'
are obtained in the for loop. Other queues of multiple queues cannot
obtain the corresponding 'vhost_devices->virtqueue[i]', which will
cause 'vdpa_dev->ops->dev_conf' to obtain QEMU vring addr information
from 'vhost_devices->virtqueue[i]' failed.
Here, nr_ving is modified to dev->nr_vring, so that multiple queues
can obtain the corresponding 'vhost_devices->virtqueue[i]'.

Signed-off-by: Hao Chen <ch...@yusur.tech>
---
  lib/vhost/vhost_user.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c
index 9902ae9944..9249eafc06 100644
--- a/lib/vhost/vhost_user.c
+++ b/lib/vhost/vhost_user.c
@@ -1473,7 +1473,7 @@ virtio_is_ready(struct virtio_net *dev)
      if (dev->nr_vring < nr_vring)
          return 0;
  -    for (i = 0; i < nr_vring; i++) {
+    for (i = 0; i < dev->nr_vring; i++) {
          vq = dev->virtqueue[i];
            if (!vq_is_ready(dev, vq))

(reiterate my reply since the patch was posted twice, and I replied to
the one discarded in PW)

Nack.

We can start processing the vrings as soon as the first queue pair is
initialized. I think you may want to rely on
vdpa_dev->ops->set_vring_state to initialize other vrings.

Does this mean that the queue should be initialized and enabled in vdpa_dev->ops->set_vring_state, not in vdpa_dev->ops->dev_conf?
What is the vDPA driver/device affected by this issue?
After tracking the code, I found that the dpdk-vdpa example's log shows the calling order of multiple queues as follow:
"
VHOST_USER_SET_VRING_ADDR
VHOST_USER_SET_VRING_KICK
vdpa_dev->ops->set_vring_state  (vq_idx=0)
VHOST_USER_SET_VRING_CALL
vdpa_dev->ops->set_vring_state  (vq_idx=0)
...
VHOST_USER_SET_VRING_ADDR
VHOST_USER_SET_VRING_KICK
vdpa_dev->ops->set_vring_state  (vq_idx=1)
VHOST_USER_SET_VRING_CALL
vdpa_dev->ops->set_vring_state  (vq_idx=1)
"
then virtio_is_ready return 1, vdpa_dev->ops->dev_conf is called.
After that, other queues will call vdpa_dev->ops->set_vring_state (vq_idx=i)

The dev->virtqueue[]->desc/available/used is assigned in VHOST_USER_SET_VRING_KICK's translate_ring_addresses() , so vdpa driver should not initialize all queues in vdpa_dev->ops->dev_conf , otherwise other queue's dev->virtqueue[i]->desc/available/used are NULL , vring's hpa to gpa will fail by rte_vhost_get_vhost_vring(). dev->virtqueue[i]->desc/available/used should be accessed after queue(i)'s VHOST_USER_SET_VRING_KICK is called.

I see that all of ifc/sfc vdpa driver's queues acessed all queues's dev->virtqueue[i]->desc/available/used in vdpa_dev->ops->dev_conf, maybe they should move the code?

Regards,
Maxime

Reply via email to