From 9e647c1f462ecc75890c7745fea225c9ecfb4238 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Mon, 28 Nov 2022 12:04:07 +0100 Subject: [PATCH] bdev: disallow get_buf() calls from other threads This is unsafe, because we touch need_buf_* queues, which aren't thread-safe. Also, documented this requirement in spdk_bdev_io_get_buf()'s description. Signed-off-by: Konrad Sztyber Change-Id: Iabc141e051c543fdd51f079ae212f69e980d8148 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15668 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk --- include/spdk/bdev_module.h | 3 ++- lib/bdev/bdev.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/spdk/bdev_module.h b/include/spdk/bdev_module.h index de6e4a745..fc70278e1 100644 --- a/include/spdk/bdev_module.h +++ b/include/spdk/bdev_module.h @@ -968,7 +968,8 @@ const struct spdk_bdev_aliases_list *spdk_bdev_get_aliases(const struct spdk_bde * callback on read path. The buffer will be freed automatically * on \c spdk_bdev_free_io() call. This call will never fail. * In case of lack of memory given callback \c cb will be deferred - * until enough memory is freed. + * until enough memory is freed. This function *must* be called + * from the thread issuing \c bdev_io. * * \param bdev_io I/O to allocate buffer for. * \param cb callback to be called when the buffer is allocated diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 6b3af2559..713fc3e00 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1227,6 +1227,7 @@ bdev_io_get_buf(struct spdk_bdev_io *bdev_io, uint64_t len) uint64_t alignment, md_len; void *buf; + assert(spdk_bdev_io_get_thread(bdev_io) == spdk_get_thread()); 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;