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:
Michael J. Ruhl 2019-06-28 14:21:58 -04:00 committed by Jason Gunthorpe
parent 5136bfea7e
commit fe2ac04712

View File

@ -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: