mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +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
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @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);
|
||||
if (!qp)
|
||||
goto bail_swq;
|
||||
qp->allowed_ops = get_allowed_ops(init_attr->qp_type);
|
||||
|
||||
RCU_INIT_POINTER(qp->next, NULL);
|
||||
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;
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
||||
bail_ip:
|
||||
|
Loading…
Reference in New Issue
Block a user