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:
parent
2dcaa3851f
commit
af92c28b9c
@ -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 +
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user