Commit 8be8573c authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Konrad Sztyber
Browse files

lib/accel: add DIX verify



Add DIX Verify operation to the library API and to accel_sw module.

Change-Id: I9eb0123a49e3b7b9218f94ed6dba26c92d42525f
Signed-off-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24002


Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent bcd221a2
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ enum spdk_accel_opcode {
	SPDK_ACCEL_OPC_DIF_GENERATE		= 13,
	SPDK_ACCEL_OPC_DIF_GENERATE_COPY	= 14,
	SPDK_ACCEL_OPC_DIX_GENERATE		= 15,
	SPDK_ACCEL_OPC_LAST			= 16,
	SPDK_ACCEL_OPC_DIX_VERIFY		= 16,
	SPDK_ACCEL_OPC_LAST			= 17,
};

enum spdk_accel_cipher {
@@ -513,6 +514,36 @@ int spdk_accel_submit_dix_generate(struct spdk_io_channel *ch, struct iovec *iov
				   const struct spdk_dif_ctx *ctx, spdk_accel_completion_cb cb_fn,
				   void *cb_arg);

/**
 * Submit a Data Integrity Extension (DIX) verify request.
 *
 * This operation computes the Protection Information (DIX) on the data and compares it against
 * the DIX contained in the metadata.
 *
 * \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
 * \param iovcnt The size of the io vectors array.
 * \param md_iov The metadata vector array. The total allocated memory size needs to be at least:
 *		 num_blocks * md_size (8B or 16B, depending on the PI format)
 * \param num_blocks Number of data blocks to check.
 * \param ctx DIX context. Contains the DIF configuration values, including the reference
 *            Application Tag value and initial value of the Reference Tag to check
 *            Note: the user must ensure the validity of this pointer throughout the entire
 *	      operation because it is not validated along the processing path.
 * \param err DIX error detailed information.
 *            Note: the user must ensure the validity of this pointer throughout the entire
 *	      operation because it is not validated along the processing path.
 * \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_dix_verify(struct spdk_io_channel *ch, struct iovec *iovs,
				 size_t iovcnt,  struct iovec *md_iov, uint32_t num_blocks,
				 const struct spdk_dif_ctx *ctx, struct spdk_dif_error *err,
				 spdk_accel_completion_cb cb_fn, void *cb_arg);

/** Object grouping multiple accel operations to be executed at the same point in time */
struct spdk_accel_sequence;

+30 −1
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ 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_verify_copy", "dif_generate", "dif_generate_copy",
	"dix_generate"
	"dix_generate", "dix_verify"
};

enum accel_sequence_state {
@@ -957,6 +957,35 @@ spdk_accel_submit_dix_generate(struct spdk_io_channel *ch, struct iovec *iovs,
	return accel_submit_task(accel_ch, accel_task);
}

int
spdk_accel_submit_dix_verify(struct spdk_io_channel *ch, struct iovec *iovs,
			     size_t iovcnt, struct iovec *md_iov, uint32_t num_blocks,
			     const struct spdk_dif_ctx *ctx, struct spdk_dif_error *err,
			     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->d.iovs = md_iov;
	accel_task->d.iovcnt = 1;
	accel_task->dif.ctx = ctx;
	accel_task->dif.err = err;
	accel_task->dif.num_blocks = num_blocks;
	accel_task->nbytes = num_blocks * ctx->block_size;
	accel_task->op_code = SPDK_ACCEL_OPC_DIX_VERIFY;
	accel_task->src_domain = NULL;
	accel_task->dst_domain = NULL;

	return accel_submit_task(accel_ch, accel_task);
}

static inline struct accel_buffer *
accel_get_buf(struct accel_io_channel *ch, uint64_t len)
{
+15 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ sw_accel_supports_opcode(enum spdk_accel_opcode opc)
	case SPDK_ACCEL_OPC_DIF_GENERATE_COPY:
	case SPDK_ACCEL_OPC_DIF_VERIFY_COPY:
	case SPDK_ACCEL_OPC_DIX_GENERATE:
	case SPDK_ACCEL_OPC_DIX_VERIFY:
		return true;
	default:
		return false;
@@ -504,6 +505,17 @@ _sw_accel_dix_generate(struct sw_accel_io_channel *sw_ch, struct spdk_accel_task
				 accel_task->dif.ctx);
}

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

static int
accel_comp_poll(void *arg)
{
@@ -599,6 +611,9 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_
		case SPDK_ACCEL_OPC_DIX_GENERATE:
			rc = _sw_accel_dix_generate(sw_ch, accel_task);
			break;
		case SPDK_ACCEL_OPC_DIX_VERIFY:
			rc = _sw_accel_dix_verify(sw_ch, accel_task);
			break;
		default:
			assert(false);
			break;
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
	spdk_accel_submit_dif_generate;
	spdk_accel_submit_dif_generate_copy;
	spdk_accel_submit_dix_generate;
	spdk_accel_submit_dix_verify;
	spdk_accel_get_opc_module_name;
	spdk_accel_assign_opc;
	spdk_accel_write_config_json;