Commit 2e599179 authored by Krzysztof Sprzaczkowski's avatar Krzysztof Sprzaczkowski Committed by Tomasz Zawadzki
Browse files

lib/accel: DIF generate accel SW implementation



Extend the Accel SW module with DIF Generate operation support.

The DIF Generate operation computes the DIF on the source data and
inserting the DIF in place into the source data.

Change-Id: I70c406d5dae4082832ddf971ad5184692bc4cf04
Signed-off-by: default avatarKrzysztof Sprzaczkowski <krzysztof.sprzaczkowski@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20706


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
parent 0ed9c53f
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -46,8 +46,9 @@ enum spdk_accel_opcode {
	SPDK_ACCEL_OPC_DECRYPT			= 9,
	SPDK_ACCEL_OPC_XOR			= 10,
	SPDK_ACCEL_OPC_DIF_VERIFY		= 11,
	SPDK_ACCEL_OPC_DIF_GENERATE_COPY	= 12,
	SPDK_ACCEL_OPC_LAST			= 13,
	SPDK_ACCEL_OPC_DIF_GENERATE		= 12,
	SPDK_ACCEL_OPC_DIF_GENERATE_COPY	= 13,
	SPDK_ACCEL_OPC_LAST			= 14,
};

enum spdk_accel_cipher {
@@ -415,6 +416,29 @@ int spdk_accel_submit_dif_verify(struct spdk_io_channel *ch,
				 const struct spdk_dif_ctx *ctx, struct spdk_dif_error *err,
				 spdk_accel_completion_cb cb_fn, void *cb_arg);

/**
 * Submit a Data Integrity Field (DIF) generate request.
 *
 * This operation compute the DIF on the source data and inserting the DIF in place into
 * the source data.
 *
 * \param ch I/O channel associated with this call.
 * \param iovs The io vector array. The total allocated memory size needs to be at least:
 *             num_blocks * block_size (including metadata)
 * \param iovcnt The size of the io vectors array.
 * \param num_blocks Number of data blocks.
 * \param ctx DIF context. Contains the DIF configuration values, including the reference
 *            Application Tag value and initial value of the Reference Tag to insert
 * \param cb_fn Called when this operation completes.
 * \param cb_arg Callback argument.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_accel_submit_dif_generate(struct spdk_io_channel *ch,
				   struct iovec *iovs, size_t iovcnt, uint32_t num_blocks,
				   const struct spdk_dif_ctx *ctx,
				   spdk_accel_completion_cb cb_fn, void *cb_arg);

/**
 * Submit a Data Integrity Field (DIF) copy and generate request.
 *
+29 −1
Original line number Diff line number Diff line
@@ -77,7 +77,8 @@ static struct spdk_spinlock g_stats_lock;

static const char *g_opcode_strings[SPDK_ACCEL_OPC_LAST] = {
	"copy", "fill", "dualcast", "compare", "crc32c", "copy_crc32c",
	"compress", "decompress", "encrypt", "decrypt", "xor", "dif_verify", "dif_generate_copy"
	"compress", "decompress", "encrypt", "decrypt", "xor",
	"dif_verify", "dif_generate", "dif_generate_copy"
};

enum accel_sequence_state {
@@ -862,6 +863,33 @@ spdk_accel_submit_dif_verify(struct spdk_io_channel *ch,
	return accel_submit_task(accel_ch, accel_task);
}

int
spdk_accel_submit_dif_generate(struct spdk_io_channel *ch,
			       struct iovec *iovs, size_t iovcnt, uint32_t num_blocks,
			       const struct spdk_dif_ctx *ctx,
			       spdk_accel_completion_cb cb_fn, void *cb_arg)
{
	struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
	struct spdk_accel_task *accel_task;

	accel_task = _get_task(accel_ch, cb_fn, cb_arg);
	if (accel_task == NULL) {
		return -ENOMEM;
	}

	accel_task->s.iovs = iovs;
	accel_task->s.iovcnt = iovcnt;
	accel_task->dif.ctx = ctx;
	accel_task->dif.num_blocks = num_blocks;
	accel_task->nbytes = num_blocks * ctx->block_size;
	accel_task->op_code = SPDK_ACCEL_OPC_DIF_GENERATE;
	accel_task->src_domain = NULL;
	accel_task->dst_domain = NULL;
	accel_task->step_cb_fn = NULL;

	return accel_submit_task(accel_ch, accel_task);
}

int
spdk_accel_submit_dif_generate_copy(struct spdk_io_channel *ch, struct iovec *dst_iovs,
				    size_t dst_iovcnt, struct iovec *src_iovs, size_t src_iovcnt,
+13 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ sw_accel_supports_opcode(enum spdk_accel_opcode opc)
	case SPDK_ACCEL_OPC_DECRYPT:
	case SPDK_ACCEL_OPC_XOR:
	case SPDK_ACCEL_OPC_DIF_VERIFY:
	case SPDK_ACCEL_OPC_DIF_GENERATE:
	case SPDK_ACCEL_OPC_DIF_GENERATE_COPY:
		return true;
	default:
@@ -454,6 +455,15 @@ _sw_accel_dif_verify(struct sw_accel_io_channel *sw_ch, struct spdk_accel_task *
			       accel_task->dif.err);
}

static int
_sw_accel_dif_generate(struct sw_accel_io_channel *sw_ch, struct spdk_accel_task *accel_task)
{
	return spdk_dif_generate(accel_task->s.iovs,
				 accel_task->s.iovcnt,
				 accel_task->dif.num_blocks,
				 accel_task->dif.ctx);
}

static int
_sw_accel_dif_generate_copy(struct sw_accel_io_channel *sw_ch, struct spdk_accel_task *accel_task)
{
@@ -518,6 +528,9 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_
		case SPDK_ACCEL_OPC_DIF_VERIFY:
			rc = _sw_accel_dif_verify(sw_ch, accel_task);
			break;
		case SPDK_ACCEL_OPC_DIF_GENERATE:
			rc = _sw_accel_dif_generate(sw_ch, accel_task);
			break;
		case SPDK_ACCEL_OPC_DIF_GENERATE_COPY:
			rc = _sw_accel_dif_generate_copy(sw_ch, accel_task);
			break;
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
	spdk_accel_submit_decrypt;
	spdk_accel_submit_xor;
	spdk_accel_submit_dif_verify;
	spdk_accel_submit_dif_generate;
	spdk_accel_submit_dif_generate_copy;
	spdk_accel_get_opc_module_name;
	spdk_accel_assign_opc;