From: Mr NeilBrown Date: Sun, 5 Jan 2020 16:11:30 +0000 (-0500) Subject: LU-13004 ptlrpc: Allow BULK_BUF_KIOV to accept a kvec X-Git-Tag: 2.13.52~106 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=917655fc2938b90a9c246dd2d58408c42aa1658d;hp=4b0f0164c6ed761897409186376e9edc989323c9 LU-13004 ptlrpc: Allow BULK_BUF_KIOV to accept a kvec Bulk descriptor of type PTLRPC_BULK_BUF_KIOV are comprised of a list of page+offset+len. If the calling code actually has a virtual-address+len, it cannot current use BULK_BUF_KIOV and must use BULK_BUF_KVEC. However it is quite easy to convert virtual-address+len to a list of page+offset+len. So we can add a ->add_iov_frag interface for KIOV descriptors, and then we will be able to use KIOV descriptors for everything. The caller must ensure to allocate a large enough descriptor, taking into account the size of each exptected kvec. Signed-off-by: Mr NeilBrown Change-Id: If8bc5dc9f6e89a196bd72d3ac9b88c4ea5da83d1 Reviewed-on: https://review.whamcloud.com/36824 Reviewed-by: James Simmons Tested-by: jenkins Reviewed-by: Sebastien Buisson Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/ptlrpc/client.c b/lustre/ptlrpc/client.c index cf2631a..85bb30d 100644 --- a/lustre/ptlrpc/client.c +++ b/lustre/ptlrpc/client.c @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -68,6 +69,28 @@ static void ptlrpc_release_bulk_page_pin(struct ptlrpc_bulk_desc *desc) put_page(BD_GET_KIOV(desc, i).kiov_page); } +static int ptlrpc_prep_bulk_frag_pages(struct ptlrpc_bulk_desc *desc, + void *frag, int len) +{ + unsigned int offset = (uintptr_t)frag & ~PAGE_MASK; + + ENTRY; + while (len > 0) { + int page_len = min_t(unsigned int, PAGE_SIZE - offset, + len); + uintptr_t vaddr = (uintptr_t) frag; + + ptlrpc_prep_bulk_page_nopin(desc, + lnet_kvaddr_to_page(vaddr), + offset, page_len); + offset = 0; + len -= page_len; + frag += page_len; + } + + RETURN(desc->bd_nob); +} + const struct ptlrpc_bulk_frag_ops ptlrpc_bulk_kiov_pin_ops = { .add_kiov_frag = ptlrpc_prep_bulk_page_pin, .release_frags = ptlrpc_release_bulk_page_pin, @@ -77,6 +100,7 @@ EXPORT_SYMBOL(ptlrpc_bulk_kiov_pin_ops); const struct ptlrpc_bulk_frag_ops ptlrpc_bulk_kiov_nopin_ops = { .add_kiov_frag = ptlrpc_prep_bulk_page_nopin, .release_frags = ptlrpc_release_bulk_noop, + .add_iov_frag = ptlrpc_prep_bulk_frag_pages, }; EXPORT_SYMBOL(ptlrpc_bulk_kiov_nopin_ops);