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

bdev: Use data_block_size for upper layer buffer if hide_metadata is true



Add two helper functions, bdev_desc_get_block_size() and
bdev_io_get_block_size().

Then, use these functions for buffers of upper layer.

The following patches will do DIF insert/strip for read/write if
no_metadata is true.

bdev_io_update_io_stat() keeps using bdev->blocklen because
I/O to the underlying bdev module uses bdev->blocklen regardless of
the no_metadata option.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I46cedb846a4362ba75742d4e543df466ef43f112
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24629


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 67afc973
Loading
Loading
Loading
Loading
+29 −10
Original line number Diff line number Diff line
@@ -957,6 +957,24 @@ bdev_io_use_accel_sequence(struct spdk_bdev_io *bdev_io)
	return bdev_io->internal.f.has_accel_sequence;
}

static inline uint32_t
bdev_desc_get_block_size(struct spdk_bdev_desc *desc)
{
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	if (spdk_unlikely(desc->opts.hide_metadata)) {
		return bdev->blocklen - bdev->md_len;
	} else {
		return bdev->blocklen;
	}
}

static inline uint32_t
bdev_io_get_block_size(struct spdk_bdev_io *bdev_io)
{
	return bdev_desc_get_block_size(bdev_io->internal.desc);
}

static inline void
bdev_queue_nomem_io_head(struct spdk_bdev_shared_resource *shared_resource,
			 struct spdk_bdev_io *bdev_io, enum bdev_io_retry_state state)
@@ -2641,7 +2659,7 @@ bdev_is_read_io(struct spdk_bdev_io *bdev_io)
static uint64_t
bdev_get_io_size_in_byte(struct spdk_bdev_io *bdev_io)
{
	struct spdk_bdev	*bdev = bdev_io->bdev;
	uint32_t blocklen = bdev_io_get_block_size(bdev_io);

	switch (bdev_io->type) {
	case SPDK_BDEV_IO_TYPE_NVME_IO:
@@ -2649,11 +2667,11 @@ bdev_get_io_size_in_byte(struct spdk_bdev_io *bdev_io)
		return bdev_io->u.nvme_passthru.nbytes;
	case SPDK_BDEV_IO_TYPE_READ:
	case SPDK_BDEV_IO_TYPE_WRITE:
		return bdev_io->u.bdev.num_blocks * bdev->blocklen;
		return bdev_io->u.bdev.num_blocks * blocklen;
	case SPDK_BDEV_IO_TYPE_ZCOPY:
		/* Track the data in the start phase only */
		if (bdev_io->u.bdev.zcopy.start) {
			return bdev_io->u.bdev.num_blocks * bdev->blocklen;
			return bdev_io->u.bdev.num_blocks * blocklen;
		} else {
			return 0;
		}
@@ -3177,7 +3195,7 @@ _bdev_rw_split(void *_bdev_io)
	uint32_t parent_iov_offset, parent_iovcnt, parent_iovpos, child_iovcnt;
	uint32_t to_next_boundary, to_next_boundary_bytes, to_last_block_bytes;
	uint32_t iovcnt, iov_len, child_iovsize;
	uint32_t blocklen = bdev->blocklen;
	uint32_t blocklen;
	uint32_t io_boundary;
	uint32_t max_segment_size = bdev->max_segment_size;
	uint32_t max_child_iovcnt = bdev->max_num_segments;
@@ -3185,6 +3203,8 @@ _bdev_rw_split(void *_bdev_io)
	void *md_buf = NULL;
	int rc;

	blocklen = bdev_io_get_block_size(bdev_io);

	max_size = max_size ? max_size : UINT32_MAX;
	max_segment_size = max_segment_size ? max_segment_size : UINT32_MAX;
	max_child_iovcnt = max_child_iovcnt ? spdk_min(max_child_iovcnt, SPDK_BDEV_IO_NUM_CHILD_IOV) :
@@ -3517,7 +3537,7 @@ bdev_io_split(struct spdk_bdev_io *bdev_io)
		} else {
			assert(bdev_io->type == SPDK_BDEV_IO_TYPE_READ);
			spdk_bdev_io_get_buf(bdev_io, bdev_rw_split_get_buf_cb,
					     bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen);
					     bdev_io->u.bdev.num_blocks * bdev_io_get_block_size(bdev_io));
		}
		break;
	case SPDK_BDEV_IO_TYPE_UNMAP:
@@ -5355,8 +5375,7 @@ static uint64_t
bdev_bytes_to_blocks(struct spdk_bdev_desc *desc, uint64_t offset_bytes,
		     uint64_t *offset_blocks, uint64_t num_bytes, uint64_t *num_blocks)
{
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);
	uint32_t block_size = bdev->blocklen;
	uint32_t block_size = bdev_desc_get_block_size(desc);
	uint8_t shift_cnt;

	/* Avoid expensive div operations if possible. These spdk_u32 functions are very cheap. */
@@ -5491,7 +5510,7 @@ bdev_read_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch
	bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
	bdev_io->u.bdev.iovs = &bdev_io->iov;
	bdev_io->u.bdev.iovs[0].iov_base = buf;
	bdev_io->u.bdev.iovs[0].iov_len = num_blocks * bdev->blocklen;
	bdev_io->u.bdev.iovs[0].iov_len = num_blocks * bdev_desc_get_block_size(desc);
	bdev_io->u.bdev.iovcnt = 1;
	bdev_io->u.bdev.md_buf = md_buf;
	bdev_io->u.bdev.num_blocks = num_blocks;
@@ -5733,7 +5752,7 @@ bdev_write_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *c
	bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
	bdev_io->u.bdev.iovs = &bdev_io->iov;
	bdev_io->u.bdev.iovs[0].iov_base = buf;
	bdev_io->u.bdev.iovs[0].iov_len = num_blocks * bdev->blocklen;
	bdev_io->u.bdev.iovs[0].iov_len = num_blocks * bdev_desc_get_block_size(desc);
	bdev_io->u.bdev.iovcnt = 1;
	bdev_io->u.bdev.md_buf = md_buf;
	bdev_io->u.bdev.num_blocks = num_blocks;
@@ -6101,7 +6120,7 @@ bdev_compare_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel
	bdev_io->type = SPDK_BDEV_IO_TYPE_COMPARE;
	bdev_io->u.bdev.iovs = &bdev_io->iov;
	bdev_io->u.bdev.iovs[0].iov_base = buf;
	bdev_io->u.bdev.iovs[0].iov_len = num_blocks * bdev->blocklen;
	bdev_io->u.bdev.iovs[0].iov_len = num_blocks * bdev_desc_get_block_size(desc);
	bdev_io->u.bdev.iovcnt = 1;
	bdev_io->u.bdev.md_buf = md_buf;
	bdev_io->u.bdev.num_blocks = num_blocks;
+2 −2
Original line number Diff line number Diff line
@@ -941,8 +941,8 @@ claim_test(void)
static void
bytes_to_blocks_test(void)
{
	struct spdk_bdev_desc desc;
	struct spdk_bdev bdev;
	struct spdk_bdev_desc desc = {0};
	struct spdk_bdev bdev = {0};
	uint64_t offset_blocks, num_blocks;