lkml.org 
[lkml]   [2022]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 163/231] vdpa/mlx5: Initialize CVQ vringh only once
    Date
    From: Eli Cohen <elic@nvidia.com>

    [ Upstream commit ace9252446ec615cd79a5f77d90edb25c0b9d024 ]

    Currently, CVQ vringh is initialized inside setup_virtqueues() which is
    called every time a memory update is done. This is undesirable since it
    resets all the context of the vring, including the available and used
    indices.

    Move the initialization to mlx5_vdpa_set_status() when
    VIRTIO_CONFIG_S_DRIVER_OK is set.

    Signed-off-by: Eli Cohen <elic@nvidia.com>
    Message-Id: <20220613075958.511064-2-elic@nvidia.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Acked-by: Eugenio Pérez <eperezma@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/vdpa/mlx5/net/mlx5_vnet.c | 31 ++++++++++++++++++++-----------
    1 file changed, 20 insertions(+), 11 deletions(-)

    --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
    +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
    @@ -1965,7 +1965,6 @@ static int verify_driver_features(struct
    static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
    {
    struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
    - struct mlx5_control_vq *cvq = &mvdev->cvq;
    int err;
    int i;

    @@ -1975,16 +1974,6 @@ static int setup_virtqueues(struct mlx5_
    goto err_vq;
    }

    - if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)) {
    - err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
    - MLX5_CVQ_MAX_ENT, false,
    - (struct vring_desc *)(uintptr_t)cvq->desc_addr,
    - (struct vring_avail *)(uintptr_t)cvq->driver_addr,
    - (struct vring_used *)(uintptr_t)cvq->device_addr);
    - if (err)
    - goto err_vq;
    - }
    -
    return 0;

    err_vq:
    @@ -2257,6 +2246,21 @@ static void clear_vqs_ready(struct mlx5_
    ndev->mvdev.cvq.ready = false;
    }

    +static int setup_cvq_vring(struct mlx5_vdpa_dev *mvdev)
    +{
    + struct mlx5_control_vq *cvq = &mvdev->cvq;
    + int err = 0;
    +
    + if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ))
    + err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
    + MLX5_CVQ_MAX_ENT, false,
    + (struct vring_desc *)(uintptr_t)cvq->desc_addr,
    + (struct vring_avail *)(uintptr_t)cvq->driver_addr,
    + (struct vring_used *)(uintptr_t)cvq->device_addr);
    +
    + return err;
    +}
    +
    static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
    {
    struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
    @@ -2269,6 +2273,11 @@ static void mlx5_vdpa_set_status(struct

    if ((status ^ ndev->mvdev.status) & VIRTIO_CONFIG_S_DRIVER_OK) {
    if (status & VIRTIO_CONFIG_S_DRIVER_OK) {
    + err = setup_cvq_vring(mvdev);
    + if (err) {
    + mlx5_vdpa_warn(mvdev, "failed to setup control VQ vring\n");
    + goto err_setup;
    + }
    err = setup_driver(mvdev);
    if (err) {
    mlx5_vdpa_warn(mvdev, "failed to setup driver\n");

    \
     
     \ /
      Last update: 2022-07-19 15:06    [W:5.575 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site