Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

IB: Correct MR length field to be 64-bit

The ib_mr->length represents the length of the MR in bytes as per
the IBTA spec 1.3 section 11.2.10.3 (REGISTER PHYSICAL MEMORY REGION).

Currently ib_mr->length field is defined as only 32-bits field.
This might result into truncation and failed WRs of consumers who
registers more than 4GB bytes memory regions and whose WRs accessing
such MRs.

This patch makes the length 64-bit to avoid such truncation.

Cc: Sagi Grimberg <sagi@grimberg.me>
Cc: Chuck Lever <chuck.lever@oracle.com>
Cc: Faisal Latif <faisal.latif@intel.com>
Fixes: 4c67e2bfc8b7 ("IB/core: Introduce new fast registration API")
Signed-off-by: Ilya Lesokhin <ilyal@mellanox.com>
Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>

authored by

Parav Pandit and committed by
Doug Ledford
edd31551 73827a60

+5 -5
+2 -2
drivers/infiniband/hw/nes/nes_verbs.c
··· 3232 3232 mr->ibmr.iova); 3233 3233 set_wqe_32bit_value(wqe->wqe_words, 3234 3234 NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX, 3235 - mr->ibmr.length); 3235 + lower_32_bits(mr->ibmr.length)); 3236 3236 set_wqe_32bit_value(wqe->wqe_words, 3237 3237 NES_IWARP_SQ_FMR_WQE_LENGTH_HIGH_IDX, 0); 3238 3238 set_wqe_32bit_value(wqe->wqe_words, ··· 3274 3274 mr->npages * 8); 3275 3275 3276 3276 nes_debug(NES_DBG_IW_TX, "SQ_REG_MR: iova_start: %llx, " 3277 - "length: %d, rkey: %0x, pgl_paddr: %llx, " 3277 + "length: %lld, rkey: %0x, pgl_paddr: %llx, " 3278 3278 "page_list_len: %u, wqe_misc: %x\n", 3279 3279 (unsigned long long) mr->ibmr.iova, 3280 3280 mr->ibmr.length,
+1 -1
drivers/infiniband/ulp/iser/iser_memory.c
··· 154 154 { 155 155 int i; 156 156 157 - iser_err("page vec npages %d data length %d\n", 157 + iser_err("page vec npages %d data length %lld\n", 158 158 page_vec->npages, page_vec->fake_mr.length); 159 159 for (i = 0; i < page_vec->npages; i++) 160 160 iser_err("vec[%d]: %llx\n", i, page_vec->pages[i]);
+1 -1
include/rdma/ib_verbs.h
··· 1739 1739 u32 lkey; 1740 1740 u32 rkey; 1741 1741 u64 iova; 1742 - u32 length; 1742 + u64 length; 1743 1743 unsigned int page_size; 1744 1744 bool need_inval; 1745 1745 union {
+1 -1
net/sunrpc/xprtrdma/frwr_ops.c
··· 401 401 if (unlikely(n != mw->mw_nents)) 402 402 goto out_mapmr_err; 403 403 404 - dprintk("RPC: %s: Using frmr %p to map %u segments (%u bytes)\n", 404 + dprintk("RPC: %s: Using frmr %p to map %u segments (%llu bytes)\n", 405 405 __func__, frmr, mw->mw_nents, mr->length); 406 406 407 407 key = (u8)(mr->rkey & 0x000000FF);