From 40385cda7afbd62faf7de2e956f0c7f4fa1a3fed Mon Sep 17 00:00:00 2001 From: Alexey Lyashkov Date: Sun, 7 Jun 2020 20:27:18 -0400 Subject: [PATCH] LU-13181 o2ib: fix page mapping error IB DMA mapping can merge a physically continues page region into single one. It's confused a kiblnd_fmr_pool_map function who expect to see all fragments mapped. It's generate a error (o2iblnd.c:1926:kiblnd_fmr_pool_map()) Failed to map mr 1/16 elements By study an IB code, it looks ib_map_mr_sg return code should checked against of result of ib_dma_map_sg instead of original fragments count, same data should be used as argument of ib_map_mr_sg function. Test-Parameters: trivial Cray-bug-id: LUS-8139 Signed-off-by: Alexey Lyashkov Change-Id: I3b845ae54d8659d4045921f519effcf0a4428e49 Reviewed-on: https://review.whamcloud.com/37388 Reviewed-by: Shaun Tancheff Reviewed-by: Alexander Boyko Reviewed-by: James Simmons Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lnet/klnds/o2iblnd/o2iblnd.c | 8 ++++---- lnet/klnds/o2iblnd/o2iblnd_cb.c | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index 9e7f4db..4678424 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -1886,14 +1886,14 @@ again: #ifdef HAVE_IB_MAP_MR_SG #ifdef HAVE_IB_MAP_MR_SG_5ARGS n = ib_map_mr_sg(mr, tx->tx_frags, - tx->tx_nfrags, NULL, PAGE_SIZE); + rd->rd_nfrags, NULL, PAGE_SIZE); #else n = ib_map_mr_sg(mr, tx->tx_frags, - tx->tx_nfrags, PAGE_SIZE); + rd->rd_nfrags, PAGE_SIZE); #endif - if (unlikely(n != tx->tx_nfrags)) { + if (unlikely(n != rd->rd_nfrags)) { CERROR("Failed to map mr %d/%d " - "elements\n", n, tx->tx_nfrags); + "elements\n", n, rd->rd_nfrags); return n < 0 ? n : -EINVAL; } diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index b2d0427..0424a135 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -610,7 +610,8 @@ kiblnd_fmr_map_tx(struct kib_net *net, struct kib_tx *tx, fps = net->ibn_fmr_ps[cpt]; rc = kiblnd_fmr_pool_map(fps, tx, rd, nob, 0, &tx->tx_fmr); if (rc != 0) { - CERROR("Can't map %u pages: %d\n", nob, rc); + CERROR("Can't map %u bytes (%u/%u)s: %d\n", nob, + tx->tx_nfrags, rd->rd_nfrags, rc); return rc; } -- 1.8.3.1