From 4775d52439f4f8df42056626535462ecb6cce009 Mon Sep 17 00:00:00 2001 From: Mr NeilBrown Date: Wed, 4 Dec 2019 15:12:08 +1100 Subject: [PATCH] LU-13004 lnet: discard kvec option from lnet_libmd. The 'struct kvec' field in 'struct lnet_libmd' is no longer set - the memory is always presented as pages. So remove that option and the union that contained iov and kiov. Rename md_iov.kiov to md_kiov. Discard all code that made use of md_iov.iov. Test-Parameters: trivial Signed-off-by: Mr NeilBrown Change-Id: Ic74a496c4c3df786d7fc194a1ad758c4daccd819 Reviewed-on: https://review.whamcloud.com/37843 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Shaun Tancheff Reviewed-by: Oleg Drokin --- lnet/include/lnet/lib-lnet.h | 7 ++-- lnet/include/lnet/lib-types.h | 5 +-- lnet/klnds/gnilnd/gnilnd_cb.c | 15 +++----- lnet/klnds/o2iblnd/o2iblnd_cb.c | 14 +++----- lnet/lnet/lib-md.c | 79 ++++++++++------------------------------- lnet/lnet/lib-move.c | 5 +-- 6 files changed, 31 insertions(+), 94 deletions(-) diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index f028224..c414393 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -206,7 +206,7 @@ lnet_net_lock_current(void) #define MAX_PORTALS 64 -#define LNET_SMALL_MD_SIZE offsetof(struct lnet_libmd, md_iov.iov[1]) +#define LNET_SMALL_MD_SIZE offsetof(struct lnet_libmd, md_kiov[1]) extern struct kmem_cache *lnet_mes_cachep; /* MEs kmem_cache */ extern struct kmem_cache *lnet_small_mds_cachep; /* <= LNET_SMALL_MD_SIZE bytes * MDs kmem_cache */ @@ -220,10 +220,7 @@ lnet_md_free(struct lnet_libmd *md) LASSERTF(md->md_rspt_ptr == NULL, "md %p rsp %p\n", md, md->md_rspt_ptr); - if ((md->md_options & LNET_MD_KIOV) != 0) - size = offsetof(struct lnet_libmd, md_iov.kiov[md->md_niov]); - else - size = offsetof(struct lnet_libmd, md_iov.iov[md->md_niov]); + size = offsetof(struct lnet_libmd, md_kiov[md->md_niov]); if (size <= LNET_SMALL_MD_SIZE) { CDEBUG(D_MALLOC, "slab-freed 'md' at %p.\n", md); diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 8cc0609..872c0d4 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -211,10 +211,7 @@ struct lnet_libmd { struct lnet_rsp_tracker *md_rspt_ptr; lnet_handler_t md_handler; struct lnet_handle_md md_bulk_handle; - union { - struct kvec iov[LNET_MAX_IOV]; - struct bio_vec kiov[LNET_MAX_IOV]; - } md_iov; + struct bio_vec md_kiov[LNET_MAX_IOV]; }; #define LNET_MD_FLAG_ZOMBIE (1 << 0) diff --git a/lnet/klnds/gnilnd/gnilnd_cb.c b/lnet/klnds/gnilnd/gnilnd_cb.c index ea712dc..97b8618 100644 --- a/lnet/klnds/gnilnd/gnilnd_cb.c +++ b/lnet/klnds/gnilnd/gnilnd_cb.c @@ -813,7 +813,7 @@ kgnilnd_parse_lnet_rdma(struct lnet_msg *lntmsg, unsigned int *niov, if ((lntmsg->msg_md->md_options & LNET_MD_KIOV) == 0) { *kiov = NULL; } else { - *kiov = lntmsg->msg_md->md_iov.kiov; + *kiov = lntmsg->msg_md->md_kiov; } *niov = lntmsg->msg_md->md_niov; *nob = lntmsg->msg_md->md_length; @@ -2183,16 +2183,9 @@ kgnilnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) rc = -ENOMEM; goto out; } - /* slightly different options as we might actually have a GET with a - * MD_KIOV set but a non-NULL md_iov.iov */ - if ((lntmsg->msg_md->md_options & LNET_MD_KIOV) == 0) - rc = kgnilnd_setup_rdma_buffer(tx, lntmsg->msg_md->md_niov, - lntmsg->msg_md->md_iov.iov, NULL, - 0, lntmsg->msg_md->md_length); - else - rc = kgnilnd_setup_rdma_buffer(tx, lntmsg->msg_md->md_niov, - NULL, lntmsg->msg_md->md_iov.kiov, - 0, lntmsg->msg_md->md_length); + rc = kgnilnd_setup_rdma_buffer(tx, lntmsg->msg_md->md_niov, + NULL, lntmsg->msg_md->md_kiov, + 0, lntmsg->msg_md->md_length); if (rc != 0) { CERROR("unable to setup buffer: %d\n", rc); kgnilnd_tx_done(tx, rc); diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index e79f6ce..c107985 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -1695,16 +1695,10 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) ibmsg = tx->tx_msg; rd = &ibmsg->ibm_u.get.ibgm_rd; - if ((lntmsg->msg_md->md_options & LNET_MD_KIOV) == 0) - rc = kiblnd_setup_rd_iov(ni, tx, rd, - lntmsg->msg_md->md_niov, - lntmsg->msg_md->md_iov.iov, - 0, lntmsg->msg_md->md_length); - else - rc = kiblnd_setup_rd_kiov(ni, tx, rd, - lntmsg->msg_md->md_niov, - lntmsg->msg_md->md_iov.kiov, - 0, lntmsg->msg_md->md_length); + rc = kiblnd_setup_rd_kiov(ni, tx, rd, + lntmsg->msg_md->md_niov, + lntmsg->msg_md->md_kiov, + 0, lntmsg->msg_md->md_length); if (rc != 0) { CERROR("Can't setup GET sink for %s: %d\n", libcfs_nid2str(target.nid), rc); diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index 8830820..0ab9060 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -109,6 +109,7 @@ lnet_cpt_of_md(struct lnet_libmd *md, unsigned int offset) { int cpt = CFS_CPT_ANY; unsigned int niov; + struct bio_vec *kiov; /* * if the md_options has a bulk handle then we want to look at the @@ -121,63 +122,21 @@ lnet_cpt_of_md(struct lnet_libmd *md, unsigned int offset) if (!md || md->md_niov == 0) return CFS_CPT_ANY; + kiov = md->md_kiov; niov = md->md_niov; - /* - * There are three cases to handle: - * 1. The MD is using struct bio_vec - * 2. The MD is using struct kvec - * 3. Contiguous buffer allocated via vmalloc - * - * in case 2 we can use virt_to_page() macro to get the page - * address of the memory kvec describes. - * - * in case 3 use is_vmalloc_addr() and vmalloc_to_page() - * - * The offset provided can be within the first iov/kiov entry or - * it could go beyond it. In that case we need to make sure to - * look at the page which actually contains the data that will be - * DMAed. - */ - if ((md->md_options & LNET_MD_KIOV) != 0) { - struct bio_vec *kiov = md->md_iov.kiov; - - while (offset >= kiov->bv_len) { - offset -= kiov->bv_len; - niov--; - kiov++; - if (niov == 0) { - CERROR("offset %d goes beyond kiov\n", offset); - goto out; - } - } - - cpt = cfs_cpt_of_node(lnet_cpt_table(), - page_to_nid(kiov->bv_page)); - } else { - struct kvec *iov = md->md_iov.iov; - unsigned long vaddr; - struct page *page; - - while (offset >= iov->iov_len) { - offset -= iov->iov_len; - niov--; - iov++; - if (niov == 0) { - CERROR("offset %d goes beyond iov\n", offset); - goto out; - } - } - - vaddr = ((unsigned long)iov->iov_base) + offset; - page = lnet_kvaddr_to_page(vaddr); - if (!page) { - CERROR("Couldn't resolve vaddr 0x%lx to page\n", vaddr); + while (offset >= kiov->bv_len) { + offset -= kiov->bv_len; + niov--; + kiov++; + if (niov == 0) { + CERROR("offset %d goes beyond kiov\n", offset); goto out; } - cpt = cfs_cpt_of_node(lnet_cpt_table(), page_to_nid(page)); } + cpt = cfs_cpt_of_node(lnet_cpt_table(), + page_to_nid(kiov->bv_page)); out: return cpt; } @@ -196,7 +155,7 @@ lnet_md_build(struct lnet_md *umd, int unlink) else niov = DIV_ROUND_UP(offset_in_page(umd->start) + umd->length, PAGE_SIZE); - size = offsetof(struct lnet_libmd, md_iov.kiov[niov]); + size = offsetof(struct lnet_libmd, md_kiov[niov]); if (size <= LNET_SMALL_MD_SIZE) { lmd = kmem_cache_zalloc(lnet_small_mds_cachep, GFP_NOFS); @@ -230,18 +189,18 @@ lnet_md_build(struct lnet_md *umd, int unlink) lmd->md_bulk_handle = umd->bulk_handle; if (umd->options & LNET_MD_KIOV) { - memcpy(lmd->md_iov.kiov, umd->start, - niov * sizeof(lmd->md_iov.kiov[0])); + memcpy(lmd->md_kiov, umd->start, + niov * sizeof(lmd->md_kiov[0])); for (i = 0; i < (int)niov; i++) { /* We take the page pointer on trust */ - if (lmd->md_iov.kiov[i].bv_offset + - lmd->md_iov.kiov[i].bv_len > PAGE_SIZE) { + if (lmd->md_kiov[i].bv_offset + + lmd->md_kiov[i].bv_len > PAGE_SIZE) { lnet_md_free(lmd); return ERR_PTR(-EINVAL); /* invalid length */ } - total_length += lmd->md_iov.kiov[i].bv_len; + total_length += lmd->md_kiov[i].bv_len; } lmd->md_length = total_length; @@ -263,10 +222,10 @@ lnet_md_build(struct lnet_md *umd, int unlink) plen = min_t(int, len, PAGE_SIZE - offset_in_page(pa)); - lmd->md_iov.kiov[i].bv_page = + lmd->md_kiov[i].bv_page = lnet_kvaddr_to_page((unsigned long) pa); - lmd->md_iov.kiov[i].bv_offset = offset_in_page(pa); - lmd->md_iov.kiov[i].bv_len = plen; + lmd->md_kiov[i].bv_offset = offset_in_page(pa); + lmd->md_kiov[i].bv_len = plen; len -= plen; pa += plen; diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index 5330e1a..7b86f24 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -727,10 +727,7 @@ lnet_setpayloadbuffer(struct lnet_msg *msg) LASSERT(msg->msg_kiov == NULL); msg->msg_niov = md->md_niov; - if ((md->md_options & LNET_MD_KIOV) != 0) - msg->msg_kiov = md->md_iov.kiov; - else - msg->msg_iov = md->md_iov.iov; + msg->msg_kiov = md->md_kiov; } void -- 1.8.3.1