From a33d4af6b13a4a3e27cb62fa48ab69f18b4bf820 Mon Sep 17 00:00:00 2001 From: Alexey Marchuk Date: Wed, 19 Jan 2022 17:34:41 +0300 Subject: [PATCH] bdev: Factor out bdev_io_get_buf_complete Next patches enable memory domains async pull/push functionality. Previously buffer from internal bdev pool was passed as func argument to bdev_io_get_buf_complete. Now since bdev_io_get_buf_complete can be called asynchronously, this buffer is stored in bdev_io->internal.buf Also move bdev_io_get_buf_complete up in file to minimize changes in next patches Signed-off-by: Alexey Marchuk Change-Id: I6e9d3b35dc85e0e88703dd24a4b4da837adc5b74 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11165 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto --- lib/bdev/bdev.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 4b5ae5860..8bdd69936 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -832,6 +832,24 @@ _copy_buf_to_iovs(struct iovec *iovs, int iovcnt, void *buf, size_t buf_len) } } +static void +bdev_io_get_buf_complete(struct spdk_bdev_io *bdev_io, bool status) +{ + struct spdk_io_channel *ch = spdk_bdev_io_get_io_channel(bdev_io); + void *buf; + + if (spdk_unlikely(bdev_io->internal.get_aux_buf_cb != NULL)) { + buf = bdev_io->internal.buf; + bdev_io->internal.buf = NULL; + bdev_io->internal.get_aux_buf_cb(ch, bdev_io, buf); + bdev_io->internal.get_aux_buf_cb = NULL; + } else { + assert(bdev_io->internal.get_buf_cb != NULL); + bdev_io->internal.get_buf_cb(ch, bdev_io, status); + bdev_io->internal.get_buf_cb = NULL; + } +} + static void _bdev_io_set_bounce_buf(struct spdk_bdev_io *bdev_io, void *buf, size_t len) { @@ -863,22 +881,6 @@ _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, void *buf, bool status) -{ - struct spdk_io_channel *ch = spdk_bdev_io_get_io_channel(bdev_io); - - if (spdk_unlikely(bdev_io->internal.get_aux_buf_cb != NULL)) { - bdev_io->internal.get_aux_buf_cb(ch, bdev_io, buf); - bdev_io->internal.get_aux_buf_cb = NULL; - } else { - assert(bdev_io->internal.get_buf_cb != NULL); - bdev_io->internal.buf = buf; - bdev_io->internal.get_buf_cb(ch, bdev_io, status); - bdev_io->internal.get_buf_cb = NULL; - } -} - static void _bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, uint64_t len) { @@ -887,8 +889,10 @@ _bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, uint64_t len) uint64_t md_len, alignment; void *aligned_buf; + bdev_io->internal.buf = buf; + if (spdk_unlikely(bdev_io->internal.get_aux_buf_cb != NULL)) { - bdev_io_get_buf_complete(bdev_io, buf, true); + bdev_io_get_buf_complete(bdev_io, true); return; } @@ -914,7 +918,7 @@ _bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, uint64_t len) spdk_bdev_io_set_md_buf(bdev_io, aligned_buf, md_len); } } - bdev_io_get_buf_complete(bdev_io, buf, true); + bdev_io_get_buf_complete(bdev_io, true); } static void @@ -1060,7 +1064,7 @@ bdev_io_get_buf(struct spdk_bdev_io *bdev_io, uint64_t len) SPDK_BDEV_POOL_ALIGNMENT) { SPDK_ERRLOG("Length + alignment %" PRIu64 " is larger than allowed\n", len + alignment); - bdev_io_get_buf_complete(bdev_io, NULL, false); + bdev_io_get_buf_complete(bdev_io, false); return; }