accel: Combine spdk_accel_engine and spdk_accel_module_if

These are 1:1 - they do not need to be separate objects.

Change-Id: I74ab52863f911d9be59ce98e1525302b5bd40846
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13910
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
Ben Walker 2022-08-05 12:25:33 -07:00 committed by Tomasz Zawadzki
parent ba7331a712
commit aa156d53be
8 changed files with 178 additions and 222 deletions

View File

@ -78,14 +78,6 @@ struct spdk_accel_task {
TAILQ_ENTRY(spdk_accel_task) link;
};
struct spdk_accel_engine {
const char *name;
bool (*supports_opcode)(enum accel_opcode);
struct spdk_io_channel *(*get_io_channel)(void);
int (*submit_tasks)(struct spdk_io_channel *ch, struct spdk_accel_task *accel_task);
TAILQ_ENTRY(spdk_accel_engine) tailq;
};
struct spdk_accel_module_if {
/** Initialization function for the module. Called by the spdk
* application during startup.
@ -111,10 +103,14 @@ struct spdk_accel_module_if {
*/
size_t (*get_ctx_size)(void);
const char *name;
bool (*supports_opcode)(enum accel_opcode);
struct spdk_io_channel *(*get_io_channel)(void);
int (*submit_tasks)(struct spdk_io_channel *ch, struct spdk_accel_task *accel_task);
TAILQ_ENTRY(spdk_accel_module_if) tailq;
};
void spdk_accel_engine_register(struct spdk_accel_engine *accel_engine);
void spdk_accel_module_list_add(struct spdk_accel_module_if *accel_module);
#define SPDK_ACCEL_MODULE_REGISTER(name, module) \

View File

@ -6,8 +6,8 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
SO_VER := 9
SO_MINOR := 1
SO_VER := 10
SO_MINOR := 0
SO_SUFFIX := $(SO_VER).$(SO_MINOR)
LIBNAME = accel

View File

@ -41,12 +41,8 @@ static bool g_engine_started = false;
static TAILQ_HEAD(, spdk_accel_module_if) spdk_accel_module_list =
TAILQ_HEAD_INITIALIZER(spdk_accel_module_list);
/* Global list of registered engines */
static TAILQ_HEAD(, spdk_accel_engine) g_engine_list =
TAILQ_HEAD_INITIALIZER(g_engine_list);
/* Global array mapping capabilities to engines */
static struct spdk_accel_engine *g_engines_opc[ACCEL_OPC_LAST] = {};
static struct spdk_accel_module_if *g_engines_opc[ACCEL_OPC_LAST] = {};
static char *g_engines_opc_override[ACCEL_OPC_LAST] = {};
static int sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *first_task);
@ -71,11 +67,11 @@ spdk_accel_get_opc_engine_name(enum accel_opcode opcode, const char **engine_nam
void
_accel_for_each_engine(struct engine_info *info, _accel_for_each_engine_fn fn)
{
struct spdk_accel_engine *accel_engine;
struct spdk_accel_module_if *accel_engine;
enum accel_opcode opcode;
int j = 0;
TAILQ_FOREACH(accel_engine, &g_engine_list, tailq) {
TAILQ_FOREACH(accel_engine, &spdk_accel_module_list, tailq) {
for (opcode = 0; opcode < ACCEL_OPC_LAST; opcode++) {
if (accel_engine->supports_opcode(opcode)) {
info->ops[j] = opcode;
@ -108,41 +104,6 @@ spdk_accel_assign_opc(enum accel_opcode opcode, const char *name)
return 0;
}
static struct spdk_accel_engine *
_engine_find_by_name(const char *name)
{
struct spdk_accel_engine *accel_engine = NULL;
TAILQ_FOREACH(accel_engine, &g_engine_list, tailq) {
if (strcmp(name, accel_engine->name) == 0) {
break;
}
}
return accel_engine;
}
/* Registration of all engines */
void
spdk_accel_engine_register(struct spdk_accel_engine *engine)
{
if (_engine_find_by_name(engine->name)) {
SPDK_NOTICELOG("Accel engine %s already registered\n", engine->name);
assert(false);
return;
}
/* Make sure that the software engine is at the head of the list, this
* will assure that all opcodes are later assigned to software first and
* then udpated to HW engines as they are registered.
*/
if (strcmp(engine->name, "software") == 0) {
TAILQ_INSERT_HEAD(&g_engine_list, engine, tailq);
} else {
TAILQ_INSERT_TAIL(&g_engine_list, engine, tailq);
}
}
void
spdk_accel_task_complete(struct spdk_accel_task *accel_task, int status)
{
@ -210,7 +171,7 @@ spdk_accel_submit_copy(struct spdk_io_channel *ch, void *dst, void *src,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_COPY];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_COPY];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_COPY];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -235,7 +196,7 @@ spdk_accel_submit_dualcast(struct spdk_io_channel *ch, void *dst1,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_DUALCAST];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_DUALCAST];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_DUALCAST];
if ((uintptr_t)dst1 & (ALIGN_4K - 1) || (uintptr_t)dst2 & (ALIGN_4K - 1)) {
@ -266,7 +227,7 @@ spdk_accel_submit_compare(struct spdk_io_channel *ch, void *src1,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_COMPARE];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_COMPARE];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_COMPARE];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -290,7 +251,7 @@ spdk_accel_submit_fill(struct spdk_io_channel *ch, void *dst,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_FILL];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_FILL];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_FILL];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -315,7 +276,7 @@ spdk_accel_submit_crc32c(struct spdk_io_channel *ch, uint32_t *crc_dst,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_CRC32C];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_CRC32C];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_CRC32C];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -341,7 +302,7 @@ spdk_accel_submit_crc32cv(struct spdk_io_channel *ch, uint32_t *crc_dst,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_CRC32C];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_CRC32C];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_CRC32C];
if (iov == NULL) {
@ -378,7 +339,7 @@ spdk_accel_submit_copy_crc32c(struct spdk_io_channel *ch, void *dst,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_COPY_CRC32C];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_COPY_CRC32C];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_COPY_CRC32C];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -406,7 +367,7 @@ spdk_accel_submit_copy_crc32cv(struct spdk_io_channel *ch, void *dst,
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_COPY_CRC32C];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_COPY_CRC32C];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_COPY_CRC32C];
uint64_t nbytes;
uint32_t i;
@ -452,7 +413,7 @@ spdk_accel_submit_compress(struct spdk_io_channel *ch, void *dst, void *src, uin
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_COMPRESS];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_COMPRESS];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_COMPRESS];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -479,7 +440,7 @@ spdk_accel_submit_decompress(struct spdk_io_channel *ch, void *dst, void *src, u
{
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct spdk_accel_task *accel_task;
struct spdk_accel_engine *engine = g_engines_opc[ACCEL_OPC_DECOMPRESS];
struct spdk_accel_module_if *engine = g_engines_opc[ACCEL_OPC_DECOMPRESS];
struct spdk_io_channel *engine_ch = accel_ch->engine_ch[ACCEL_OPC_DECOMPRESS];
accel_task = _get_task(accel_ch, cb_fn, cb_arg);
@ -499,11 +460,41 @@ spdk_accel_submit_decompress(struct spdk_io_channel *ch, void *dst, void *src, u
return 0;
}
static struct spdk_accel_module_if *
_module_find_by_name(const char *name)
{
struct spdk_accel_module_if *accel_module = NULL;
TAILQ_FOREACH(accel_module, &spdk_accel_module_list, tailq) {
if (strcmp(name, accel_module->name) == 0) {
break;
}
}
return accel_module;
}
/* Helper function when when accel modules register with the framework. */
void
spdk_accel_module_list_add(struct spdk_accel_module_if *accel_module)
{
if (_module_find_by_name(accel_module->name)) {
SPDK_NOTICELOG("Accel module %s already registered\n", accel_module->name);
assert(false);
return;
}
/* Make sure that the software module is at the head of the list, this
* will assure that all opcodes are later assigned to software first and
* then udpated to HW engines as they are registered.
*/
if (strcmp(accel_module->name, "software") == 0) {
TAILQ_INSERT_HEAD(&spdk_accel_module_list, accel_module, tailq);
} else {
TAILQ_INSERT_TAIL(&spdk_accel_module_list, accel_module, tailq);
}
if (accel_module->get_ctx_size && accel_module->get_ctx_size() > g_max_accel_module_size) {
g_max_accel_module_size = accel_module->get_ctx_size();
}
@ -604,7 +595,7 @@ int
spdk_accel_engine_initialize(void)
{
enum accel_opcode op;
struct spdk_accel_engine *accel_engine = NULL;
struct spdk_accel_module_if *accel_module = NULL;
g_engine_started = true;
accel_engine_module_initialize();
@ -615,11 +606,11 @@ spdk_accel_engine_initialize(void)
* NOTE: all opcodes must be suported by software in the event that no HW
* engines are initilaized to support the operation.
*/
TAILQ_FOREACH(accel_engine, &g_engine_list, tailq) {
TAILQ_FOREACH(accel_module, &spdk_accel_module_list, tailq) {
for (op = 0; op < ACCEL_OPC_LAST; op++) {
if (accel_engine->supports_opcode(op)) {
g_engines_opc[op] = accel_engine;
SPDK_DEBUGLOG(accel, "OPC 0x%x now assigned to %s\n", op, accel_engine->name);
if (accel_module->supports_opcode(op)) {
g_engines_opc[op] = accel_module;
SPDK_DEBUGLOG(accel, "OPC 0x%x now assigned to %s\n", op, accel_module->name);
}
}
}
@ -627,16 +618,16 @@ spdk_accel_engine_initialize(void)
/* Now lets check for overrides and apply all that exist */
for (op = 0; op < ACCEL_OPC_LAST; op++) {
if (g_engines_opc_override[op] != NULL) {
accel_engine = _engine_find_by_name(g_engines_opc_override[op]);
if (accel_engine == NULL) {
SPDK_ERRLOG("Invalid engine name of %s\n", g_engines_opc_override[op]);
accel_module = _module_find_by_name(g_engines_opc_override[op]);
if (accel_module == NULL) {
SPDK_ERRLOG("Invalid module name of %s\n", g_engines_opc_override[op]);
return -EINVAL;
}
if (accel_engine->supports_opcode(op) == false) {
SPDK_ERRLOG("Engine %s does not support op code %d\n", accel_engine->name, op);
if (accel_module->supports_opcode(op) == false) {
SPDK_ERRLOG("Engine %s does not support op code %d\n", accel_module->name, op);
return -EINVAL;
}
g_engines_opc[op] = accel_engine;
g_engines_opc[op] = accel_module;
}
}
@ -717,7 +708,9 @@ spdk_accel_engine_finish(spdk_accel_fini_cb cb_fn, void *cb_arg)
for (op = 0; op < ACCEL_OPC_LAST; op++) {
if (g_engines_opc_override[op] != NULL) {
free(g_engines_opc_override[op]);
g_engines_opc_override[op] = NULL;
}
g_engines_opc[op] = NULL;
}
spdk_io_device_unregister(&spdk_accel_module_list, NULL);
@ -961,12 +954,19 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_
}
static struct spdk_io_channel *sw_accel_get_io_channel(void);
static int sw_accel_engine_init(void);
static void sw_accel_engine_fini(void *ctxt);
static size_t sw_accel_engine_get_ctx_size(void);
static struct spdk_accel_engine sw_accel_engine = {
static struct spdk_accel_module_if g_sw_module = {
.module_init = sw_accel_engine_init,
.module_fini = sw_accel_engine_fini,
.write_config_json = NULL,
.get_ctx_size = sw_accel_engine_get_ctx_size,
.name = "software",
.supports_opcode = sw_accel_supports_opcode,
.get_io_channel = sw_accel_get_io_channel,
.submit_tasks = sw_accel_submit_tasks,
.submit_tasks = sw_accel_submit_tasks
};
static int
@ -1013,7 +1013,7 @@ sw_accel_destroy_cb(void *io_device, void *ctx_buf)
static struct spdk_io_channel *
sw_accel_get_io_channel(void)
{
return spdk_get_io_channel(&sw_accel_engine);
return spdk_get_io_channel(&g_sw_module);
}
static size_t
@ -1025,9 +1025,7 @@ sw_accel_engine_get_ctx_size(void)
static int
sw_accel_engine_init(void)
{
SPDK_NOTICELOG("Accel framework software engine initialized.\n");
spdk_accel_engine_register(&sw_accel_engine);
spdk_io_device_register(&sw_accel_engine, sw_accel_create_cb, sw_accel_destroy_cb,
spdk_io_device_register(&g_sw_module, sw_accel_create_cb, sw_accel_destroy_cb,
sizeof(struct sw_accel_io_channel), "sw_accel_engine");
return 0;
@ -1036,28 +1034,11 @@ sw_accel_engine_init(void)
static void
sw_accel_engine_fini(void *ctxt)
{
struct spdk_accel_engine *accel_engine;
spdk_io_device_unregister(&sw_accel_engine, NULL);
/* unregister the software engine */
TAILQ_FOREACH(accel_engine, &g_engine_list, tailq) {
if (strcmp(accel_engine->name, "software") == 0) {
TAILQ_REMOVE(&g_engine_list, accel_engine, tailq);
break;
}
}
spdk_io_device_unregister(&g_sw_module, NULL);
spdk_accel_engine_module_finish();
}
SPDK_LOG_REGISTER_COMPONENT(accel)
static struct spdk_accel_module_if g_sw_module = {
.module_init = sw_accel_engine_init,
.module_fini = sw_accel_engine_fini,
.write_config_json = NULL,
.get_ctx_size = sw_accel_engine_get_ctx_size
};
SPDK_ACCEL_MODULE_REGISTER(sw, &g_sw_module)

View File

@ -21,7 +21,6 @@
spdk_accel_write_config_json;
# functions needed by modules
spdk_accel_engine_register;
spdk_accel_module_list_add;
spdk_accel_task_complete;

View File

@ -292,6 +292,10 @@ accel_engine_dsa_get_ctx_size(void)
static bool
dsa_supports_opcode(enum accel_opcode opc)
{
if (!g_dsa_initialized) {
return false;
}
switch (opc) {
case ACCEL_OPC_COPY:
case ACCEL_OPC_FILL:
@ -305,13 +309,23 @@ dsa_supports_opcode(enum accel_opcode opc)
}
}
static struct spdk_accel_engine dsa_accel_engine = {
static int accel_engine_dsa_init(void);
static void accel_engine_dsa_exit(void *ctx);
static void accel_engine_dsa_write_config_json(struct spdk_json_write_ctx *w);
static struct spdk_accel_module_if g_dsa_module = {
.module_init = accel_engine_dsa_init,
.module_fini = accel_engine_dsa_exit,
.write_config_json = accel_engine_dsa_write_config_json,
.get_ctx_size = accel_engine_dsa_get_ctx_size,
.name = "dsa",
.supports_opcode = dsa_supports_opcode,
.get_io_channel = dsa_get_io_channel,
.submit_tasks = dsa_submit_tasks,
.submit_tasks = dsa_submit_tasks
};
SPDK_ACCEL_MODULE_REGISTER(dsa, &g_dsa_module)
static int
dsa_create_cb(void *io_device, void *ctx_buf)
{
@ -345,7 +359,7 @@ dsa_destroy_cb(void *io_device, void *ctx_buf)
static struct spdk_io_channel *
dsa_get_io_channel(void)
{
return spdk_get_io_channel(&dsa_accel_engine);
return spdk_get_io_channel(&g_dsa_module);
}
static void
@ -405,8 +419,7 @@ accel_engine_dsa_init(void)
g_dsa_initialized = true;
SPDK_NOTICELOG("Accel framework DSA engine initialized.\n");
spdk_accel_engine_register(&dsa_accel_engine);
spdk_io_device_register(&dsa_accel_engine, dsa_create_cb, dsa_destroy_cb,
spdk_io_device_register(&g_dsa_module, dsa_create_cb, dsa_destroy_cb,
sizeof(struct idxd_io_channel), "dsa_accel_engine");
return 0;
}
@ -417,7 +430,8 @@ accel_engine_dsa_exit(void *ctx)
struct idxd_device *dev;
if (g_dsa_initialized) {
spdk_io_device_unregister(&dsa_accel_engine, NULL);
spdk_io_device_unregister(&g_dsa_module, NULL);
g_dsa_initialized = false;
}
while (!TAILQ_EMPTY(&g_dsa_devices)) {
@ -453,13 +467,4 @@ SPDK_TRACE_REGISTER_FN(dsa_trace, "dsa", TRACE_GROUP_ACCEL_DSA)
0, SPDK_TRACE_ARG_TYPE_INT, "count");
}
static struct spdk_accel_module_if g_dsa_module = {
.module_init = accel_engine_dsa_init,
.module_fini = accel_engine_dsa_exit,
.write_config_json = accel_engine_dsa_write_config_json,
.get_ctx_size = accel_engine_dsa_get_ctx_size
};
SPDK_ACCEL_MODULE_REGISTER(dsa, &g_dsa_module)
SPDK_LOG_REGISTER_COMPONENT(accel_dsa)

View File

@ -236,6 +236,10 @@ accel_engine_iaa_get_ctx_size(void)
static bool
iaa_supports_opcode(enum accel_opcode opc)
{
if (!g_iaa_initialized) {
return false;
}
switch (opc) {
case ACCEL_OPC_COMPRESS:
case ACCEL_OPC_DECOMPRESS:
@ -245,13 +249,23 @@ iaa_supports_opcode(enum accel_opcode opc)
}
}
static struct spdk_accel_engine iaa_accel_engine = {
static int accel_engine_iaa_init(void);
static void accel_engine_iaa_exit(void *ctx);
static void accel_engine_iaa_write_config_json(struct spdk_json_write_ctx *w);
static struct spdk_accel_module_if g_iaa_module = {
.module_init = accel_engine_iaa_init,
.module_fini = accel_engine_iaa_exit,
.write_config_json = accel_engine_iaa_write_config_json,
.get_ctx_size = accel_engine_iaa_get_ctx_size,
.name = "iaa",
.supports_opcode = iaa_supports_opcode,
.get_io_channel = iaa_get_io_channel,
.submit_tasks = iaa_submit_tasks,
.submit_tasks = iaa_submit_tasks
};
SPDK_ACCEL_MODULE_REGISTER(iaa, &g_iaa_module)
static int
idxd_create_cb(void *io_device, void *ctx_buf)
{
@ -285,7 +299,7 @@ idxd_destroy_cb(void *io_device, void *ctx_buf)
static struct spdk_io_channel *
iaa_get_io_channel(void)
{
return spdk_get_io_channel(&iaa_accel_engine);
return spdk_get_io_channel(&g_iaa_module);
}
static void
@ -327,7 +341,7 @@ caller_probe_cb(void *cb_ctx, struct spdk_pci_device *dev)
}
static int
iaccel_engine_iaa_init(void)
accel_engine_iaa_init(void)
{
if (!g_iaa_enable) {
return -EINVAL;
@ -345,8 +359,7 @@ iaccel_engine_iaa_init(void)
g_iaa_initialized = true;
SPDK_NOTICELOG("Accel framework IAA engine initialized.\n");
spdk_accel_engine_register(&iaa_accel_engine);
spdk_io_device_register(&iaa_accel_engine, idxd_create_cb, idxd_destroy_cb,
spdk_io_device_register(&g_iaa_module, idxd_create_cb, idxd_destroy_cb,
sizeof(struct idxd_io_channel), "iaa_accel_engine");
return 0;
}
@ -357,7 +370,8 @@ accel_engine_iaa_exit(void *ctx)
struct idxd_device *dev;
if (g_iaa_initialized) {
spdk_io_device_unregister(&iaa_accel_engine, NULL);
spdk_io_device_unregister(&g_iaa_module, NULL);
g_iaa_initialized = false;
}
while (!TAILQ_EMPTY(&g_iaa_devices)) {
@ -389,13 +403,4 @@ SPDK_TRACE_REGISTER_FN(iaa_trace, "iaa", TRACE_GROUP_ACCEL_IAA)
OBJECT_NONE, 0, SPDK_TRACE_ARG_TYPE_INT, "count");
}
static struct spdk_accel_module_if g_iaa_module = {
.module_init = iaccel_engine_iaa_init,
.module_fini = accel_engine_iaa_exit,
.write_config_json = accel_engine_iaa_write_config_json,
.get_ctx_size = accel_engine_iaa_get_ctx_size
};
SPDK_ACCEL_MODULE_REGISTER(iaa, &g_iaa_module)
SPDK_LOG_REGISTER_COMPONENT(accel_iaa)

View File

@ -69,6 +69,9 @@ ioat_free_device(struct ioat_device *dev)
static int accel_engine_ioat_init(void);
static void accel_engine_ioat_exit(void *ctx);
static bool ioat_supports_opcode(enum accel_opcode opc);
static struct spdk_io_channel *ioat_get_io_channel(void);
static int ioat_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_task);
static size_t
accel_engine_ioat_get_ctx_size(void)
@ -80,7 +83,11 @@ static struct spdk_accel_module_if g_ioat_module = {
.module_init = accel_engine_ioat_init,
.module_fini = accel_engine_ioat_exit,
.write_config_json = NULL,
.get_ctx_size = accel_engine_ioat_get_ctx_size
.get_ctx_size = accel_engine_ioat_get_ctx_size,
.name = "ioat",
.supports_opcode = ioat_supports_opcode,
.get_io_channel = ioat_get_io_channel,
.submit_tasks = ioat_submit_tasks
};
SPDK_ACCEL_MODULE_REGISTER(ioat, &g_ioat_module)
@ -107,6 +114,10 @@ static struct spdk_io_channel *ioat_get_io_channel(void);
static bool
ioat_supports_opcode(enum accel_opcode opc)
{
if (!g_ioat_initialized) {
return false;
}
switch (opc) {
case ACCEL_OPC_COPY:
case ACCEL_OPC_FILL:
@ -159,13 +170,6 @@ ioat_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_task
return 0;
}
static struct spdk_accel_engine ioat_accel_engine = {
.name = "ioat",
.supports_opcode = ioat_supports_opcode,
.get_io_channel = ioat_get_io_channel,
.submit_tasks = ioat_submit_tasks,
};
static int
ioat_create_cb(void *io_device, void *ctx_buf)
{
@ -196,7 +200,7 @@ ioat_destroy_cb(void *io_device, void *ctx_buf)
static struct spdk_io_channel *
ioat_get_io_channel(void)
{
return spdk_get_io_channel(&ioat_accel_engine);
return spdk_get_io_channel(&g_ioat_module);
}
static bool
@ -269,8 +273,7 @@ accel_engine_ioat_init(void)
g_ioat_initialized = true;
SPDK_NOTICELOG("Accel framework IOAT engine initialized.\n");
spdk_accel_engine_register(&ioat_accel_engine);
spdk_io_device_register(&ioat_accel_engine, ioat_create_cb, ioat_destroy_cb,
spdk_io_device_register(&g_ioat_module, ioat_create_cb, ioat_destroy_cb,
sizeof(struct ioat_io_channel), "ioat_accel_engine");
return 0;
}
@ -295,6 +298,8 @@ _device_unregister_cb(void *io_device)
free(pci_dev);
}
g_ioat_initialized = false;
spdk_accel_engine_module_finish();
}
@ -302,7 +307,7 @@ static void
accel_engine_ioat_exit(void *ctx)
{
if (g_ioat_initialized) {
spdk_io_device_unregister(&ioat_accel_engine, _device_unregister_cb);
spdk_io_device_unregister(&g_ioat_module, _device_unregister_cb);
} else {
spdk_accel_engine_module_finish();
}

View File

@ -20,7 +20,7 @@ DEFINE_STUB(pmem_memset_persist, void *, (void *pmemdest, int c, size_t len), NU
#endif
/* global vars and setup/cleanup functions used for all test functions */
struct spdk_accel_engine g_accel_engine = {};
struct spdk_accel_module_if g_accel_module = {};
struct spdk_io_channel *g_ch = NULL;
struct accel_io_channel *g_accel_ch = NULL;
struct sw_accel_io_channel *g_sw_ch = NULL;
@ -61,16 +61,16 @@ test_setup(void)
return -1;
}
g_accel_engine.submit_tasks = sw_accel_submit_tasks;
g_accel_engine.name = "software";
g_accel_module.submit_tasks = sw_accel_submit_tasks;
g_accel_module.name = "software";
for (i = 0; i < ACCEL_OPC_LAST; i++) {
g_accel_ch->engine_ch[i] = g_engine_ch;
g_engines_opc[i] = &g_accel_engine;
g_engines_opc[i] = &g_accel_module;
}
g_sw_ch = (struct sw_accel_io_channel *)((char *)g_engine_ch + sizeof(
struct spdk_io_channel));
TAILQ_INIT(&g_sw_ch->tasks_to_complete);
g_accel_engine.supports_opcode = _supports_opcode;
g_accel_module.supports_opcode = _supports_opcode;
return 0;
}
@ -452,60 +452,67 @@ test_spdk_accel_submit_copy_crc32c(void)
}
static void
test_engine_find_by_name(void)
test_spdk_accel_module_find_by_name(void)
{
struct spdk_accel_engine eng1, eng2, eng3;
struct spdk_accel_engine *accel_engine = NULL;
struct spdk_accel_module_if mod1 = {};
struct spdk_accel_module_if mod2 = {};
struct spdk_accel_module_if mod3 = {};
struct spdk_accel_module_if *accel_module = NULL;
eng1.name = "ioat";
eng2.name = "idxd";
eng3.name = "software";
mod1.name = "ioat";
mod2.name = "idxd";
mod3.name = "software";
TAILQ_INIT(&g_engine_list);
TAILQ_INSERT_TAIL(&g_engine_list, &eng1, tailq);
TAILQ_INSERT_TAIL(&g_engine_list, &eng2, tailq);
TAILQ_INSERT_TAIL(&g_engine_list, &eng3, tailq);
TAILQ_INIT(&spdk_accel_module_list);
TAILQ_INSERT_TAIL(&spdk_accel_module_list, &mod1, tailq);
TAILQ_INSERT_TAIL(&spdk_accel_module_list, &mod2, tailq);
TAILQ_INSERT_TAIL(&spdk_accel_module_list, &mod3, tailq);
/* Now let's find a valid engine */
accel_engine = _engine_find_by_name("ioat");
CU_ASSERT(accel_engine != NULL);
accel_module = _module_find_by_name("ioat");
CU_ASSERT(accel_module != NULL);
/* Try to find one that doesn't exist */
accel_engine = _engine_find_by_name("XXX");
CU_ASSERT(accel_engine == NULL);
accel_module = _module_find_by_name("XXX");
CU_ASSERT(accel_module == NULL);
}
static void
test_spdk_accel_engine_register(void)
test_spdk_accel_module_register(void)
{
struct spdk_accel_engine eng1, eng2, eng3, eng4;
struct spdk_accel_engine *accel_engine = NULL;
struct spdk_accel_module_if mod1 = {};
struct spdk_accel_module_if mod2 = {};
struct spdk_accel_module_if mod3 = {};
struct spdk_accel_module_if mod4 = {};
struct spdk_accel_module_if *accel_module = NULL;
int i = 0;
eng1.name = "ioat";
eng2.name = "idxd";
eng3.name = "software";
eng4.name = "nothing";
mod1.name = "ioat";
mod2.name = "idxd";
mod3.name = "software";
mod4.name = "nothing";
spdk_accel_engine_register(&eng1);
spdk_accel_engine_register(&eng2);
spdk_accel_engine_register(&eng3);
spdk_accel_engine_register(&eng4);
TAILQ_INIT(&spdk_accel_module_list);
spdk_accel_module_list_add(&mod1);
spdk_accel_module_list_add(&mod2);
spdk_accel_module_list_add(&mod3);
spdk_accel_module_list_add(&mod4);
/* Now confirm they're in the right order. */
TAILQ_FOREACH(accel_engine, &g_engine_list, tailq) {
TAILQ_FOREACH(accel_module, &spdk_accel_module_list, tailq) {
switch (i++) {
case 0:
CU_ASSERT(strcmp(accel_engine->name, "software") == 0);
CU_ASSERT(strcmp(accel_module->name, "software") == 0);
break;
case 1:
CU_ASSERT(strcmp(accel_engine->name, "ioat") == 0);
CU_ASSERT(strcmp(accel_module->name, "ioat") == 0);
break;
case 2:
CU_ASSERT(strcmp(accel_engine->name, "idxd") == 0);
CU_ASSERT(strcmp(accel_module->name, "idxd") == 0);
break;
case 3:
CU_ASSERT(strcmp(accel_engine->name, "nothing") == 0);
CU_ASSERT(strcmp(accel_module->name, "nothing") == 0);
break;
default:
CU_ASSERT(false);
@ -515,46 +522,6 @@ test_spdk_accel_engine_register(void)
CU_ASSERT(i == 4);
}
static void
test_spdk_accel_assign_opc(void)
{
int rc;
g_engines_opc_override[ACCEL_OPC_COPY] = "software";
/* invalid opcode won't change the override value */
rc = spdk_accel_assign_opc(ACCEL_OPC_LAST + 1, "dsa");
CU_ASSERT(strcmp(g_engines_opc_override[ACCEL_OPC_COPY], "software") == 0);
CU_ASSERT(rc == -EINVAL);
/* valid opcode should update to "dsa" */
rc = spdk_accel_assign_opc(ACCEL_OPC_COPY, "dsa");
CU_ASSERT(strcmp(g_engines_opc_override[ACCEL_OPC_COPY], "dsa") == 0);
CU_ASSERT(rc == 0);
}
static void
test_spdk_accel_get_opc_engine_name(void)
{
const char *name;
int rc;
/* valid index, hardcoded name for UT */
rc = spdk_accel_get_opc_engine_name(ACCEL_OPC_COPY, &name);
CU_ASSERT(strcmp(name, "software") == 0);
CU_ASSERT(rc == 0);
/* pretend nothing is assigned yet */
g_engines_opc[0] = NULL;
rc = spdk_accel_get_opc_engine_name(ACCEL_OPC_COPY, &name);
CU_ASSERT(rc == -ENOENT);
g_engines_opc[0] = &g_accel_engine;
/* invalid name */
rc = spdk_accel_get_opc_engine_name(ACCEL_OPC_LAST + 1, &name);
CU_ASSERT(rc == -EINVAL);
}
int
main(int argc, char **argv)
{
@ -566,7 +533,6 @@ main(int argc, char **argv)
suite = CU_add_suite("accel", test_setup, test_cleanup);
CU_ADD_TEST(suite, test_spdk_accel_engine_register);
CU_ADD_TEST(suite, test_spdk_accel_task_complete);
CU_ADD_TEST(suite, test_get_task);
CU_ADD_TEST(suite, test_spdk_accel_submit_copy);
@ -576,9 +542,8 @@ main(int argc, char **argv)
CU_ADD_TEST(suite, test_spdk_accel_submit_crc32c);
CU_ADD_TEST(suite, test_spdk_accel_submit_crc32cv);
CU_ADD_TEST(suite, test_spdk_accel_submit_copy_crc32c);
CU_ADD_TEST(suite, test_engine_find_by_name);
CU_ADD_TEST(suite, test_spdk_accel_assign_opc);
CU_ADD_TEST(suite, test_spdk_accel_get_opc_engine_name);
CU_ADD_TEST(suite, test_spdk_accel_module_find_by_name);
CU_ADD_TEST(suite, test_spdk_accel_module_register);
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();