static int modify_rqt()

in mlx5/net/mlx5_vnet.c [1281:1317]


static int modify_rqt(struct mlx5_vdpa_net *ndev, int num)
{
	__be32 *list;
	int max_rqt;
	void *rqtc;
	int inlen;
	void *in;
	int i, j;
	int err;

	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;

	inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + max_rqt * MLX5_ST_SZ_BYTES(rq_num);
	in = kzalloc(inlen, GFP_KERNEL);
	if (!in)
		return -ENOMEM;

	MLX5_SET(modify_rqt_in, in, uid, ndev->mvdev.res.uid);
	MLX5_SET64(modify_rqt_in, in, bitmask, MLX5_MODIFY_RQT_NUM_RQS);
	rqtc = MLX5_ADDR_OF(modify_rqt_in, in, ctx);
	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; i < max_rqt; i++, j += 2)
		list[i] = cpu_to_be32(ndev->vqs[j % num].virtq_id);

	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)
		return err;

	return 0;
}