From 2dcaa3851fc6e3d01b4054fc1f1d2d35bbb4a170 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 2 May 2023 21:44:55 +0900 Subject: [PATCH] bdev: Fix max write_zeroes calculation for fallback case ZERO_BUFFER_SIZE is in bytes but it is easier to calculate max write_zeroes in blocks first and then get the minimum between max write_zeroes in blocks and remaining_num_blocks rather than converting remaining_num_blocks to num_bytes. This is helpful to store the result into bdev->max_write_zeroes for fallback case. We have one small fix in this patch. As we recently fixed bdev_io_get_max_buf_len(), to get aligned length, spdk_bdev_get_buf_align() - 1 is correct. Signed-off-by: Shuhei Matsumoto Change-Id: I104bc837c9eee1303664bfdb3559b0e840d6f0e5 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17910 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk --- lib/bdev/bdev.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 55166f7b6..21599ebbb 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -8583,15 +8583,17 @@ static void bdev_write_zero_buffer_next(void *_bdev_io) { struct spdk_bdev_io *bdev_io = _bdev_io; - uint64_t num_bytes, num_blocks; + uint64_t aligned_length, max_write_zeroes_blocks; + uint64_t num_blocks; void *md_buf = NULL; int rc; - num_bytes = spdk_min(_bdev_get_block_size_with_md(bdev_io->bdev) * - bdev_io->u.bdev.split_remaining_num_blocks, - ZERO_BUFFER_SIZE); - num_blocks = num_bytes / _bdev_get_block_size_with_md(bdev_io->bdev); - num_blocks -= num_blocks % bdev_io->bdev->write_unit_size; + 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); if (spdk_bdev_is_md_separate(bdev_io->bdev)) { md_buf = (char *)g_bdev_mgr.zero_buffer +