Si-Wei Liu
2021-Dec-09 00:12 UTC
[PATCH v1 2/7] vdpa/mlx5: Distribute RX virtqueues in RQT object
On 12/8/2021 12:14 PM, Eli Cohen 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. > > Signed-off-by: Eli Cohen <elic at nvidia.com> > --- > 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 ce2e13135dd8..e1a8a790f213 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;Why the !initialized check is dropped from the new code?> - > - 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;Ditto. -Siwei> + 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; >