vdpa/mlx5: fix live migration termination
authorMatan Azrad <matan@mellanox.com>
Fri, 24 Jul 2020 12:07:11 +0000 (12:07 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 29 Jul 2020 22:41:23 +0000 (00:41 +0200)
There are a lot of per virtq operations in the live migration
handling.

Before the driver support for queue update, when a virtq was not valid,
all the LM handling was terminated.

But now, when the driver supports queue update, the virtq can be invalid
as legal stage.

Skip invalid virtq in LM handling.

Fixes: c47d6e83334e ("vdpa/mlx5: support queue update")

Signed-off-by: Matan Azrad <matan@mellanox.com>
Acked-by: Xueming Li <xuemingl@mellanox.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/vdpa/mlx5/mlx5_vdpa_lm.c

index 460e01d..273c46f 100644 (file)
@@ -19,9 +19,13 @@ mlx5_vdpa_logging_enable(struct mlx5_vdpa_priv *priv, int enable)
 
        for (i = 0; i < priv->nr_virtqs; ++i) {
                attr.queue_index = i;
-               if (!priv->virtqs[i].virtq ||
-                   mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq, &attr)) {
-                       DRV_LOG(ERR, "Failed to modify virtq %d logging.", i);
+               if (!priv->virtqs[i].virtq) {
+                       DRV_LOG(DEBUG, "virtq %d is invalid for dirty bitmap "
+                               "enabling.", i);
+               } else if (mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq,
+                          &attr)) {
+                       DRV_LOG(ERR, "Failed to modify virtq %d for dirty "
+                               "bitmap enabling.", i);
                        return -1;
                }
        }
@@ -69,9 +73,11 @@ mlx5_vdpa_dirty_bitmap_set(struct mlx5_vdpa_priv *priv, uint64_t log_base,
        attr.dirty_bitmap_mkey = mr->mkey->id;
        for (i = 0; i < priv->nr_virtqs; ++i) {
                attr.queue_index = i;
-               if (!priv->virtqs[i].virtq ||
-                   mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq, &attr)) {
-                       DRV_LOG(ERR, "Failed to modify virtq %d for lm.", i);
+               if (!priv->virtqs[i].virtq) {
+                       DRV_LOG(DEBUG, "virtq %d is invalid for LM.", i);
+               } else if (mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq,
+                                                     &attr)) {
+                       DRV_LOG(ERR, "Failed to modify virtq %d for LM.", i);
                        goto err;
                }
        }
@@ -104,15 +110,15 @@ mlx5_vdpa_lm_log(struct mlx5_vdpa_priv *priv)
        if (!RTE_VHOST_NEED_LOG(features))
                return 0;
        for (i = 0; i < priv->nr_virtqs; ++i) {
-               if (priv->virtqs[i].virtq) {
+               if (!priv->virtqs[i].virtq) {
+                       DRV_LOG(DEBUG, "virtq %d is invalid for LM log.", i);
+               } else {
                        ret = mlx5_vdpa_virtq_stop(priv, i);
                        if (ret) {
-                               DRV_LOG(ERR, "Failed to stop virtq %d.", i);
+                               DRV_LOG(ERR, "Failed to stop virtq %d for LM "
+                                       "log.", i);
                                return -1;
                        }
-               } else {
-                       DRV_LOG(ERR, "virtq %d is not created.", i);
-                       return -1;
                }
                rte_vhost_log_used_vring(priv->vid, i, 0,
                              MLX5_VDPA_USED_RING_LEN(priv->virtqs[i].vq_size));