vdpa/mlx5: workaround FW first completion in start
authorXueming Li <xuemingl@nvidia.com>
Fri, 15 Oct 2021 15:05:44 +0000 (23:05 +0800)
committerMaxime Coquelin <maxime.coquelin@redhat.com>
Thu, 21 Oct 2021 12:24:21 +0000 (14:24 +0200)
After a vDPA application restart, Qemu restores VQ with used and
available index, new incoming packet triggers virtio driver to
handle buffers. Under heavy traffic, no available buffer for
firmware to receive new packets, no Rx interrupts generated,
driver is stuck on endless interrupt waiting.

As a firmware workaround, this patch sends a notification after
VQ setup to ask driver handling buffers and filling new buffers.

Fixes: bff735011078 ("vdpa/mlx5: prepare virtio queues")
Cc: stable@dpdk.org
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: Matan Azrad <matan@nvidia.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/vdpa/mlx5/mlx5_vdpa_virtq.c

index cfd50d9..c5b357a 100644 (file)
@@ -4,6 +4,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/mman.h>
+#include <sys/eventfd.h>
 
 #include <rte_malloc.h>
 #include <rte_errno.h>
@@ -367,6 +368,9 @@ mlx5_vdpa_virtq_setup(struct mlx5_vdpa_priv *priv, int index)
                goto error;
        }
        virtq->stopped = false;
+       /* Initial notification to ask Qemu handling completed buffers. */
+       if (virtq->eqp.cq.callfd != -1)
+               eventfd_write(virtq->eqp.cq.callfd, (eventfd_t)1);
        DRV_LOG(DEBUG, "vid %u virtq %u was created successfully.", priv->vid,
                index);
        return 0;