vdpa/mlx5: Mark vq state for modification in hw vq
authorDragos Tatulea <dtatulea@nvidia.com>
Mon, 25 Dec 2023 15:12:00 +0000 (17:12 +0200)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 10 Jan 2024 18:01:38 +0000 (13:01 -0500)
.set_vq_state will set the indices and mark the fields to be modified in
the hw vq.

Advertise that the device supports changing the vq state when the device
is in DRIVER_OK state and suspended.

Reviewed-by: Gal Pressman <gal@nvidia.com>
Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20231225151203.152687-6-dtatulea@nvidia.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/vdpa/mlx5/net/mlx5_vnet.c
include/linux/mlx5/mlx5_ifc_vdpa.h

index 80e066de08661a1fd035efd872d60edc91f7be31..d6c8506cec8f5a5953097bec8eaffa213d8aef6e 100644 (file)
@@ -1249,6 +1249,12 @@ static int modify_virtqueue(struct mlx5_vdpa_net *ndev,
                MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
        }
 
+       if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_AVAIL_IDX)
+               MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx);
+
+       if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_USED_IDX)
+               MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx);
+
        MLX5_SET64(virtio_net_q_object, obj_context, modify_field_select, mvq->modified_fields);
        err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
        if (err)
@@ -2328,6 +2334,8 @@ static int mlx5_vdpa_set_vq_state(struct vdpa_device *vdev, u16 idx,
 
        mvq->used_idx = state->split.avail_index;
        mvq->avail_idx = state->split.avail_index;
+       mvq->modified_fields |= MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_AVAIL_IDX |
+                               MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_USED_IDX;
        return 0;
 }
 
index 9594ac40574062fd76790a4721ae847cdd3712de..32e712106e684bf41f1e1379a77fdbffcc7136fd 100644 (file)
@@ -146,6 +146,8 @@ enum {
        MLX5_VIRTQ_MODIFY_MASK_DIRTY_BITMAP_PARAMS      = (u64)1 << 3,
        MLX5_VIRTQ_MODIFY_MASK_DIRTY_BITMAP_DUMP_ENABLE = (u64)1 << 4,
        MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_ADDRS           = (u64)1 << 6,
+       MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_AVAIL_IDX       = (u64)1 << 7,
+       MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_USED_IDX        = (u64)1 << 8,
        MLX5_VIRTQ_MODIFY_MASK_DESC_GROUP_MKEY          = (u64)1 << 14,
 };