accel: Add per-module task structures
These hold a pointer to the channel which eliminates the need to look it back up in the completion path. Change-Id: Ie4fc98d92d6434262e64b9483ef8b3b0591d764a Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13914 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
parent
df892eed67
commit
225ae35a2f
@ -39,6 +39,11 @@ static struct idxd_device *g_next_dev = NULL;
|
|||||||
static uint32_t g_num_devices = 0;
|
static uint32_t g_num_devices = 0;
|
||||||
static pthread_mutex_t g_dev_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t g_dev_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
struct idxd_task {
|
||||||
|
struct spdk_accel_task task;
|
||||||
|
struct idxd_io_channel *chan;
|
||||||
|
};
|
||||||
|
|
||||||
struct idxd_io_channel {
|
struct idxd_io_channel {
|
||||||
struct spdk_idxd_io_channel *chan;
|
struct spdk_idxd_io_channel *chan;
|
||||||
struct idxd_device *dev;
|
struct idxd_device *dev;
|
||||||
@ -101,22 +106,23 @@ idxd_select_device(struct idxd_io_channel *chan)
|
|||||||
static void
|
static void
|
||||||
dsa_done(void *cb_arg, int status)
|
dsa_done(void *cb_arg, int status)
|
||||||
{
|
{
|
||||||
struct spdk_accel_task *accel_task = cb_arg;
|
struct idxd_task *idxd_task = cb_arg;
|
||||||
struct idxd_io_channel *chan;
|
struct idxd_io_channel *chan;
|
||||||
|
|
||||||
chan = spdk_io_channel_get_ctx(accel_task->accel_ch->engine_ch[accel_task->op_code]);
|
chan = idxd_task->chan;
|
||||||
|
|
||||||
assert(chan->num_outstanding > 0);
|
assert(chan->num_outstanding > 0);
|
||||||
spdk_trace_record(TRACE_ACCEL_DSA_OP_COMPLETE, 0, 0, 0, chan->num_outstanding - 1);
|
spdk_trace_record(TRACE_ACCEL_DSA_OP_COMPLETE, 0, 0, 0, chan->num_outstanding - 1);
|
||||||
chan->num_outstanding--;
|
chan->num_outstanding--;
|
||||||
|
|
||||||
spdk_accel_task_complete(accel_task, status);
|
spdk_accel_task_complete(&idxd_task->task, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
_process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
||||||
{
|
{
|
||||||
struct idxd_io_channel *chan = spdk_io_channel_get_ctx(ch);
|
struct idxd_io_channel *chan = spdk_io_channel_get_ctx(ch);
|
||||||
|
struct idxd_task *idxd_task;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct iovec *iov;
|
struct iovec *iov;
|
||||||
uint32_t iovcnt;
|
uint32_t iovcnt;
|
||||||
@ -124,6 +130,9 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
struct iovec diov = {};
|
struct iovec diov = {};
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
|
idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task);
|
||||||
|
idxd_task->chan = chan;
|
||||||
|
|
||||||
switch (task->op_code) {
|
switch (task->op_code) {
|
||||||
case ACCEL_OPC_COPY:
|
case ACCEL_OPC_COPY:
|
||||||
siov.iov_base = task->src;
|
siov.iov_base = task->src;
|
||||||
@ -134,7 +143,7 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
flags |= SPDK_IDXD_FLAG_PERSISTENT;
|
flags |= SPDK_IDXD_FLAG_PERSISTENT;
|
||||||
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
||||||
}
|
}
|
||||||
rc = spdk_idxd_submit_copy(chan->chan, &diov, 1, &siov, 1, flags, dsa_done, task);
|
rc = spdk_idxd_submit_copy(chan->chan, &diov, 1, &siov, 1, flags, dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_DUALCAST:
|
case ACCEL_OPC_DUALCAST:
|
||||||
if (task->flags & ACCEL_FLAG_PERSISTENT) {
|
if (task->flags & ACCEL_FLAG_PERSISTENT) {
|
||||||
@ -142,14 +151,14 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
||||||
}
|
}
|
||||||
rc = spdk_idxd_submit_dualcast(chan->chan, task->dst, task->dst2, task->src, task->nbytes,
|
rc = spdk_idxd_submit_dualcast(chan->chan, task->dst, task->dst2, task->src, task->nbytes,
|
||||||
flags, dsa_done, task);
|
flags, dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_COMPARE:
|
case ACCEL_OPC_COMPARE:
|
||||||
siov.iov_base = task->src;
|
siov.iov_base = task->src;
|
||||||
siov.iov_len = task->nbytes;
|
siov.iov_len = task->nbytes;
|
||||||
diov.iov_base = task->dst;
|
diov.iov_base = task->dst;
|
||||||
diov.iov_len = task->nbytes;
|
diov.iov_len = task->nbytes;
|
||||||
rc = spdk_idxd_submit_compare(chan->chan, &siov, 1, &diov, 1, flags, dsa_done, task);
|
rc = spdk_idxd_submit_compare(chan->chan, &siov, 1, &diov, 1, flags, dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_FILL:
|
case ACCEL_OPC_FILL:
|
||||||
diov.iov_base = task->dst;
|
diov.iov_base = task->dst;
|
||||||
@ -159,7 +168,7 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
||||||
}
|
}
|
||||||
rc = spdk_idxd_submit_fill(chan->chan, &diov, 1, task->fill_pattern, flags, dsa_done,
|
rc = spdk_idxd_submit_fill(chan->chan, &diov, 1, task->fill_pattern, flags, dsa_done,
|
||||||
task);
|
idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_CRC32C:
|
case ACCEL_OPC_CRC32C:
|
||||||
if (task->v.iovcnt == 0) {
|
if (task->v.iovcnt == 0) {
|
||||||
@ -172,7 +181,7 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
iovcnt = task->v.iovcnt;
|
iovcnt = task->v.iovcnt;
|
||||||
}
|
}
|
||||||
rc = spdk_idxd_submit_crc32c(chan->chan, iov, iovcnt, task->seed, task->crc_dst,
|
rc = spdk_idxd_submit_crc32c(chan->chan, iov, iovcnt, task->seed, task->crc_dst,
|
||||||
flags, dsa_done, task);
|
flags, dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_COPY_CRC32C:
|
case ACCEL_OPC_COPY_CRC32C:
|
||||||
if (task->v.iovcnt == 0) {
|
if (task->v.iovcnt == 0) {
|
||||||
@ -192,7 +201,7 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
}
|
}
|
||||||
rc = spdk_idxd_submit_copy_crc32c(chan->chan, &diov, 1, iov, iovcnt,
|
rc = spdk_idxd_submit_copy_crc32c(chan->chan, &diov, 1, iov, iovcnt,
|
||||||
task->seed, task->crc_dst, flags,
|
task->seed, task->crc_dst, flags,
|
||||||
dsa_done, task);
|
dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
@ -264,6 +273,7 @@ idxd_poll(void *arg)
|
|||||||
{
|
{
|
||||||
struct idxd_io_channel *chan = arg;
|
struct idxd_io_channel *chan = arg;
|
||||||
struct spdk_accel_task *task = NULL;
|
struct spdk_accel_task *task = NULL;
|
||||||
|
struct idxd_task *idxd_task;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
count = spdk_idxd_process_events(chan->chan);
|
count = spdk_idxd_process_events(chan->chan);
|
||||||
@ -273,10 +283,11 @@ idxd_poll(void *arg)
|
|||||||
/* Submit queued tasks */
|
/* Submit queued tasks */
|
||||||
if (!TAILQ_EMPTY(&chan->queued_tasks)) {
|
if (!TAILQ_EMPTY(&chan->queued_tasks)) {
|
||||||
task = TAILQ_FIRST(&chan->queued_tasks);
|
task = TAILQ_FIRST(&chan->queued_tasks);
|
||||||
|
idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task);
|
||||||
|
|
||||||
TAILQ_INIT(&chan->queued_tasks);
|
TAILQ_INIT(&chan->queued_tasks);
|
||||||
|
|
||||||
dsa_submit_tasks(task->accel_ch->engine_ch[task->op_code], task);
|
dsa_submit_tasks(spdk_io_channel_from_ctx(idxd_task->chan), task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,7 +297,7 @@ idxd_poll(void *arg)
|
|||||||
static size_t
|
static size_t
|
||||||
accel_engine_dsa_get_ctx_size(void)
|
accel_engine_dsa_get_ctx_size(void)
|
||||||
{
|
{
|
||||||
return sizeof(struct spdk_accel_task);
|
return sizeof(struct idxd_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -39,6 +39,11 @@ static struct idxd_device *g_next_dev = NULL;
|
|||||||
static uint32_t g_num_devices = 0;
|
static uint32_t g_num_devices = 0;
|
||||||
static pthread_mutex_t g_dev_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t g_dev_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
struct idxd_task {
|
||||||
|
struct spdk_accel_task task;
|
||||||
|
struct idxd_io_channel *chan;
|
||||||
|
};
|
||||||
|
|
||||||
struct idxd_io_channel {
|
struct idxd_io_channel {
|
||||||
struct spdk_idxd_io_channel *chan;
|
struct spdk_idxd_io_channel *chan;
|
||||||
struct idxd_device *dev;
|
struct idxd_device *dev;
|
||||||
@ -101,27 +106,31 @@ idxd_select_device(struct idxd_io_channel *chan)
|
|||||||
static void
|
static void
|
||||||
iaa_done(void *cb_arg, int status)
|
iaa_done(void *cb_arg, int status)
|
||||||
{
|
{
|
||||||
struct spdk_accel_task *accel_task = cb_arg;
|
struct idxd_task *idxd_task = cb_arg;
|
||||||
struct idxd_io_channel *chan;
|
struct idxd_io_channel *chan;
|
||||||
|
|
||||||
chan = spdk_io_channel_get_ctx(accel_task->accel_ch->engine_ch[accel_task->op_code]);
|
chan = idxd_task->chan;
|
||||||
|
|
||||||
assert(chan->num_outstanding > 0);
|
assert(chan->num_outstanding > 0);
|
||||||
spdk_trace_record(TRACE_ACCEL_IAA_OP_COMPLETE, 0, 0, 0, chan->num_outstanding - 1);
|
spdk_trace_record(TRACE_ACCEL_IAA_OP_COMPLETE, 0, 0, 0, chan->num_outstanding - 1);
|
||||||
chan->num_outstanding--;
|
chan->num_outstanding--;
|
||||||
|
|
||||||
spdk_accel_task_complete(accel_task, status);
|
spdk_accel_task_complete(&idxd_task->task, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
_process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
||||||
{
|
{
|
||||||
struct idxd_io_channel *chan = spdk_io_channel_get_ctx(ch);
|
struct idxd_io_channel *chan = spdk_io_channel_get_ctx(ch);
|
||||||
|
struct idxd_task *idxd_task;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct iovec siov = {};
|
struct iovec siov = {};
|
||||||
struct iovec diov = {};
|
struct iovec diov = {};
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
|
idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task);
|
||||||
|
idxd_task->chan = chan;
|
||||||
|
|
||||||
switch (task->op_code) {
|
switch (task->op_code) {
|
||||||
case ACCEL_OPC_COMPRESS:
|
case ACCEL_OPC_COMPRESS:
|
||||||
siov.iov_base = task->src;
|
siov.iov_base = task->src;
|
||||||
@ -129,14 +138,14 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
|||||||
diov.iov_base = task->dst;
|
diov.iov_base = task->dst;
|
||||||
diov.iov_len = task->nbytes_dst;
|
diov.iov_len = task->nbytes_dst;
|
||||||
rc = spdk_idxd_submit_compress(chan->chan, &diov, 1, &siov, 1, task->output_size,
|
rc = spdk_idxd_submit_compress(chan->chan, &diov, 1, &siov, 1, task->output_size,
|
||||||
flags, iaa_done, task);
|
flags, iaa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_DECOMPRESS:
|
case ACCEL_OPC_DECOMPRESS:
|
||||||
siov.iov_base = task->src;
|
siov.iov_base = task->src;
|
||||||
siov.iov_len = task->nbytes;
|
siov.iov_len = task->nbytes;
|
||||||
diov.iov_base = task->dst;
|
diov.iov_base = task->dst;
|
||||||
diov.iov_len = task->nbytes_dst;
|
diov.iov_len = task->nbytes_dst;
|
||||||
rc = spdk_idxd_submit_decompress(chan->chan, &diov, 1, &siov, 1, flags, iaa_done, task);
|
rc = spdk_idxd_submit_decompress(chan->chan, &diov, 1, &siov, 1, flags, iaa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
@ -208,6 +217,7 @@ idxd_poll(void *arg)
|
|||||||
{
|
{
|
||||||
struct idxd_io_channel *chan = arg;
|
struct idxd_io_channel *chan = arg;
|
||||||
struct spdk_accel_task *task = NULL;
|
struct spdk_accel_task *task = NULL;
|
||||||
|
struct idxd_task *idxd_task;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
count = spdk_idxd_process_events(chan->chan);
|
count = spdk_idxd_process_events(chan->chan);
|
||||||
@ -217,10 +227,11 @@ idxd_poll(void *arg)
|
|||||||
/* Submit queued tasks */
|
/* Submit queued tasks */
|
||||||
if (!TAILQ_EMPTY(&chan->queued_tasks)) {
|
if (!TAILQ_EMPTY(&chan->queued_tasks)) {
|
||||||
task = TAILQ_FIRST(&chan->queued_tasks);
|
task = TAILQ_FIRST(&chan->queued_tasks);
|
||||||
|
idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task);
|
||||||
|
|
||||||
TAILQ_INIT(&chan->queued_tasks);
|
TAILQ_INIT(&chan->queued_tasks);
|
||||||
|
|
||||||
iaa_submit_tasks(task->accel_ch->engine_ch[task->op_code], task);
|
iaa_submit_tasks(spdk_io_channel_from_ctx(idxd_task->chan), task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +241,7 @@ idxd_poll(void *arg)
|
|||||||
static size_t
|
static size_t
|
||||||
accel_engine_iaa_get_ctx_size(void)
|
accel_engine_iaa_get_ctx_size(void)
|
||||||
{
|
{
|
||||||
return sizeof(struct spdk_accel_task);
|
return sizeof(struct idxd_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
Loading…
Reference in New Issue
Block a user