RDMA/ucma: Mask QPN to be 24 bits according to IBTA
PATCH 1/1 RDMA/ucma: Mask QPN to be 24 bits according to IBTA
From: Leon Romanovsky <[email protected]>
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.
Fixes 75216638572f ("RDMA/cma: Export rdma cm interface to userspace")
Signed-off-by Leon Romanovsky <[email protected]>
---
Changelog:
v0 -> v1: https://lore.kernel.org/linux-rdma/[email protected]
* Squashed patch https://lore.kernel.org/linux-rdma/[email protected]
and https://lore.kernel.org/linux-rdma/[email protected]
--- drivers/infiniband/core/cm.c | 5 ++++- drivers/infiniband/core/ucma.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/core/cm.c +4 -1
@@ -2101,7 +2101,10 @@ 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 =cm_rep_get_starting_psn (rep_msg); - cm_id_priv->local_qpn =cpu_to_be32 (param->qp_num &0xFFFFFF ); +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); out:spin_unlock_irqrestore (&cm_id_priv->lock, flags);return ret;
drivers/infiniband/core/ucma.c +1 -1
@@ -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 ; }
--
2.20.1