diff options
author | Ira Weiny <ira.weiny@intel.com> | 2013-12-18 11:41:37 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-01-23 02:16:47 -0500 |
commit | 6e0ea9e6cbcead7fa8c76e3e3b9de4a50c5131c5 (patch) | |
tree | f2f264e46d106a132de85286b17177d62cb2c9ac /drivers/infiniband/hw | |
parent | 7e22e91102c6b9df7c4ae2168910e19d2bb14cd6 (diff) |
IB/qib: Fix QP check when looping back to/from QP1
The GSI QP type is compatible with and should be allowed to send data
to/from any UD QP. This was found when testing ibacm on the same node
as an SA.
Cc: <stable@vger.kernel.org>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_ud.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/qib/qib_ud.c b/drivers/infiniband/hw/qib/qib_ud.c index d6c7fe7f88d5..3ad651c3356c 100644 --- a/drivers/infiniband/hw/qib/qib_ud.c +++ b/drivers/infiniband/hw/qib/qib_ud.c | |||
@@ -57,13 +57,20 @@ static void qib_ud_loopback(struct qib_qp *sqp, struct qib_swqe *swqe) | |||
57 | struct qib_sge *sge; | 57 | struct qib_sge *sge; |
58 | struct ib_wc wc; | 58 | struct ib_wc wc; |
59 | u32 length; | 59 | u32 length; |
60 | enum ib_qp_type sqptype, dqptype; | ||
60 | 61 | ||
61 | qp = qib_lookup_qpn(ibp, swqe->wr.wr.ud.remote_qpn); | 62 | qp = qib_lookup_qpn(ibp, swqe->wr.wr.ud.remote_qpn); |
62 | if (!qp) { | 63 | if (!qp) { |
63 | ibp->n_pkt_drops++; | 64 | ibp->n_pkt_drops++; |
64 | return; | 65 | return; |
65 | } | 66 | } |
66 | if (qp->ibqp.qp_type != sqp->ibqp.qp_type || | 67 | |
68 | sqptype = sqp->ibqp.qp_type == IB_QPT_GSI ? | ||
69 | IB_QPT_UD : sqp->ibqp.qp_type; | ||
70 | dqptype = qp->ibqp.qp_type == IB_QPT_GSI ? | ||
71 | IB_QPT_UD : qp->ibqp.qp_type; | ||
72 | |||
73 | if (dqptype != sqptype || | ||
67 | !(ib_qib_state_ops[qp->state] & QIB_PROCESS_RECV_OK)) { | 74 | !(ib_qib_state_ops[qp->state] & QIB_PROCESS_RECV_OK)) { |
68 | ibp->n_pkt_drops++; | 75 | ibp->n_pkt_drops++; |
69 | goto drop; | 76 | goto drop; |