Commit 431baf1b authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Konrad Sztyber
Browse files

dif: Insert abstraction into dif_generate/verify_copy() for NVMe PRACT



This will simplify the following changes.

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


Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Community-CI: Mellanox Build Bot
parent f8609162
Loading
Loading
Loading
Loading
+47 −30
Original line number Diff line number Diff line
@@ -1266,40 +1266,48 @@ dif_disable_insert_copy(struct _dif_sgl *src_sgl, struct _dif_sgl *dst_sgl,
	}
}

int
spdk_dif_generate_copy(struct iovec *iovs, int iovcnt, struct iovec *bounce_iovs,
		       int bounce_iovcnt, uint32_t num_blocks,
		       const struct spdk_dif_ctx *ctx)
static int
_spdk_dif_insert_copy(struct _dif_sgl *src_sgl, struct _dif_sgl *dst_sgl,
		      uint32_t num_blocks, const struct spdk_dif_ctx *ctx)
{
	struct _dif_sgl src_sgl, dst_sgl;
	uint32_t data_block_size;

	_dif_sgl_init(&src_sgl, iovs, iovcnt);
	_dif_sgl_init(&dst_sgl, bounce_iovs, bounce_iovcnt);

	data_block_size = ctx->block_size - ctx->md_size;

	if (!_dif_sgl_is_valid(&src_sgl, data_block_size * num_blocks) ||
	    !_dif_sgl_is_valid(&dst_sgl, ctx->block_size * num_blocks)) {
	if (!_dif_sgl_is_valid(src_sgl, data_block_size * num_blocks) ||
	    !_dif_sgl_is_valid(dst_sgl, ctx->block_size * num_blocks)) {
		SPDK_ERRLOG("Size of iovec arrays are not valid.\n");
		return -EINVAL;
	}

	if (_dif_is_disabled(ctx->dif_type)) {
		dif_disable_insert_copy(&src_sgl, &dst_sgl, num_blocks, ctx);
		dif_disable_insert_copy(src_sgl, dst_sgl, num_blocks, ctx);
		return 0;
	}

	if (_dif_sgl_is_bytes_multiple(&src_sgl, data_block_size) &&
	    _dif_sgl_is_bytes_multiple(&dst_sgl, ctx->block_size)) {
		dif_insert_copy(&src_sgl, &dst_sgl, num_blocks, ctx);
	if (_dif_sgl_is_bytes_multiple(src_sgl, data_block_size) &&
	    _dif_sgl_is_bytes_multiple(dst_sgl, ctx->block_size)) {
		dif_insert_copy(src_sgl, dst_sgl, num_blocks, ctx);
	} else {
		dif_insert_copy_split(&src_sgl, &dst_sgl, num_blocks, ctx);
		dif_insert_copy_split(src_sgl, dst_sgl, num_blocks, ctx);
	}

	return 0;
}

int
spdk_dif_generate_copy(struct iovec *iovs, int iovcnt, struct iovec *bounce_iovs,
		       int bounce_iovcnt, uint32_t num_blocks,
		       const struct spdk_dif_ctx *ctx)
{
	struct _dif_sgl src_sgl, dst_sgl;

	_dif_sgl_init(&src_sgl, iovs, iovcnt);
	_dif_sgl_init(&dst_sgl, bounce_iovs, bounce_iovcnt);

	return _spdk_dif_insert_copy(&src_sgl, &dst_sgl, num_blocks, ctx);
}

static int
_dif_strip_copy(struct _dif_sgl *src_sgl, struct _dif_sgl *dst_sgl,
		uint32_t offset_blocks, const struct spdk_dif_ctx *ctx,
@@ -1433,39 +1441,48 @@ dif_disable_strip_copy(struct _dif_sgl *src_sgl, struct _dif_sgl *dst_sgl,
	}
}

int
spdk_dif_verify_copy(struct iovec *iovs, int iovcnt, struct iovec *bounce_iovs,
		     int bounce_iovcnt, uint32_t num_blocks,
		     const struct spdk_dif_ctx *ctx,
static int
_spdk_dif_strip_copy(struct _dif_sgl *src_sgl, struct _dif_sgl *dst_sgl,
		     uint32_t num_blocks, const struct spdk_dif_ctx *ctx,
		     struct spdk_dif_error *err_blk)
{
	struct _dif_sgl src_sgl, dst_sgl;
	uint32_t data_block_size;

	_dif_sgl_init(&src_sgl, bounce_iovs, bounce_iovcnt);
	_dif_sgl_init(&dst_sgl, iovs, iovcnt);

	data_block_size = ctx->block_size - ctx->md_size;

	if (!_dif_sgl_is_valid(&dst_sgl, data_block_size * num_blocks) ||
	    !_dif_sgl_is_valid(&src_sgl, ctx->block_size * num_blocks)) {
	if (!_dif_sgl_is_valid(dst_sgl, data_block_size * num_blocks) ||
	    !_dif_sgl_is_valid(src_sgl, ctx->block_size * num_blocks)) {
		SPDK_ERRLOG("Size of iovec arrays are not valid\n");
		return -EINVAL;
	}

	if (_dif_is_disabled(ctx->dif_type)) {
		dif_disable_strip_copy(&src_sgl, &dst_sgl, num_blocks, ctx);
		dif_disable_strip_copy(src_sgl, dst_sgl, num_blocks, ctx);
		return 0;
	}

	if (_dif_sgl_is_bytes_multiple(&dst_sgl, data_block_size) &&
	    _dif_sgl_is_bytes_multiple(&src_sgl, ctx->block_size)) {
		return dif_strip_copy(&src_sgl, &dst_sgl, num_blocks, ctx, err_blk);
	if (_dif_sgl_is_bytes_multiple(dst_sgl, data_block_size) &&
	    _dif_sgl_is_bytes_multiple(src_sgl, ctx->block_size)) {
		return dif_strip_copy(src_sgl, dst_sgl, num_blocks, ctx, err_blk);
	} else {
		return dif_strip_copy_split(&src_sgl, &dst_sgl, num_blocks, ctx, err_blk);
		return dif_strip_copy_split(src_sgl, dst_sgl, num_blocks, ctx, err_blk);
	}
}

int
spdk_dif_verify_copy(struct iovec *iovs, int iovcnt, struct iovec *bounce_iovs,
		     int bounce_iovcnt, uint32_t num_blocks,
		     const struct spdk_dif_ctx *ctx,
		     struct spdk_dif_error *err_blk)
{
	struct _dif_sgl src_sgl, dst_sgl;

	_dif_sgl_init(&src_sgl, bounce_iovs, bounce_iovcnt);
	_dif_sgl_init(&dst_sgl, iovs, iovcnt);

	return _spdk_dif_strip_copy(&src_sgl, &dst_sgl, num_blocks, ctx, err_blk);
}

static void
_bit_flip(uint8_t *buf, uint32_t flip_bit)
{