Whamcloud - gitweb
LU-14008 o2iblnd: avoid static allocation for msg tx 61/40261/10
authorAlexey Lyashkov <alexey.lyashkov@hpe.com>
Wed, 12 Aug 2020 13:20:00 +0000 (16:20 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 26 Jan 2022 05:12:39 +0000 (05:12 +0000)
tx msg handling simplification, just push
a lnet header message in same list as other.

Cray-bug-id: LUS-1796
Change-Id: I8e5d9b8a4579ff630d4a4fbc57b06a73a662e68c
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Reviewed-on: https://review.whamcloud.com/40261
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/klnds/o2iblnd/o2iblnd.c
lnet/klnds/o2iblnd/o2iblnd.h
lnet/klnds/o2iblnd/o2iblnd_cb.c

index ae83cee..2797f50 100644 (file)
@@ -2228,10 +2228,12 @@ kiblnd_destroy_tx_pool(struct kib_pool *pool)
                if (tx->tx_wrq != NULL)
                        CFS_FREE_PTR_ARRAY(tx->tx_wrq,
                                           IBLND_MAX_RDMA_FRAGS);
-               if (tx->tx_sge != NULL)
+               if (tx->tx_sge != NULL) {
+                       /* +1 is for the lnet header/message itself */
                        CFS_FREE_PTR_ARRAY(tx->tx_sge,
-                                          IBLND_MAX_RDMA_FRAGS *
-                                          wrq_sge);
+                                          (IBLND_MAX_RDMA_FRAGS *
+                                          wrq_sge + 1));
+               }
                if (tx->tx_rd != NULL)
                        LIBCFS_FREE(tx->tx_rd,
                                    offsetof(struct kib_rdma_desc,
@@ -2318,8 +2320,9 @@ kiblnd_create_tx_pool(struct kib_poolset *ps, int size, struct kib_pool **pp_po)
                if (tx->tx_wrq == NULL)
                        break;
 
+               /* +1 is for the lnet header/message itself */
                LIBCFS_CPT_ALLOC(tx->tx_sge, lnet_cpt_table(), ps->ps_cpt,
-                                IBLND_MAX_RDMA_FRAGS * wrq_sge *
+                                (IBLND_MAX_RDMA_FRAGS * wrq_sge + 1) *
                                 sizeof(*tx->tx_sge));
                if (tx->tx_sge == NULL)
                        break;
index 62a124d..882ee04 100644 (file)
@@ -528,8 +528,6 @@ struct kib_tx {                                     /* transmit message */
        __u64                   tx_msgaddr;
        /* for dma_unmap_single() */
        DEFINE_DMA_UNMAP_ADDR(tx_msgunmap);
-       /** sge for tx_msgaddr */
-       struct ib_sge           tx_msgsge;
        /* # send work items */
        int                     tx_nwrq;
        /* # used scatter/gather elements */
index 2349a62..2a84e06 100644 (file)
@@ -1090,44 +1090,55 @@ kiblnd_tx_complete(struct kib_tx *tx, int status)
                kiblnd_tx_done(tx);
 }
 
+
 static void
-kiblnd_init_tx_msg(struct lnet_ni *ni, struct kib_tx *tx, int type,
-                  int body_nob)
+kiblnd_init_tx_sge(struct kib_tx *tx, u64 addr, unsigned int len)
 {
+       struct ib_sge *sge = &tx->tx_sge[tx->tx_nsge];
        struct kib_hca_dev *hdev = tx->tx_pool->tpo_hdev;
-       struct ib_sge *sge = &tx->tx_msgsge;
-       struct ib_rdma_wr *wrq;
-       int nob = offsetof(struct kib_msg, ibm_u) + body_nob;
 #ifdef HAVE_IB_GET_DMA_MR
        struct ib_mr *mr = hdev->ibh_mrs;
 #endif
 
-       LASSERT(tx->tx_nwrq >= 0);
-       LASSERT(tx->tx_nwrq <= IBLND_MAX_RDMA_FRAGS);
-       LASSERT(nob <= IBLND_MSG_SIZE);
+       *sge = (struct ib_sge) {
 #ifdef HAVE_IB_GET_DMA_MR
-       LASSERT(mr != NULL);
+               .lkey   = mr->lkey,
+#else
+               .lkey   = hdev->ibh_pd->local_dma_lkey,
 #endif
+               .addr   = addr,
+               .length = len,
+       };
 
-       kiblnd_init_msg(tx->tx_msg, type, body_nob);
+       tx->tx_nsge++;
+}
 
-#ifdef HAVE_IB_GET_DMA_MR
-       sge->lkey   = mr->lkey;
-#else
-       sge->lkey   = hdev->ibh_pd->local_dma_lkey;
-#endif
-       sge->addr   = tx->tx_msgaddr;
-       sge->length = nob;
+static void
+kiblnd_init_tx_msg(struct lnet_ni *ni, struct kib_tx *tx, int type,
+                  int body_nob)
+{
+       struct ib_rdma_wr *wrq;
+       int nob = offsetof(struct kib_msg, ibm_u) + body_nob;
+
+       LASSERT(tx->tx_nwrq >= 0);
+       LASSERT(tx->tx_nwrq < IBLND_MAX_RDMA_FRAGS + 1);
+       LASSERT(nob <= IBLND_MSG_SIZE);
+
+       kiblnd_init_msg(tx->tx_msg, type, body_nob);
 
        wrq = &tx->tx_wrq[tx->tx_nwrq];
-       memset(wrq, 0, sizeof(*wrq));
-
-       wrq->wr.next            = NULL;
-       wrq->wr.wr_id           = kiblnd_ptr2wreqid(tx, IBLND_WID_TX);
-       wrq->wr.sg_list         = sge;
-       wrq->wr.num_sge         = 1;
-       wrq->wr.opcode          = IB_WR_SEND;
-       wrq->wr.send_flags      = IB_SEND_SIGNALED;
+
+       *wrq = (struct ib_rdma_wr) {
+               .wr = {
+                       .wr_id          = kiblnd_ptr2wreqid(tx, IBLND_WID_TX),
+                       .num_sge        = 1,
+                       .sg_list        = &tx->tx_sge[tx->tx_nsge],
+                       .opcode         = IB_WR_SEND,
+                       .send_flags     = IB_SEND_SIGNALED,
+               },
+       };
+
+       kiblnd_init_tx_sge(tx, tx->tx_msgaddr, nob);
 
        tx->tx_nwrq++;
 }