Re: [PATCH 4/4] vdpa/mlx5: Fix tracking of current number of VQs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 12, 2022 at 11:12 AM Si-Wei Liu <si-wei.liu@xxxxxxxxxx> wrote:
>
>
>
> On 1/11/2022 6:29 PM, Jason Wang wrote:
> > On Wed, Jan 12, 2022 at 6:15 AM Si-Wei Liu <si-wei.liu@xxxxxxxxxx> wrote:
> >>
> >>
> >> On 1/11/2022 10:34 AM, Eli Cohen wrote:
> >>> Modify the code such that ndev->cur_num_vqs better reflects the actual
> >>> number of data virtqueues. The value can be accurately realized after
> >>> features have been negotiated.
> >>>
> >>> This is to prevent possible failures when modifying the RQT object if
> >>> the cur_num_vqs bears invalid value.
> >>>
> >>> No issue was actually encountered but this also makes the code more
> >>> readable.
> >>>
> >>> Fixes: c5a5cd3d3217 ("vdpa/mlx5: Support configuring max data virtqueue")
> >>> Signed-off-by: Eli Cohen <elic@xxxxxxxxxx>
> >>> ---
> >>>    drivers/vdpa/mlx5/net/mlx5_vnet.c | 12 ++++++++----
> >>>    1 file changed, 8 insertions(+), 4 deletions(-)
> >>>
> >>> diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> >>> index 9eacfdb48434..b53603d94082 100644
> >>> --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> >>> +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> >>> @@ -1246,8 +1246,7 @@ static int create_rqt(struct mlx5_vdpa_net *ndev)
> >>>        if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_MQ)))
> >>>                num = 1;
> >>>        else
> >>> -             num = mlx5vdpa16_to_cpu(&ndev->mvdev,
> >>> -                                     ndev->config.max_virtqueue_pairs);
> >>> +             num = ndev->cur_num_vqs / 2;
> >> Nit: the if branch can be consolidated
> >>
> >>>        max_rqt = min_t(int, roundup_pow_of_two(num),
> >>>                        1 << MLX5_CAP_GEN(ndev->mvdev.mdev, log_max_rqt_size));
> >>> @@ -1983,6 +1982,11 @@ static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
> >>>                return err;
> >>>
> >>>        ndev->mvdev.actual_features = features & ndev->mvdev.mlx_features;
> >>> +     if (ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_MQ))
> >>> +             ndev->cur_num_vqs = 2 * mlx5vdpa16_to_cpu(mvdev, ndev->config.max_virtqueue_pairs);
> >> Hmmm, not this patch, but there should've been validation done in the
> >> upper layer to guarantee set_featuers() for VIRTIO_NET_F_MQ always comes
> >> with VIRTIO_NET_F_CTRL_VQ. Maybe checking both: BIT_ULL(VIRTIO_NET_F_MQ)
> >> |  BIT_ULL(VIRTIO_NET_F_CTRL_VQ)?
> > So the upper layer is unaware of the device type. It's better to do
> > that in mlx5's set_features()
> That'll be fine. I thought the upper layer can be made device type aware
> and consolidate it to common library routines avoiding duplicated code
> in every individual driver of the same type.

This is possible but not implemented so far. It looks more like an
intermediate layer between vdpa and it's parent.

> If this is against the goal
> of making vdpa core device type agnostic, then it's perhaps not needed.

Yes, that's the goal when developing vDPA core.

Thanks

>
> -Siwei
>
> > according to the spec:
> >
> > The device MUST NOT offer a feature which requires another feature
> > which was not offered.
> >
> > Thanks
> >
> >> otherwise it looks good to me.
> >>
> >> Reviewed-by: Si-Wei Liu<si-wei.liu@xxxxxxxxxx>
> >>> +     else
> >>> +             ndev->cur_num_vqs = 2;
> >>> +
> >>>        update_cvq_info(mvdev);
> >>>        return err;
> >>>    }
> >>> @@ -2233,6 +2237,7 @@ static int mlx5_vdpa_reset(struct vdpa_device *vdev)
> >>>        clear_vqs_ready(ndev);
> >>>        mlx5_vdpa_destroy_mr(&ndev->mvdev);
> >>>        ndev->mvdev.status = 0;
> >>> +     ndev->cur_num_vqs = 0;
> >>>        memset(ndev->event_cbs, 0, sizeof(*ndev->event_cbs) * (mvdev->max_vqs + 1));
> >>>        ndev->mvdev.actual_features = 0;
> >>>        ++mvdev->generation;
> >>> @@ -2641,9 +2646,8 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
> >>>
> >>>        ndev->nb.notifier_call = event_handler;
> >>>        mlx5_notifier_register(mdev, &ndev->nb);
> >>> -     ndev->cur_num_vqs = 2 * mlx5_vdpa_max_qps(max_vqs);
> >>>        mvdev->vdev.mdev = &mgtdev->mgtdev;
> >>> -     err = _vdpa_register_device(&mvdev->vdev, ndev->cur_num_vqs + 1);
> >>> +     err = _vdpa_register_device(&mvdev->vdev, 2 * mlx5_vdpa_max_qps(max_vqs) + 1);
> >>>        if (err)
> >>>                goto err_reg;
> >>>
>

_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/virtualization



[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux