Re: [PATCH v3 02/10] vdpa/mlx5: Distribute RX virtqueues in RQT object

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

 



On Sun, Dec 19, 2021 at 10:03 PM Eli Cohen <elic@xxxxxxxxxx> wrote:
>
> Distribute the available rx virtqueues amongst the available RQT
> entries.
>
> RQTs require to have a power of two entries. When creating or modifying
> the RQT, use the lowest number of power of two entries that is not less
> than the number of rx virtqueues. Distribute them in the available
> entries such that some virtqueus may be referenced twice.
>
> This allows to configure any number of virtqueue pairs when multiqueue
> is used.
>
> Reviewed-by: Si-Wei Liu <si-wei.liu@xxxxxxxxxx>
> Signed-off-by: Eli Cohen <elic@xxxxxxxxxx>
> ---

Acked-by: Jason Wang <jasowang@xxxxxxxxxx>

>  drivers/vdpa/mlx5/net/mlx5_vnet.c | 30 +++++++-----------------------
>  1 file changed, 7 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> index 14b972360a1a..98aed4b36c3f 100644
> --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> @@ -1261,17 +1261,10 @@ static int create_rqt(struct mlx5_vdpa_net *ndev)
>         MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
>         MLX5_SET(rqtc, rqtc, rqt_max_size, max_rqt);
>         list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
> -       for (i = 0, j = 0; j < max_rqt; j++) {
> -               if (!ndev->vqs[j].initialized)
> -                       continue;
> -
> -               if (!vq_is_tx(ndev->vqs[j].index)) {
> -                       list[i] = cpu_to_be32(ndev->vqs[j].virtq_id);
> -                       i++;
> -               }
> -       }
> -       MLX5_SET(rqtc, rqtc, rqt_actual_size, i);
> +       for (i = 0, j = 0; i < max_rqt; i++, j += 2)
> +               list[i] = cpu_to_be32(ndev->vqs[j % ndev->mvdev.max_vqs].virtq_id);
>
> +       MLX5_SET(rqtc, rqtc, rqt_actual_size, max_rqt);
>         err = mlx5_vdpa_create_rqt(&ndev->mvdev, in, inlen, &ndev->res.rqtn);
>         kfree(in);
>         if (err)
> @@ -1292,7 +1285,7 @@ static int modify_rqt(struct mlx5_vdpa_net *ndev, int num)
>         int i, j;
>         int err;
>
> -       max_rqt = min_t(int, ndev->cur_num_vqs / 2,
> +       max_rqt = min_t(int, roundup_pow_of_two(ndev->cur_num_vqs / 2),
>                         1 << MLX5_CAP_GEN(ndev->mvdev.mdev, log_max_rqt_size));
>         if (max_rqt < 1)
>                 return -EOPNOTSUPP;
> @@ -1308,16 +1301,10 @@ static int modify_rqt(struct mlx5_vdpa_net *ndev, int num)
>         MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
>
>         list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
> -       for (i = 0, j = 0; j < num; j++) {
> -               if (!ndev->vqs[j].initialized)
> -                       continue;
> +       for (i = 0, j = 0; i < max_rqt; i++, j += 2)
> +               list[i] = cpu_to_be32(ndev->vqs[j % num].virtq_id);
>
> -               if (!vq_is_tx(ndev->vqs[j].index)) {
> -                       list[i] = cpu_to_be32(ndev->vqs[j].virtq_id);
> -                       i++;
> -               }
> -       }
> -       MLX5_SET(rqtc, rqtc, rqt_actual_size, i);
> +       MLX5_SET(rqtc, rqtc, rqt_actual_size, max_rqt);
>         err = mlx5_vdpa_modify_rqt(&ndev->mvdev, in, inlen, ndev->res.rqtn);
>         kfree(in);
>         if (err)
> @@ -1581,9 +1568,6 @@ static virtio_net_ctrl_ack handle_ctrl_mq(struct mlx5_vdpa_dev *mvdev, u8 cmd)
>                         break;
>                 }
>
> -               if (newqps & (newqps - 1))
> -                       break;
> -
>                 if (!change_num_qps(mvdev, newqps))
>                         status = VIRTIO_NET_OK;
>
> --
> 2.34.1
>

_______________________________________________
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