From: Alexey Lyashkov Date: Wed, 12 Aug 2020 13:20:00 +0000 (+0300) Subject: LU-14008 o2iblnd: avoid static allocation for msg tx X-Git-Tag: 2.15.0-RC1~82 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=7d12b98d3f8294ca0911ca730aacd07a0f822298;p=fs%2Flustre-release.git LU-14008 o2iblnd: avoid static allocation for msg tx 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 Reviewed-on: https://review.whamcloud.com/40261 Tested-by: jenkins Reviewed-by: Chris Horn Reviewed-by: Alexander Boyko Tested-by: Maloo Reviewed-by: Serguei Smirnov Reviewed-by: Oleg Drokin --- diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index ae83cee..2797f50 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -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; diff --git a/lnet/klnds/o2iblnd/o2iblnd.h b/lnet/klnds/o2iblnd/o2iblnd.h index 62a124d..882ee04 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.h +++ b/lnet/klnds/o2iblnd/o2iblnd.h @@ -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 */ diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index 2349a62..2a84e06 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -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++; }