From a18c0acd8c3f2802fe756b0d016f0cecebc71def Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 5 Mar 2019 10:10:53 +0900 Subject: [PATCH] bdev: Increase the size of small and large buffers to store DIF Increase the size of small and large buffers in the bdev layer to store DIF. Increase is the amount necessary to store 16 byte metadata to the block formatted with 512 + 16. 512 + 16 is the current maximum ratio of metadata per block. This change will be done in the iSCSI library in the next patch and other libraries may be done later. Hence add and use an new macro SPDK_BDEV_BUF_SIZE_WITH_MD(x) for convenience. Change-Id: I4b5498f56c9baf3e3ed93dd1c757998d7ce65141 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/444558 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Darek Stojaczyk Reviewed-by: Jim Harris --- include/spdk/bdev.h | 6 ++++++ lib/bdev/bdev.c | 15 ++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index 421462c27..268f39ef1 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -54,6 +54,12 @@ extern "C" { #define SPDK_BDEV_SMALL_BUF_MAX_SIZE 8192 #define SPDK_BDEV_LARGE_BUF_MAX_SIZE (64 * 1024) +/* Increase the buffer size to store interleaved metadata. Increment is the + * amount necessary to store metadata per data block. 16 byte metadata per + * 512 byte data block is the current maximum ratio of metadata per block. + */ +#define SPDK_BDEV_BUF_SIZE_WITH_MD(x) (((x) / 512) * (512 + 16)) + /** * Block device remove callback. * diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 2ca81e029..dbba28d12 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -523,7 +523,8 @@ spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io) bdev_io->internal.buf = NULL; - if (buf_len + alignment <= SPDK_BDEV_SMALL_BUF_MAX_SIZE + SPDK_BDEV_POOL_ALIGNMENT) { + if (buf_len + alignment <= SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_BDEV_SMALL_BUF_MAX_SIZE) + + SPDK_BDEV_POOL_ALIGNMENT) { pool = g_bdev_mgr.buf_small_pool; stailq = &ch->need_buf_small; } else { @@ -595,7 +596,8 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u return; } - if (len + alignment > SPDK_BDEV_LARGE_BUF_MAX_SIZE + SPDK_BDEV_POOL_ALIGNMENT) { + if (len + alignment > 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", len + alignment); cb(bdev_io->internal.ch->channel, bdev_io, false); @@ -607,7 +609,8 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u bdev_io->internal.buf_len = len; bdev_io->internal.get_buf_cb = cb; - if (len + alignment <= SPDK_BDEV_SMALL_BUF_MAX_SIZE + SPDK_BDEV_POOL_ALIGNMENT) { + if (len + alignment <= SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_BDEV_SMALL_BUF_MAX_SIZE) + + SPDK_BDEV_POOL_ALIGNMENT) { pool = g_bdev_mgr.buf_small_pool; stailq = &mgmt_ch->need_buf_small; } else { @@ -942,7 +945,8 @@ spdk_bdev_initialize(spdk_bdev_init_cb cb_fn, void *cb_arg) g_bdev_mgr.buf_small_pool = spdk_mempool_create(mempool_name, BUF_SMALL_POOL_SIZE, - SPDK_BDEV_SMALL_BUF_MAX_SIZE + SPDK_BDEV_POOL_ALIGNMENT, + SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_BDEV_SMALL_BUF_MAX_SIZE) + + SPDK_BDEV_POOL_ALIGNMENT, cache_size, SPDK_ENV_SOCKET_ID_ANY); if (!g_bdev_mgr.buf_small_pool) { @@ -956,7 +960,8 @@ spdk_bdev_initialize(spdk_bdev_init_cb cb_fn, void *cb_arg) g_bdev_mgr.buf_large_pool = spdk_mempool_create(mempool_name, BUF_LARGE_POOL_SIZE, - SPDK_BDEV_LARGE_BUF_MAX_SIZE + SPDK_BDEV_POOL_ALIGNMENT, + SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_BDEV_LARGE_BUF_MAX_SIZE) + + SPDK_BDEV_POOL_ALIGNMENT, cache_size, SPDK_ENV_SOCKET_ID_ANY); if (!g_bdev_mgr.buf_large_pool) {