lkml.org 
[lkml]   [2023]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH vhost v4 11/15] vdpa/mlx5: Mark vq addrs for modification in hw vq
    Date
    Addresses get set by .set_vq_address. hw vq addresses will be updated on
    next modify_virtqueue.

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

    Reviewed-by: Gal Pressman <gal@nvidia.com>
    Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
    ---
    drivers/vdpa/mlx5/net/mlx5_vnet.c | 17 ++++++++++++++++-
    include/linux/mlx5/mlx5_ifc_vdpa.h | 1 +
    2 files changed, 17 insertions(+), 1 deletion(-)

    diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
    index f8f088cced50..93812683c88c 100644
    --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
    +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
    @@ -1209,6 +1209,7 @@ static int modify_virtqueue(struct mlx5_vdpa_net *ndev,
    bool state_change = false;
    void *obj_context;
    void *cmd_hdr;
    + void *vq_ctx;
    void *in;
    int err;

    @@ -1230,6 +1231,7 @@ static int modify_virtqueue(struct mlx5_vdpa_net *ndev,
    MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);

    obj_context = MLX5_ADDR_OF(modify_virtio_net_q_in, in, obj_context);
    + vq_ctx = MLX5_ADDR_OF(virtio_net_q_object, obj_context, virtio_q_context);

    if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_STATE) {
    if (!is_valid_state_change(mvq->fw_state, state, is_resumable(ndev))) {
    @@ -1241,6 +1243,12 @@ static int modify_virtqueue(struct mlx5_vdpa_net *ndev,
    state_change = true;
    }

    + if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_ADDRS) {
    + MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr);
    + MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr);
    + MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
    + }
    +
    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)
    @@ -2202,6 +2210,7 @@ static int mlx5_vdpa_set_vq_address(struct vdpa_device *vdev, u16 idx, u64 desc_
    mvq->desc_addr = desc_area;
    mvq->device_addr = device_area;
    mvq->driver_addr = driver_area;
    + mvq->modified_fields |= MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_ADDRS;
    return 0;
    }

    @@ -2626,7 +2635,13 @@ static void unregister_link_notifier(struct mlx5_vdpa_net *ndev)

    static u64 mlx5_vdpa_get_backend_features(const struct vdpa_device *vdpa)
    {
    - return BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK);
    + u64 features = BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK);
    + struct mlx5_vdpa_dev *mvdev = to_mvdev(vdpa);
    +
    + if (MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, freeze_to_rdy_supported))
    + features |= BIT_ULL(VHOST_BACKEND_F_CHANGEABLE_VQ_ADDR_IN_SUSPEND);
    +
    + return features;
    }

    static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
    diff --git a/include/linux/mlx5/mlx5_ifc_vdpa.h b/include/linux/mlx5/mlx5_ifc_vdpa.h
    index b86d51a855f6..9594ac405740 100644
    --- a/include/linux/mlx5/mlx5_ifc_vdpa.h
    +++ b/include/linux/mlx5/mlx5_ifc_vdpa.h
    @@ -145,6 +145,7 @@ enum {
    MLX5_VIRTQ_MODIFY_MASK_STATE = (u64)1 << 0,
    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_DESC_GROUP_MKEY = (u64)1 << 14,
    };

    --
    2.43.0

    \
     
     \ /
      Last update: 2023-12-19 19:14    [W:8.297 / U:1.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site