mirror of
https://github.com/torvalds/linux.git
synced 2024-12-09 04:31:39 +00:00
IB/rdmavt: Set QP allowed opcodes after QP allocation
Currently QP allowed_ops is set after the QP is completely initialized. This curtails the use of this optimization for any initialization before allowed_ops is set. Fix by adding a helper to determine the correct allowed_ops and moving the setting of the allowed_ops to just after QP allocation. Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
5136bfea7e
commit
fe2ac04712
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright(c) 2016 - 2018 Intel Corporation.
|
* Copyright(c) 2016 - 2019 Intel Corporation.
|
||||||
*
|
*
|
||||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||||
* redistributing this file, you may do so under either license.
|
* redistributing this file, you may do so under either license.
|
||||||
@ -968,6 +968,16 @@ static void rvt_free_qpn(struct rvt_qpn_table *qpt, u32 qpn)
|
|||||||
clear_bit(qpn & RVT_BITS_PER_PAGE_MASK, map->page);
|
clear_bit(qpn & RVT_BITS_PER_PAGE_MASK, map->page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_allowed_ops - Given a QP type return the appropriate allowed OP
|
||||||
|
* @type: valid, supported, QP type
|
||||||
|
*/
|
||||||
|
static u8 get_allowed_ops(enum ib_qp_type type)
|
||||||
|
{
|
||||||
|
return type == IB_QPT_RC ? IB_OPCODE_RC : type == IB_QPT_UC ?
|
||||||
|
IB_OPCODE_UC : IB_OPCODE_UD;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rvt_create_qp - create a queue pair for a device
|
* rvt_create_qp - create a queue pair for a device
|
||||||
* @ibpd: the protection domain who's device we create the queue pair for
|
* @ibpd: the protection domain who's device we create the queue pair for
|
||||||
@ -1050,6 +1060,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
|
|||||||
rdi->dparms.node);
|
rdi->dparms.node);
|
||||||
if (!qp)
|
if (!qp)
|
||||||
goto bail_swq;
|
goto bail_swq;
|
||||||
|
qp->allowed_ops = get_allowed_ops(init_attr->qp_type);
|
||||||
|
|
||||||
RCU_INIT_POINTER(qp->next, NULL);
|
RCU_INIT_POINTER(qp->next, NULL);
|
||||||
if (init_attr->qp_type == IB_QPT_RC) {
|
if (init_attr->qp_type == IB_QPT_RC) {
|
||||||
@ -1205,28 +1216,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
|
|||||||
|
|
||||||
ret = &qp->ibqp;
|
ret = &qp->ibqp;
|
||||||
|
|
||||||
/*
|
|
||||||
* We have our QP and its good, now keep track of what types of opcodes
|
|
||||||
* can be processed on this QP. We do this by keeping track of what the
|
|
||||||
* 3 high order bits of the opcode are.
|
|
||||||
*/
|
|
||||||
switch (init_attr->qp_type) {
|
|
||||||
case IB_QPT_SMI:
|
|
||||||
case IB_QPT_GSI:
|
|
||||||
case IB_QPT_UD:
|
|
||||||
qp->allowed_ops = IB_OPCODE_UD;
|
|
||||||
break;
|
|
||||||
case IB_QPT_RC:
|
|
||||||
qp->allowed_ops = IB_OPCODE_RC;
|
|
||||||
break;
|
|
||||||
case IB_QPT_UC:
|
|
||||||
qp->allowed_ops = IB_OPCODE_UC;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ret = ERR_PTR(-EINVAL);
|
|
||||||
goto bail_ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
bail_ip:
|
bail_ip:
|
||||||
|
Loading…
Reference in New Issue
Block a user