Commit 17bb748a authored by paul luse's avatar paul luse Committed by Jim Harris
Browse files

accel: Move non-engine specific batch to the accel_fw layer



The new design:

* Supports a generic batching capability in the accel_fw layer
that keeps track of hw accelerated vs sw commands based on
the capabilities of the engine and processes sw commands in the
generic layer while sending a list of commands (not a batch)
to the engines for processing.

* Batch completions are managed via the generic layer, when using
the accel_fw the engines only process commands. With DSA however,
if a list of commands is sent down it will use the DSA public
API to create and send batches but will rely on the generic layer
to complete the batch task itself. When using DSA directly, batching
works as usual (DSA handles batch completion).

* The engine function tables were greatly simplified by replacing
all of the individual entries (copy, fill, crc32c, etc) with one
`submit_tasks` function that is used to both send lists of tasks
for batches or just one task for single shot API.

* Internally batching is now used to re-submit tasks that were queued
for flow control reasons.

Signed-off-by: default avatarpaul luse <paul.e.luse@intel.com>
Change-Id: I99c28751df32017c43490a90f4904bdabe79a270
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3555


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
parent 8c3e71f0
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -49,9 +49,8 @@ enum accel_capability {
	ACCEL_FILL		= 1 << 1,
	ACCEL_DUALCAST		= 1 << 2,
	ACCEL_COMPARE		= 1 << 3,
	ACCEL_BATCH		= 1 << 4,
	ACCEL_CRC32C		= 1 << 5,
	ACCEL_DIF		= 1 << 6,
	ACCEL_CRC32C		= 1 << 4,
	ACCEL_DIF		= 1 << 5,
};

/**
@@ -69,10 +68,6 @@ typedef void (*spdk_accel_completion_cb)(void *ref, int status);
 */
typedef void (*spdk_accel_fini_cb)(void *cb_arg);

struct spdk_io_channel;

struct spdk_accel_batch;

/**
 * Initialize the acceleration engine.
 *
@@ -103,11 +98,11 @@ void spdk_accel_engine_module_finish(void);
struct spdk_io_channel *spdk_accel_engine_get_io_channel(void);

/**
 * Retrieve accel engine capabilities.
 * Retrieve accel engine HW acceleration capabilities.
 *
 * \param ch I/O channel associated with this call.
 *
 * \return bitmap of capabilities defined by enum accel_capability.
 * \return bitmap of HW acceleration capabilities defined by enum accel_capability.
 */
uint64_t spdk_accel_get_capabilities(struct spdk_io_channel *ch);

+53 −30
Original line number Diff line number Diff line
@@ -39,44 +39,67 @@
#include "spdk/accel_engine.h"
#include "spdk/queue.h"

struct spdk_accel_task {
	spdk_accel_completion_cb	cb;
struct spdk_accel_task;

void spdk_accel_task_complete(struct spdk_accel_task *task, int status);

struct accel_io_channel {
	struct spdk_accel_engine	*engine;
	struct spdk_io_channel		*engine_ch;
	void				*task_pool_base;
	TAILQ_HEAD(, spdk_accel_task)	task_pool;
	void				*batch_pool_base;
	TAILQ_HEAD(, spdk_accel_batch)	batch_pool;
	TAILQ_HEAD(, spdk_accel_batch)	batches;
};

struct spdk_accel_batch {
	/* Lists of commands in the batch. */
	TAILQ_HEAD(, spdk_accel_task)	hw_tasks;
	TAILQ_HEAD(, spdk_accel_task)	sw_tasks;
	/* Specific to the batch task itself. */
	int				status;
	uint32_t			count;
	spdk_accel_completion_cb	cb_fn;
	void				*cb_arg;
	struct accel_io_channel		*accel_ch;
	TAILQ_ENTRY(spdk_accel_batch)	link;
};

enum accel_opcode {
	ACCEL_OPCODE_MEMMOVE	= 0,
	ACCEL_OPCODE_MEMFILL	= 1,
	ACCEL_OPCODE_COMPARE	= 2,
	ACCEL_OPCODE_BATCH	= 3,
	ACCEL_OPCODE_CRC32C	= 4,
	ACCEL_OPCODE_DUALCAST	= 5,
};

struct spdk_accel_task {
	struct accel_io_channel		*accel_ch;
	struct spdk_accel_batch		*batch;
	spdk_accel_completion_cb	cb_fn;
	void				*cb_arg;
	void				*src;
	union {
		void			*dst;
		void			*src2;
	};
	void				*dst2;
	uint32_t			seed;
	uint64_t			fill_pattern;
	enum accel_opcode		op_code;
	uint64_t			nbytes;
	TAILQ_ENTRY(spdk_accel_task)	link;
	uint8_t				offload_ctx[0];
	uint8_t				offload_ctx[0]; /* Not currently used. */
};

struct spdk_accel_engine {
	uint64_t capabilities;
	uint64_t (*get_capabilities)(void);
	int (*copy)(struct spdk_io_channel *ch, void *dst, void *src,
		    uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*dualcast)(struct spdk_io_channel *ch, void *dst1, void *dst2, void *src,
			uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	uint32_t (*batch_get_max)(void);
	struct spdk_accel_batch *(*batch_create)(struct spdk_io_channel *ch);
	int (*batch_prep_copy)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch,
			       void *dst, void *src, uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*batch_prep_dualcast)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch,
				   void *dst1, void *dst2, void *src, uint64_t nbytes,
				   spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*batch_prep_compare)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch,
				  void *src1, void *src2, uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*batch_prep_fill)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch,
			       void *dst, uint8_t fill, uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*batch_prep_crc32c)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch,
				 uint32_t *dst, void *src, uint32_t seed, uint64_t nbytes,
				 spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*batch_submit)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch,
			    spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*batch_cancel)(struct spdk_io_channel *ch, struct spdk_accel_batch *batch);
	int (*compare)(struct spdk_io_channel *ch, void *src1, void *src2,
		       uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*fill)(struct spdk_io_channel *ch, void *dst, uint8_t fill,
		    uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	int (*crc32c)(struct spdk_io_channel *ch, uint32_t *dst, void *src,
		      uint32_t seed, uint64_t nbytes, spdk_accel_completion_cb cb_fn, void *cb_arg);
	struct spdk_io_channel *(*get_io_channel)(void);
	uint32_t (*batch_get_max)(struct spdk_io_channel *ch);
	int (*submit_tasks)(struct spdk_io_channel *ch, struct spdk_accel_task *accel_task);
};

struct spdk_accel_module_if {
+380 −537

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
	# functions needed by modules
	spdk_accel_hw_engine_register;
	spdk_accel_module_list_add;

	spdk_accel_task_complete;

	local: *;
};
+1 −1
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ DEPDIRS-blobfs_bdev += event
endif

# module/accel
DEPDIRS-accel_ioat := log ioat thread $(JSON_LIBS) accel util
DEPDIRS-accel_ioat := log ioat thread $(JSON_LIBS) accel
DEPDIRS-accel_idxd := log idxd thread $(JSON_LIBS) accel

# module/env_dpdk
Loading