vdpa/mlx5: Initialize and reset device with one queue pair
authorDragos Tatulea <dtatulea@nvidia.com>
Wed, 26 Jun 2024 10:26:43 +0000 (13:26 +0300)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 9 Jul 2024 12:42:44 +0000 (08:42 -0400)
The virtio spec says that a vdpa device should start off with one queue
pair. The driver is already compliant.

This patch moves the initialization to device add and reset times. This
is done in preparation for the pre-creation of hardware virtqueues at
device add time.

Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com>
Message-Id: <20240626-stage-vdpa-vq-precreate-v2-7-560c491078df@nvidia.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Eugenio Pérez <eperezma@redhat.com>
drivers/vdpa/mlx5/net/mlx5_vnet.c

index eca6f68c2edafd043178b8653da2d557cb332203..c8b5c87f001dbbec5d8e462c176d52648a21e9dd 100644 (file)
@@ -48,6 +48,16 @@ MODULE_LICENSE("Dual BSD/GPL");
 
 #define MLX5V_UNTAGGED 0x1000
 
+/* Device must start with 1 queue pair, as per VIRTIO v1.2 spec, section
+ * 5.1.6.5.5 "Device operation in multiqueue mode":
+ *
+ * Multiqueue is disabled by default.
+ * The driver enables multiqueue by sending a command using class
+ * VIRTIO_NET_CTRL_MQ. The command selects the mode of multiqueue
+ * operation, as follows: ...
+ */
+#define MLX5V_DEFAULT_VQ_COUNT 2
+
 struct mlx5_vdpa_cq_buf {
        struct mlx5_frag_buf_ctrl fbc;
        struct mlx5_frag_buf frag_buf;
@@ -2713,16 +2723,6 @@ static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
        else
                ndev->rqt_size = 1;
 
-       /* Device must start with 1 queue pair, as per VIRTIO v1.2 spec, section
-        * 5.1.6.5.5 "Device operation in multiqueue mode":
-        *
-        * Multiqueue is disabled by default.
-        * The driver enables multiqueue by sending a command using class
-        * VIRTIO_NET_CTRL_MQ. The command selects the mode of multiqueue
-        * operation, as follows: ...
-        */
-       ndev->cur_num_vqs = 2;
-
        update_cvq_info(mvdev);
        return err;
 }
@@ -3040,7 +3040,7 @@ static int mlx5_vdpa_compat_reset(struct vdpa_device *vdev, u32 flags)
                mlx5_vdpa_destroy_mr_resources(&ndev->mvdev);
        ndev->mvdev.status = 0;
        ndev->mvdev.suspended = false;
-       ndev->cur_num_vqs = 0;
+       ndev->cur_num_vqs = MLX5V_DEFAULT_VQ_COUNT;
        ndev->mvdev.cvq.received_desc = 0;
        ndev->mvdev.cvq.completed_desc = 0;
        memset(ndev->event_cbs, 0, sizeof(*ndev->event_cbs) * (mvdev->max_vqs + 1));
@@ -3643,6 +3643,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
                err = -ENOMEM;
                goto err_alloc;
        }
+       ndev->cur_num_vqs = MLX5V_DEFAULT_VQ_COUNT;
 
        init_mvqs(ndev);
        allocate_irqs(ndev);