From eaa984801ef9a2add2b8189c52146de5e0eba0f7 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Fri, 17 Jan 2020 08:23:45 -0700 Subject: [PATCH] bdev: break spdk_bdev_io_get_buf into multiple functions This will allow for some reuse in future patches adding support to get auxiliary buffers from the bdev memory pools. Signed-off-by: Jim Harris Change-Id: Icd4e71d0e918cfe940c749e40cd1cc6c560e25a9 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/482022 Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu Community-CI: SPDK CI Jenkins Tested-by: SPDK CI Jenkins --- lib/bdev/bdev.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index a83fdcc9a..9507266e0 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -597,7 +597,9 @@ _bdev_io_set_bounce_md_buf(struct spdk_bdev_io *bdev_io, void *md_buf, size_t le static void bdev_io_get_buf_complete(struct spdk_bdev_io *bdev_io, bool status) { - bdev_io->internal.get_buf_cb(spdk_bdev_io_get_io_channel(bdev_io), bdev_io, status); + struct spdk_io_channel *ch = spdk_bdev_io_get_io_channel(bdev_io); + + bdev_io->internal.get_buf_cb(ch, bdev_io, status); bdev_io->internal.get_buf_cb = NULL; } @@ -716,8 +718,8 @@ _bdev_io_unset_bounce_buf(struct spdk_bdev_io *bdev_io) bdev_io_put_buf(bdev_io); } -void -spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, uint64_t len) +static void +bdev_io_get_buf(struct spdk_bdev_io *bdev_io, uint64_t len) { struct spdk_bdev *bdev = bdev_io->bdev; struct spdk_mempool *pool; @@ -726,19 +728,9 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u uint64_t alignment, md_len; void *buf; - assert(cb != NULL); - bdev_io->internal.get_buf_cb = cb; - alignment = spdk_bdev_get_buf_align(bdev); md_len = spdk_bdev_is_md_separate(bdev) ? bdev_io->u.bdev.num_blocks * bdev->md_len : 0; - if (_is_buf_allocated(bdev_io->u.bdev.iovs) && - _are_iovs_aligned(bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, alignment)) { - /* Buffer already present and aligned */ - bdev_io_get_buf_complete(bdev_io, true); - return; - } - if (len + alignment + md_len > SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_BDEV_LARGE_BUF_MAX_SIZE) + SPDK_BDEV_POOL_ALIGNMENT) { SPDK_ERRLOG("Length + alignment %" PRIu64 " is larger than allowed\n", @@ -768,6 +760,27 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u } } +void +spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, uint64_t len) +{ + struct spdk_bdev *bdev = bdev_io->bdev; + uint64_t alignment; + + assert(cb != NULL); + bdev_io->internal.get_buf_cb = cb; + + alignment = spdk_bdev_get_buf_align(bdev); + + if (_is_buf_allocated(bdev_io->u.bdev.iovs) && + _are_iovs_aligned(bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, alignment)) { + /* Buffer already present and aligned */ + cb(spdk_bdev_io_get_io_channel(bdev_io), bdev_io, true); + return; + } + + bdev_io_get_buf(bdev_io, len); +} + static int bdev_module_get_max_ctx_size(void) {