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 <smatsumoto@nvidia.com>
Change-Id: I16e4980e7a283caa6c995a7dc61f7e77585d464e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17911
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Shuhei Matsumoto 2023-05-02 22:01:51 +09:00 committed by Jim Harris
parent 2dcaa3851f
commit af92c28b9c
2 changed files with 8 additions and 6 deletions

View File

@ -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 +

View File

@ -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) {