IB/rdmavt: Set QP allowed opcodes after QP allocation
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Fri, 28 Jun 2019 18:21:58 +0000 (14:21 -0400)
committerJason Gunthorpe <jgg@mellanox.com>
Sat, 29 Jun 2019 01:34:26 +0000 (22:34 -0300)
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>
drivers/infiniband/sw/rdmavt/qp.c

index 17e192a..b9035d9 100644 (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
  * redistributing this file, you may do so under either license.
@@ -969,6 +969,16 @@ static void rvt_free_qpn(struct rvt_qpn_table *qpt, u32 qpn)
 }
 
 /**
+ * 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
  * @init_attr: the attributes of the queue pair
@@ -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: