accel: pull data if srcbuf is in remote memory domain
If the source buffer is from a remote memory domain, we will now pull it to the temporary bounce buffer before a task is executed. Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com> Change-Id: I476684a4359410c69dd69a2b425b9e61d4c55a7e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15947 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
78186df493
commit
316f9ea3f5
@ -67,6 +67,8 @@ enum accel_sequence_state {
|
|||||||
ACCEL_SEQUENCE_STATE_AWAIT_VIRTBUF,
|
ACCEL_SEQUENCE_STATE_AWAIT_VIRTBUF,
|
||||||
ACCEL_SEQUENCE_STATE_CHECK_BOUNCEBUF,
|
ACCEL_SEQUENCE_STATE_CHECK_BOUNCEBUF,
|
||||||
ACCEL_SEQUENCE_STATE_AWAIT_BOUNCEBUF,
|
ACCEL_SEQUENCE_STATE_AWAIT_BOUNCEBUF,
|
||||||
|
ACCEL_SEQUENCE_STATE_PULL_DATA,
|
||||||
|
ACCEL_SEQUENCE_STATE_AWAIT_PULL_DATA,
|
||||||
ACCEL_SEQUENCE_STATE_EXEC_TASK,
|
ACCEL_SEQUENCE_STATE_EXEC_TASK,
|
||||||
ACCEL_SEQUENCE_STATE_AWAIT_TASK,
|
ACCEL_SEQUENCE_STATE_AWAIT_TASK,
|
||||||
ACCEL_SEQUENCE_STATE_COMPLETE_TASK,
|
ACCEL_SEQUENCE_STATE_COMPLETE_TASK,
|
||||||
@ -81,6 +83,8 @@ __attribute__((unused)) = {
|
|||||||
[ACCEL_SEQUENCE_STATE_AWAIT_VIRTBUF] = "await-virtbuf",
|
[ACCEL_SEQUENCE_STATE_AWAIT_VIRTBUF] = "await-virtbuf",
|
||||||
[ACCEL_SEQUENCE_STATE_CHECK_BOUNCEBUF] = "check-bouncebuf",
|
[ACCEL_SEQUENCE_STATE_CHECK_BOUNCEBUF] = "check-bouncebuf",
|
||||||
[ACCEL_SEQUENCE_STATE_AWAIT_BOUNCEBUF] = "await-bouncebuf",
|
[ACCEL_SEQUENCE_STATE_AWAIT_BOUNCEBUF] = "await-bouncebuf",
|
||||||
|
[ACCEL_SEQUENCE_STATE_PULL_DATA] = "pull-data",
|
||||||
|
[ACCEL_SEQUENCE_STATE_AWAIT_PULL_DATA] = "await-pull-data",
|
||||||
[ACCEL_SEQUENCE_STATE_EXEC_TASK] = "exec-task",
|
[ACCEL_SEQUENCE_STATE_EXEC_TASK] = "exec-task",
|
||||||
[ACCEL_SEQUENCE_STATE_AWAIT_TASK] = "await-task",
|
[ACCEL_SEQUENCE_STATE_AWAIT_TASK] = "await-task",
|
||||||
[ACCEL_SEQUENCE_STATE_COMPLETE_TASK] = "complete-task",
|
[ACCEL_SEQUENCE_STATE_COMPLETE_TASK] = "complete-task",
|
||||||
@ -247,6 +251,8 @@ _get_task(struct accel_io_channel *accel_ch, spdk_accel_completion_cb cb_fn, voi
|
|||||||
accel_task->cb_fn = cb_fn;
|
accel_task->cb_fn = cb_fn;
|
||||||
accel_task->cb_arg = cb_arg;
|
accel_task->cb_arg = cb_arg;
|
||||||
accel_task->accel_ch = accel_ch;
|
accel_task->accel_ch = accel_ch;
|
||||||
|
accel_task->bounce.s.orig_iovs = NULL;
|
||||||
|
accel_task->bounce.d.orig_iovs = NULL;
|
||||||
|
|
||||||
return accel_task;
|
return accel_task;
|
||||||
}
|
}
|
||||||
@ -1222,6 +1228,42 @@ accel_sequence_check_bouncebuf(struct spdk_accel_sequence *seq, struct spdk_acce
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
accel_task_pull_data_cb(void *ctx, int status)
|
||||||
|
{
|
||||||
|
struct spdk_accel_sequence *seq = ctx;
|
||||||
|
|
||||||
|
assert(seq->state == ACCEL_SEQUENCE_STATE_AWAIT_PULL_DATA);
|
||||||
|
if (spdk_likely(status == 0)) {
|
||||||
|
accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_EXEC_TASK);
|
||||||
|
} else {
|
||||||
|
accel_sequence_set_fail(seq, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
accel_process_sequence(seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
accel_task_pull_data(struct spdk_accel_sequence *seq, struct spdk_accel_task *task)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
assert(task->bounce.s.orig_iovs != NULL);
|
||||||
|
assert(task->bounce.s.orig_domain != NULL);
|
||||||
|
assert(task->bounce.s.orig_domain != g_accel_domain);
|
||||||
|
|
||||||
|
rc = spdk_memory_domain_pull_data(task->bounce.s.orig_domain,
|
||||||
|
task->bounce.s.orig_domain_ctx,
|
||||||
|
task->bounce.s.orig_iovs, task->bounce.s.orig_iovcnt,
|
||||||
|
task->s.iovs, task->s.iovcnt,
|
||||||
|
accel_task_pull_data_cb, seq);
|
||||||
|
if (spdk_unlikely(rc != 0)) {
|
||||||
|
SPDK_ERRLOG("Failed to pull data from memory domain: %s, rc: %d\n",
|
||||||
|
spdk_memory_domain_get_dma_device_id(task->bounce.s.orig_domain), rc);
|
||||||
|
accel_sequence_set_fail(seq, rc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
accel_process_sequence(struct spdk_accel_sequence *seq)
|
accel_process_sequence(struct spdk_accel_sequence *seq)
|
||||||
{
|
{
|
||||||
@ -1265,6 +1307,10 @@ accel_process_sequence(struct spdk_accel_sequence *seq)
|
|||||||
accel_sequence_set_fail(seq, rc);
|
accel_sequence_set_fail(seq, rc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (task->bounce.s.orig_iovs != NULL) {
|
||||||
|
accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_PULL_DATA);
|
||||||
|
break;
|
||||||
|
}
|
||||||
accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_EXEC_TASK);
|
accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_EXEC_TASK);
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
case ACCEL_SEQUENCE_STATE_EXEC_TASK:
|
case ACCEL_SEQUENCE_STATE_EXEC_TASK:
|
||||||
@ -1285,6 +1331,10 @@ accel_process_sequence(struct spdk_accel_sequence *seq)
|
|||||||
accel_sequence_set_fail(seq, rc);
|
accel_sequence_set_fail(seq, rc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ACCEL_SEQUENCE_STATE_PULL_DATA:
|
||||||
|
accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_AWAIT_PULL_DATA);
|
||||||
|
accel_task_pull_data(seq, task);
|
||||||
|
break;
|
||||||
case ACCEL_SEQUENCE_STATE_COMPLETE_TASK:
|
case ACCEL_SEQUENCE_STATE_COMPLETE_TASK:
|
||||||
TAILQ_REMOVE(&seq->tasks, task, seq_link);
|
TAILQ_REMOVE(&seq->tasks, task, seq_link);
|
||||||
TAILQ_INSERT_TAIL(&seq->completed, task, seq_link);
|
TAILQ_INSERT_TAIL(&seq->completed, task, seq_link);
|
||||||
@ -1306,6 +1356,7 @@ accel_process_sequence(struct spdk_accel_sequence *seq)
|
|||||||
return;
|
return;
|
||||||
case ACCEL_SEQUENCE_STATE_AWAIT_VIRTBUF:
|
case ACCEL_SEQUENCE_STATE_AWAIT_VIRTBUF:
|
||||||
case ACCEL_SEQUENCE_STATE_AWAIT_BOUNCEBUF:
|
case ACCEL_SEQUENCE_STATE_AWAIT_BOUNCEBUF:
|
||||||
|
case ACCEL_SEQUENCE_STATE_AWAIT_PULL_DATA:
|
||||||
case ACCEL_SEQUENCE_STATE_AWAIT_TASK:
|
case ACCEL_SEQUENCE_STATE_AWAIT_TASK:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -20,6 +20,12 @@ DEFINE_STUB(pmem_is_pmem, int, (const void *addr, size_t len), 0);
|
|||||||
DEFINE_STUB(pmem_memset_persist, void *, (void *pmemdest, int c, size_t len), NULL);
|
DEFINE_STUB(pmem_memset_persist, void *, (void *pmemdest, int c, size_t len), NULL);
|
||||||
#endif
|
#endif
|
||||||
DEFINE_STUB_V(spdk_memory_domain_destroy, (struct spdk_memory_domain *domain));
|
DEFINE_STUB_V(spdk_memory_domain_destroy, (struct spdk_memory_domain *domain));
|
||||||
|
DEFINE_STUB(spdk_memory_domain_pull_data, int,
|
||||||
|
(struct spdk_memory_domain *sd, void *sctx, struct iovec *siov, uint32_t siovcnt,
|
||||||
|
struct iovec *diov, uint32_t diovcnt, spdk_memory_domain_data_cpl_cb cpl_cb,
|
||||||
|
void *cpl_arg), 0);
|
||||||
|
DEFINE_STUB(spdk_memory_domain_get_dma_device_id, const char *,
|
||||||
|
(struct spdk_memory_domain *domain), "UT_DMA");
|
||||||
#ifdef SPDK_CONFIG_ISAL
|
#ifdef SPDK_CONFIG_ISAL
|
||||||
DEFINE_STUB_V(XTS_AES_128_enc, (uint8_t *k2, uint8_t *k1, uint8_t *tweak, uint64_t lba_size,
|
DEFINE_STUB_V(XTS_AES_128_enc, (uint8_t *k2, uint8_t *k1, uint8_t *tweak, uint64_t lba_size,
|
||||||
const uint8_t *src, uint8_t *dst));
|
const uint8_t *src, uint8_t *dst));
|
||||||
|
Loading…
Reference in New Issue
Block a user