]> git.droids-corp.org - dpdk.git/commitdiff
vdpa/mlx5: fix dead loop when process interrupted
authorXueming Li <xuemingl@nvidia.com>
Sun, 8 May 2022 14:25:49 +0000 (17:25 +0300)
committerMaxime Coquelin <maxime.coquelin@redhat.com>
Mon, 9 May 2022 19:39:58 +0000 (21:39 +0200)
In Ctrl+C handling, sometimes kick handling thread gets endless EGAIN
error and fall into dead lock.

Kick happens frequently in real system due to busy traffic or retry
mechanism. This patch simplifies kick firmware anyway and skip setting
hardware notifier due to potential device error, notifier could be set
in next successful kick request.

Fixes: 62c813706e41 ("vdpa/mlx5: map doorbell")
Cc: stable@dpdk.org
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/vdpa/mlx5/mlx5_vdpa_virtq.c

index 2e517beda2437f1576a6b079a14c93a39a9feabe..2696d54b4125f2c4c1ff778a3e74e4f87d554754 100644 (file)
@@ -23,11 +23,11 @@ mlx5_vdpa_virtq_kick_handler(void *cb_arg)
        struct mlx5_vdpa_priv *priv = virtq->priv;
        uint64_t buf;
        int nbytes;
+       int retry;
 
        if (rte_intr_fd_get(virtq->intr_handle) < 0)
                return;
-
-       do {
+       for (retry = 0; retry < 3; ++retry) {
                nbytes = read(rte_intr_fd_get(virtq->intr_handle), &buf,
                              8);
                if (nbytes < 0) {
@@ -39,7 +39,9 @@ mlx5_vdpa_virtq_kick_handler(void *cb_arg)
                                virtq->index, strerror(errno));
                }
                break;
-       } while (1);
+       }
+       if (nbytes < 0)
+               return;
        rte_write32(virtq->index, priv->virtq_db_addr);
        if (virtq->notifier_state == MLX5_VDPA_NOTIFIER_STATE_DISABLED) {
                if (rte_vhost_host_notifier_ctrl(priv->vid, virtq->index, true))