Commit af92c28b authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I16e4980e7a283caa6c995a7dc61f7e77585d464e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17911


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 2dcaa385
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -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 +
+3 −0
Original line number Diff line number Diff line
@@ -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) {