Thread (1 message) 1 message, 1 author, 2021-12-21

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

From: Jason Wang <hidden>
Date: 2021-12-21 05:49:06

On Sun, Dec 19, 2021 at 10:03 PM Eli Cohen [off-list ref] 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 <redacted>
Signed-off-by: Eli Cohen <redacted>
---
Acked-by: Jason Wang <redacted>
quoted hunk
 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@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help