Whamcloud - gitweb
LU-17189 o2ib: assign tx_gpu properly 02/52702/7
authorJinshan Xiong <jinshan.xiong@gmail.com>
Thu, 12 Oct 2023 22:55:58 +0000 (15:55 -0700)
committerOleg Drokin <green@whamcloud.com>
Thu, 15 Feb 2024 06:58:42 +0000 (06:58 +0000)
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 <jinshan.xiong@gmail.com>
Change-Id: I5e14d66f41f6194203fec7832493efd432b54c36
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52702
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/include/lnet/lib-types.h
lnet/klnds/o2iblnd/o2iblnd_cb.c
lnet/lnet/lib-move.c
lnet/lnet/lnet_rdma.c

index bc8a8d0..a02eab2 100644 (file)
@@ -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 */
index 85dc9dd..7b740ef 100644 (file)
@@ -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;
index 34d628f..d405aff 100644 (file)
@@ -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);
index 791ece0..c598a1f 100644 (file)
@@ -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);