RDMA/ucma: Mask QPN to be 24 bits according to IBTA
authorLeon Romanovsky <leonro@mellanox.com>
Wed, 12 Feb 2020 07:26:27 +0000 (09:26 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 13 Feb 2020 15:38:19 +0000 (11:38 -0400)
IBTA declares QPN as 24bits, mask input to ensure that kernel
doesn't get higher bits and ensure by adding WANR_ONCE() that
other CM users do the same.

Link: https://lore.kernel.org/r/20200212072635.682689-2-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/cm.c
drivers/infiniband/core/ucma.c

index 68cc1b2d68240dfb566f1552a4ff6081a52c192a..33c0d9e7bb66458bc1d9edd5552f59a00021c91c 100644 (file)
@@ -2188,6 +2188,9 @@ int ib_send_cm_rep(struct ib_cm_id *cm_id,
        cm_id_priv->initiator_depth = param->initiator_depth;
        cm_id_priv->responder_resources = param->responder_resources;
        cm_id_priv->rq_psn = cpu_to_be32(IBA_GET(CM_REP_STARTING_PSN, rep_msg));
+       WARN_ONCE(param->qp_num & 0xFF000000,
+                 "IBTA declares QPN to be 24 bits, but it is 0x%X\n",
+                 param->qp_num);
        cm_id_priv->local_qpn = cpu_to_be32(param->qp_num & 0xFFFFFF);
 
 out:   spin_unlock_irqrestore(&cm_id_priv->lock, flags);
index 0274e9b704be5930cedb52b2f9d036edec69b6bb..57e68491a2fd6a35e10c2dfd64daac2cb655f4c6 100644 (file)
@@ -1045,7 +1045,7 @@ static void ucma_copy_conn_param(struct rdma_cm_id *id,
        dst->retry_count = src->retry_count;
        dst->rnr_retry_count = src->rnr_retry_count;
        dst->srq = src->srq;
-       dst->qp_num = src->qp_num;
+       dst->qp_num = src->qp_num & 0xFFFFFF;
        dst->qkey = (id->route.addr.src_addr.ss_family == AF_IB) ? src->qkey : 0;
 }