From 5a9995103f7ad7e3a8974ebb81848c0bfa82259d Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Thu, 12 Oct 2023 15:55:58 -0700 Subject: [PATCH] LU-17189 o2ib: assign tx_gpu properly tx_gpu is not assigned or initialized properly. Test-Parameters: trivial Fixes: f792297212 ("LU-16211 o2iblnd: Avoid NULL md deref") Signed-off-by: Jinshan Xiong Change-Id: I5e14d66f41f6194203fec7832493efd432b54c36 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52702 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Andrew Perepechko Reviewed-by: Oleg Drokin --- lnet/include/lnet/lib-types.h | 5 +++++ lnet/klnds/o2iblnd/o2iblnd_cb.c | 11 ++++++----- lnet/lnet/lib-move.c | 2 +- lnet/lnet/lnet_rdma.c | 21 +++++++-------------- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index bc8a8d0..a02eab2 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -238,6 +238,11 @@ struct lnet_libmd { #define LNET_MD_FLAG_DISCARD BIT(4) #define LNET_MD_FLAG_GPU BIT(5) /**< Special mapping needs */ +static inline bool lnet_md_is_gpu(struct lnet_libmd *md) +{ + return (md != NULL) && !!(md->md_flags & LNET_MD_FLAG_GPU); +} + struct lnet_test_peer { /* info about peers we are trying to fail */ struct list_head tp_list; /* ln_test_peers */ diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index 85dc9dd..7b740ef 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -139,6 +139,7 @@ kiblnd_get_idle_tx(struct lnet_ni *ni, lnet_nid_t target) LASSERT (tx->tx_lntmsg[1] == NULL); LASSERT (tx->tx_nfrags == 0); + tx->tx_gpu = 0; tx->tx_gaps = false; tx->tx_hstatus = LNET_MSG_STATUS_OK; @@ -767,7 +768,8 @@ static int kiblnd_setup_rd_kiov(struct lnet_ni *ni, struct kib_tx *tx, int max_nkiov; int sg_count = 0; - CDEBUG(D_NET, "niov %d offset %d nob %d\n", nkiov, offset, nob); + CDEBUG(D_NET, "niov %d offset %d nob %d gpu %d\n", + nkiov, offset, nob, tx->tx_gpu); LASSERT(nob > 0); LASSERT(nkiov > 0); @@ -1715,7 +1717,7 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) return -ENOMEM; } ibmsg = tx->tx_msg; - gpu = msg_md ? (msg_md->md_flags & LNET_MD_FLAG_GPU) : false; + gpu = lnet_md_is_gpu(msg_md); switch (type) { default: @@ -1873,8 +1875,7 @@ kiblnd_reply(struct lnet_ni *ni, struct kib_rx *rx, struct lnet_msg *lntmsg) goto failed_0; } - - tx->tx_gpu = msg_md ? (msg_md->md_flags & LNET_MD_FLAG_GPU) : 0; + tx->tx_gpu = lnet_md_is_gpu(msg_md); if (nob == 0) rc = 0; @@ -1992,7 +1993,7 @@ kiblnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, break; } - tx->tx_gpu = msg_md ? (msg_md->md_flags & LNET_MD_FLAG_GPU) : 0; + tx->tx_gpu = lnet_md_is_gpu(msg_md); txmsg = tx->tx_msg; rd = &txmsg->ibm_u.putack.ibpam_rd; diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index 34d628f..d405aff 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -1634,7 +1634,7 @@ lnet_get_best_ni(struct lnet_net *local_net, struct lnet_ni *best_ni, unsigned int best_dev_prio; int best_ni_fatal; unsigned int dev_idx = UINT_MAX; - bool gpu = md ? (md->md_flags & LNET_MD_FLAG_GPU) : false; + bool gpu = lnet_md_is_gpu(md); if (gpu) { struct page *page = lnet_get_first_page(md, offset); diff --git a/lnet/lnet/lnet_rdma.c b/lnet/lnet/lnet_rdma.c index 791ece04..c598a1f 100644 --- a/lnet/lnet/lnet_rdma.c +++ b/lnet/lnet/lnet_rdma.c @@ -208,23 +208,16 @@ EXPORT_SYMBOL(lnet_rdma_unmap_sg); bool lnet_is_rdma_only_page(struct page *page) { - bool found = false; + bool is_gpu_page = false; struct nvfs_dma_rw_ops *nvfs_ops; - if (!page) - return found; + LASSERT(page != NULL); nvfs_ops = nvfs_get_ops(); - if (!nvfs_ops) - return found; - - if (!nvfs_ops->nvfs_is_gpu_page(page)) - goto out; - - found = true; - -out: - nvfs_put_ops(); - return found; + if (nvfs_ops != NULL) { + is_gpu_page = nvfs_ops->nvfs_is_gpu_page(page); + nvfs_put_ops(); + } + return is_gpu_page; } EXPORT_SYMBOL(lnet_is_rdma_only_page); -- 1.8.3.1