mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-03 17:40:04 +00:00
IB/mlx5: Extend QP creation to get uar page index from user space
Extend QP creation to get uar page index from user space, this mode can be used with the UAR dynamic mode APIs to allocate/destroy a UAR object. As part of enabling this option blocked the weird/un-supported cross channel option which uses index 0 hard-coded. This QP flag wasn't exposed to user space as part of any formal upstream release, the dynamic option can allow having valid UAR page index instead. Link: https://lore.kernel.org/r/20200324060143.1569116-4-leon@kernel.org Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Reviewed-by: Michael Guralnik <michaelgur@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
64d99f6a62
commit
ac42a5ee92
2 changed files with 18 additions and 10 deletions
|
@ -919,6 +919,7 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
|||
void *qpc;
|
||||
int err;
|
||||
u16 uid;
|
||||
u32 uar_flags;
|
||||
|
||||
err = ib_copy_from_udata(&ucmd, udata, sizeof(ucmd));
|
||||
if (err) {
|
||||
|
@ -928,24 +929,29 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
|||
|
||||
context = rdma_udata_to_drv_context(udata, struct mlx5_ib_ucontext,
|
||||
ibucontext);
|
||||
if (ucmd.flags & MLX5_QP_FLAG_BFREG_INDEX) {
|
||||
uar_flags = ucmd.flags & (MLX5_QP_FLAG_UAR_PAGE_INDEX |
|
||||
MLX5_QP_FLAG_BFREG_INDEX);
|
||||
switch (uar_flags) {
|
||||
case MLX5_QP_FLAG_UAR_PAGE_INDEX:
|
||||
uar_index = ucmd.bfreg_index;
|
||||
bfregn = MLX5_IB_INVALID_BFREG;
|
||||
break;
|
||||
case MLX5_QP_FLAG_BFREG_INDEX:
|
||||
uar_index = bfregn_to_uar_index(dev, &context->bfregi,
|
||||
ucmd.bfreg_index, true);
|
||||
if (uar_index < 0)
|
||||
return uar_index;
|
||||
|
||||
bfregn = MLX5_IB_INVALID_BFREG;
|
||||
} else if (qp->flags & MLX5_IB_QP_CROSS_CHANNEL) {
|
||||
/*
|
||||
* TBD: should come from the verbs when we have the API
|
||||
*/
|
||||
/* In CROSS_CHANNEL CQ and QP must use the same UAR */
|
||||
bfregn = MLX5_CROSS_CHANNEL_BFREG;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
case 0:
|
||||
if (qp->flags & MLX5_IB_QP_CROSS_CHANNEL)
|
||||
return -EINVAL;
|
||||
bfregn = alloc_bfreg(dev, &context->bfregi);
|
||||
if (bfregn < 0)
|
||||
return bfregn;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mlx5_ib_dbg(dev, "bfregn 0x%x, uar_index 0x%x\n", bfregn, uar_index);
|
||||
|
@ -2100,6 +2106,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
|||
MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC |
|
||||
MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC |
|
||||
MLX5_QP_FLAG_TUNNEL_OFFLOADS |
|
||||
MLX5_QP_FLAG_UAR_PAGE_INDEX |
|
||||
MLX5_QP_FLAG_TYPE_DCI |
|
||||
MLX5_QP_FLAG_TYPE_DCT))
|
||||
return -EINVAL;
|
||||
|
|
|
@ -49,6 +49,7 @@ enum {
|
|||
MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC = 1 << 7,
|
||||
MLX5_QP_FLAG_ALLOW_SCATTER_CQE = 1 << 8,
|
||||
MLX5_QP_FLAG_PACKET_BASED_CREDIT_MODE = 1 << 9,
|
||||
MLX5_QP_FLAG_UAR_PAGE_INDEX = 1 << 10,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
Loading…
Reference in a new issue