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

lib/accel: add DIX generate



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

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


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

enum spdk_accel_cipher {
@@ -488,6 +489,30 @@ int spdk_accel_submit_dif_generate_copy(struct spdk_io_channel *ch, struct iovec
					uint32_t num_blocks, const struct spdk_dif_ctx *ctx,
					spdk_accel_completion_cb cb_fn, void *cb_arg);

/**
 * Submit a Data Integrity Extension (DIX) generate operation.
 *
 * This operation computes Protection Information (DIX) and inserts it into metadata buffer.
 *
 * \param ch I/O channel associated with this call.
 * \param iovs The source io vector array. The total allocated memory size needs to be at least:
 *	       num_blocks * block_size_no_md
 * \param iovcnt The size of the source 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 process.
 * \param ctx DIX context. Contains the DIX 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_dix_generate(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, 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
@@ -79,7 +79,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_verify_copy", "dif_generate", "dif_generate_copy"
	"dif_verify", "dif_verify_copy", "dif_generate", "dif_generate_copy",
	"dix_generate"
};

enum accel_sequence_state {
@@ -928,6 +929,34 @@ spdk_accel_submit_dif_verify_copy(struct spdk_io_channel *ch,
	return accel_submit_task(accel_ch, accel_task);
}

int
spdk_accel_submit_dix_generate(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, 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.num_blocks = num_blocks;
	accel_task->nbytes = num_blocks * ctx->block_size;
	accel_task->op_code = SPDK_ACCEL_OPC_DIX_GENERATE;
	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)
{
+14 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ sw_accel_supports_opcode(enum spdk_accel_opcode opc)
	case SPDK_ACCEL_OPC_DIF_GENERATE:
	case SPDK_ACCEL_OPC_DIF_GENERATE_COPY:
	case SPDK_ACCEL_OPC_DIF_VERIFY_COPY:
	case SPDK_ACCEL_OPC_DIX_GENERATE:
		return true;
	default:
		return false;
@@ -493,6 +494,16 @@ _sw_accel_dif_generate_copy(struct sw_accel_io_channel *sw_ch, struct spdk_accel
				      accel_task->dif.ctx);
}

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

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