From af92c28b9ccf1f52e46f6fa1fd574cc48a1f060e Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 2 May 2023 22:01:51 +0900 Subject: [PATCH] bdev: Calculate max_write_zeroes once at bdev registration for fallback case As same as copy command, calculation of max write_zeroes size for fallback case includes division and is costly. The result is constant for each bdev. Hence, we can calculate it only once and store it into bdev->max_write_zeroes at bdev registration. However, in unit tests, bdev->blocklen and bdev->md_len can be changed dynamically. Hence, adjust bdev->max_write_zeroes for such changes. Signed-off-by: Shuhei Matsumoto Change-Id: I16e4980e7a283caa6c995a7dc61f7e77585d464e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17911 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- lib/bdev/bdev.c | 11 +++++------ test/unit/lib/bdev/bdev.c/bdev_ut.c | 3 +++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 21599ebbb..bf33f6f29 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -7439,6 +7439,10 @@ bdev_register(struct spdk_bdev *bdev) bdev->max_copy = bdev_get_max_write(bdev, iobuf_opts.large_bufsize); } + if (!bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_WRITE_ZEROES)) { + bdev->max_write_zeroes = bdev_get_max_write(bdev, ZERO_BUFFER_SIZE); + } + bdev->internal.reset_in_progress = NULL; bdev->internal.qd_poll_in_progress = false; bdev->internal.period = 0; @@ -8583,17 +8587,12 @@ static void bdev_write_zero_buffer_next(void *_bdev_io) { struct spdk_bdev_io *bdev_io = _bdev_io; - uint64_t aligned_length, max_write_zeroes_blocks; uint64_t num_blocks; void *md_buf = NULL; int rc; - aligned_length = ZERO_BUFFER_SIZE - (spdk_bdev_get_buf_align(bdev_io->bdev) - 1); - max_write_zeroes_blocks = aligned_length / _bdev_get_block_size_with_md(bdev_io->bdev); - max_write_zeroes_blocks -= max_write_zeroes_blocks % bdev_io->bdev->write_unit_size; - num_blocks = spdk_min(bdev_io->u.bdev.split_remaining_num_blocks, - max_write_zeroes_blocks); + bdev_io->bdev->max_write_zeroes); if (spdk_bdev_is_md_separate(bdev_io->bdev)) { md_buf = (char *)g_bdev_mgr.zero_buffer + diff --git a/test/unit/lib/bdev/bdev.c/bdev_ut.c b/test/unit/lib/bdev/bdev.c/bdev_ut.c index 118669351..2216fc37b 100644 --- a/test/unit/lib/bdev/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/bdev.c/bdev_ut.c @@ -4001,6 +4001,7 @@ bdev_write_zeroes(void) /* Check that if write zeroes is not supported it'll be replaced by regular writes */ ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, false); + bdev->max_write_zeroes = bdev_get_max_write(bdev, ZERO_BUFFER_SIZE); num_io_blocks = ZERO_BUFFER_SIZE / bdev->blocklen; num_requests = 2; num_blocks = (ZERO_BUFFER_SIZE / bdev->blocklen) * num_requests; @@ -4020,6 +4021,7 @@ bdev_write_zeroes(void) bdev->md_interleave = true; bdev->md_len = 64; bdev->blocklen = 4096 + 64; + bdev->max_write_zeroes = bdev_get_max_write(bdev, ZERO_BUFFER_SIZE); num_blocks = (ZERO_BUFFER_SIZE / bdev->blocklen) * 2; num_requests = offset = 0; @@ -4043,6 +4045,7 @@ bdev_write_zeroes(void) bdev->md_interleave = false; bdev->md_len = 64; bdev->blocklen = 4096; + bdev->max_write_zeroes = bdev_get_max_write(bdev, ZERO_BUFFER_SIZE); num_requests = offset = 0; while (offset < num_blocks) {