Commit bbd27a75 authored by Slawomir Ptak's avatar Slawomir Ptak Committed by Tomasz Zawadzki
Browse files

bdev: Add a per-IO dif check flags exclude mask



Added a way to mask the dif check flags bits on a per-IO basis.

Change-Id: Ib513841a4531ea7e4cee483d4002002fe6f0b8ff
Signed-off-by: default avatarSlawomir Ptak <slawomir.ptak@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21476


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 9e60b74b
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -227,8 +227,14 @@ struct spdk_bdev_ext_io_opts {
	 * request is submitted.
	 */
	struct spdk_accel_sequence *accel_sequence;
	/**
	 * Specify which DIF check flags to exclude on a per-IO basis. The default value is
	 * all zeroes, which includes all of the flags set for this bdev. If any of the flags
	 * is set, that flag will be excluded from any DIF operations for this IO.
	 */
	uint32_t dif_check_flags_exclude_mask;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct spdk_bdev_ext_io_opts) == 40, "Incorrect size");
SPDK_STATIC_ASSERT(sizeof(struct spdk_bdev_ext_io_opts) == 44, "Incorrect size");

/**
 * Get the options for the bdev module.
+3 −0
Original line number Diff line number Diff line
@@ -832,6 +832,9 @@ struct spdk_bdev_io {
			/** count of outstanding batched split I/Os */
			uint32_t split_outstanding;

			/** Specify whether each DIF check type is enabled. */
			uint32_t dif_check_flags;

			struct {
				/** Whether the buffer should be populated with the real data */
				uint8_t populate : 1;
+38 −14
Original line number Diff line number Diff line
@@ -408,13 +408,13 @@ static int bdev_readv_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io
				     struct iovec *iov, int iovcnt, void *md_buf, uint64_t offset_blocks,
				     uint64_t num_blocks,
				     struct spdk_memory_domain *domain, void *domain_ctx,
				     struct spdk_accel_sequence *seq,
				     struct spdk_accel_sequence *seq, uint32_t dif_check_flags,
				     spdk_bdev_io_completion_cb cb, void *cb_arg);
static int bdev_writev_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
				      struct iovec *iov, int iovcnt, void *md_buf,
				      uint64_t offset_blocks, uint64_t num_blocks,
				      struct spdk_memory_domain *domain, void *domain_ctx,
				      struct spdk_accel_sequence *seq,
				      struct spdk_accel_sequence *seq, uint32_t dif_check_flags,
				      spdk_bdev_io_completion_cb cb, void *cb_arg);

static int bdev_lock_lba_range(struct spdk_bdev_desc *desc, struct spdk_io_channel *_ch,
@@ -3001,6 +3001,7 @@ bdev_io_split_submit(struct spdk_bdev_io *bdev_io, struct iovec *iov, int iovcnt
					       iov, iovcnt, md_buf, current_offset,
					       num_blocks, bdev_io->internal.memory_domain,
					       bdev_io->internal.memory_domain_ctx, NULL,
					       bdev_io->u.bdev.dif_check_flags,
					       bdev_io_split_done, bdev_io);
		break;
	case SPDK_BDEV_IO_TYPE_WRITE:
@@ -3010,6 +3011,7 @@ bdev_io_split_submit(struct spdk_bdev_io *bdev_io, struct iovec *iov, int iovcnt
						iov, iovcnt, md_buf, current_offset,
						num_blocks, bdev_io->internal.memory_domain,
						bdev_io->internal.memory_domain_ctx, NULL,
						bdev_io->u.bdev.dif_check_flags,
						bdev_io_split_done, bdev_io);
		break;
	case SPDK_BDEV_IO_TYPE_UNMAP:
@@ -5266,6 +5268,7 @@ bdev_read_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch
	bdev_io->u.bdev.memory_domain = NULL;
	bdev_io->u.bdev.memory_domain_ctx = NULL;
	bdev_io->u.bdev.accel_sequence = NULL;
	bdev_io->u.bdev.dif_check_flags = bdev->dif_check_flags;
	bdev_io_init(bdev_io, bdev, cb_arg, cb);

	bdev_io_submit(bdev_io);
@@ -5336,7 +5339,7 @@ static int
bdev_readv_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
			  struct iovec *iov, int iovcnt, void *md_buf, uint64_t offset_blocks,
			  uint64_t num_blocks, struct spdk_memory_domain *domain, void *domain_ctx,
			  struct spdk_accel_sequence *seq,
			  struct spdk_accel_sequence *seq, uint32_t dif_check_flags,
			  spdk_bdev_io_completion_cb cb, void *cb_arg)
{
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);
@@ -5368,6 +5371,7 @@ bdev_readv_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *c
	bdev_io->u.bdev.memory_domain = domain;
	bdev_io->u.bdev.memory_domain_ctx = domain_ctx;
	bdev_io->u.bdev.accel_sequence = seq;
	bdev_io->u.bdev.dif_check_flags = dif_check_flags;

	_bdev_io_submit_ext(desc, bdev_io);

@@ -5380,8 +5384,10 @@ spdk_bdev_readv_blocks(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
		       uint64_t offset_blocks, uint64_t num_blocks,
		       spdk_bdev_io_completion_cb cb, void *cb_arg)
{
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	return bdev_readv_blocks_with_md(desc, ch, iov, iovcnt, NULL, offset_blocks,
					 num_blocks, NULL, NULL, NULL, cb, cb_arg);
					 num_blocks, NULL, NULL, NULL, bdev->dif_check_flags, cb, cb_arg);
}

int
@@ -5390,7 +5396,9 @@ spdk_bdev_readv_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_chann
			       uint64_t offset_blocks, uint64_t num_blocks,
			       spdk_bdev_io_completion_cb cb, void *cb_arg)
{
	if (md_buf && !spdk_bdev_is_md_separate(spdk_bdev_desc_get_bdev(desc))) {
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	if (md_buf && !spdk_bdev_is_md_separate(bdev)) {
		return -EINVAL;
	}

@@ -5399,7 +5407,7 @@ spdk_bdev_readv_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_chann
	}

	return bdev_readv_blocks_with_md(desc, ch, iov, iovcnt, md_buf, offset_blocks,
					 num_blocks, NULL, NULL, NULL, cb, cb_arg);
					 num_blocks, NULL, NULL, NULL, bdev->dif_check_flags, cb, cb_arg);
}

static inline bool
@@ -5427,6 +5435,8 @@ spdk_bdev_readv_blocks_ext(struct spdk_bdev_desc *desc, struct spdk_io_channel *
	struct spdk_memory_domain *domain = NULL;
	struct spdk_accel_sequence *seq = NULL;
	void *domain_ctx = NULL, *md = NULL;
	uint32_t dif_check_flags = 0;
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	if (opts) {
		if (spdk_unlikely(!_bdev_io_check_opts(opts, iov))) {
@@ -5438,7 +5448,7 @@ spdk_bdev_readv_blocks_ext(struct spdk_bdev_desc *desc, struct spdk_io_channel *
		domain_ctx = bdev_get_ext_io_opt(opts, memory_domain_ctx, NULL);
		seq = bdev_get_ext_io_opt(opts, accel_sequence, NULL);
		if (md) {
			if (spdk_unlikely(!spdk_bdev_is_md_separate(spdk_bdev_desc_get_bdev(desc)))) {
			if (spdk_unlikely(!spdk_bdev_is_md_separate(bdev))) {
				return -EINVAL;
			}

@@ -5452,8 +5462,11 @@ spdk_bdev_readv_blocks_ext(struct spdk_bdev_desc *desc, struct spdk_io_channel *
		}
	}

	dif_check_flags = bdev->dif_check_flags &
			  ~(bdev_get_ext_io_opt(opts, dif_check_flags_exclude_mask, 0));

	return bdev_readv_blocks_with_md(desc, ch, iov, iovcnt, md, offset_blocks,
					 num_blocks, domain, domain_ctx, seq, cb, cb_arg);
					 num_blocks, domain, domain_ctx, seq, dif_check_flags, cb, cb_arg);
}

static int
@@ -5491,6 +5504,7 @@ bdev_write_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *c
	bdev_io->u.bdev.memory_domain = NULL;
	bdev_io->u.bdev.memory_domain_ctx = NULL;
	bdev_io->u.bdev.accel_sequence = NULL;
	bdev_io->u.bdev.dif_check_flags = bdev->dif_check_flags;
	bdev_io_init(bdev_io, bdev, cb_arg, cb);

	bdev_io_submit(bdev_io);
@@ -5547,7 +5561,7 @@ bdev_writev_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *
			   struct iovec *iov, int iovcnt, void *md_buf,
			   uint64_t offset_blocks, uint64_t num_blocks,
			   struct spdk_memory_domain *domain, void *domain_ctx,
			   struct spdk_accel_sequence *seq,
			   struct spdk_accel_sequence *seq, uint32_t dif_check_flags,
			   spdk_bdev_io_completion_cb cb, void *cb_arg)
{
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);
@@ -5583,6 +5597,7 @@ bdev_writev_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_channel *
	bdev_io->u.bdev.memory_domain = domain;
	bdev_io->u.bdev.memory_domain_ctx = domain_ctx;
	bdev_io->u.bdev.accel_sequence = seq;
	bdev_io->u.bdev.dif_check_flags = dif_check_flags;

	_bdev_io_submit_ext(desc, bdev_io);

@@ -5611,8 +5626,10 @@ spdk_bdev_writev_blocks(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
			uint64_t offset_blocks, uint64_t num_blocks,
			spdk_bdev_io_completion_cb cb, void *cb_arg)
{
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	return bdev_writev_blocks_with_md(desc, ch, iov, iovcnt, NULL, offset_blocks,
					  num_blocks, NULL, NULL, NULL, cb, cb_arg);
					  num_blocks, NULL, NULL, NULL, bdev->dif_check_flags, cb, cb_arg);
}

int
@@ -5621,7 +5638,9 @@ spdk_bdev_writev_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_chan
				uint64_t offset_blocks, uint64_t num_blocks,
				spdk_bdev_io_completion_cb cb, void *cb_arg)
{
	if (md_buf && !spdk_bdev_is_md_separate(spdk_bdev_desc_get_bdev(desc))) {
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	if (md_buf && !spdk_bdev_is_md_separate(bdev)) {
		return -EINVAL;
	}

@@ -5630,7 +5649,7 @@ spdk_bdev_writev_blocks_with_md(struct spdk_bdev_desc *desc, struct spdk_io_chan
	}

	return bdev_writev_blocks_with_md(desc, ch, iov, iovcnt, md_buf, offset_blocks,
					  num_blocks, NULL, NULL, NULL, cb, cb_arg);
					  num_blocks, NULL, NULL, NULL, bdev->dif_check_flags, cb, cb_arg);
}

int
@@ -5643,6 +5662,8 @@ spdk_bdev_writev_blocks_ext(struct spdk_bdev_desc *desc, struct spdk_io_channel
	struct spdk_memory_domain *domain = NULL;
	struct spdk_accel_sequence *seq = NULL;
	void *domain_ctx = NULL, *md = NULL;
	uint32_t dif_check_flags = 0;
	struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(desc);

	if (opts) {
		if (spdk_unlikely(!_bdev_io_check_opts(opts, iov))) {
@@ -5654,7 +5675,7 @@ spdk_bdev_writev_blocks_ext(struct spdk_bdev_desc *desc, struct spdk_io_channel
		domain_ctx = bdev_get_ext_io_opt(opts, memory_domain_ctx, NULL);
		seq = bdev_get_ext_io_opt(opts, accel_sequence, NULL);
		if (md) {
			if (spdk_unlikely(!spdk_bdev_is_md_separate(spdk_bdev_desc_get_bdev(desc)))) {
			if (spdk_unlikely(!spdk_bdev_is_md_separate(bdev))) {
				return -EINVAL;
			}

@@ -5668,8 +5689,11 @@ spdk_bdev_writev_blocks_ext(struct spdk_bdev_desc *desc, struct spdk_io_channel
		}
	}

	dif_check_flags = bdev->dif_check_flags &
			  ~(bdev_get_ext_io_opt(opts, dif_check_flags_exclude_mask, 0));

	return bdev_writev_blocks_with_md(desc, ch, iov, iovcnt, md, offset_blocks, num_blocks,
					  domain, domain_ctx, seq, cb, cb_arg);
					  domain, domain_ctx, seq, dif_check_flags, cb, cb_arg);
}

static void
+8 −4
Original line number Diff line number Diff line
@@ -5853,7 +5853,8 @@ bdev_io_ext(void)
{
	struct spdk_bdev_ext_io_opts ext_io_opts = {
		.metadata = (void *)0xFF000000,
		.size = sizeof(ext_io_opts)
		.size = sizeof(ext_io_opts),
		.dif_check_flags_exclude_mask = 0
	};

	_bdev_io_ext(&ext_io_opts);
@@ -5875,7 +5876,8 @@ bdev_io_ext_invalid_opts(void)
	struct iovec iov = { .iov_base = io_buf, .iov_len = 512 };
	struct spdk_bdev_ext_io_opts ext_io_opts = {
		.metadata = (void *)0xFF000000,
		.size = sizeof(ext_io_opts)
		.size = sizeof(ext_io_opts),
		.dif_check_flags_exclude_mask = 0
	};
	int rc;

@@ -5929,7 +5931,8 @@ bdev_io_ext_split(void)
	struct ut_expected_io *expected_io;
	struct spdk_bdev_ext_io_opts ext_io_opts = {
		.metadata = (void *)0xFF000000,
		.size = sizeof(ext_io_opts)
		.size = sizeof(ext_io_opts),
		.dif_check_flags_exclude_mask = 0
	};
	int rc;

@@ -6021,7 +6024,8 @@ bdev_io_ext_bounce_buffer(void)
	struct ut_expected_io *expected_io, *aux_io;
	struct spdk_bdev_ext_io_opts ext_io_opts = {
		.metadata = (void *)0xFF000000,
		.size = sizeof(ext_io_opts)
		.size = sizeof(ext_io_opts),
		.dif_check_flags_exclude_mask = 0
	};
	int rc;