From 78186df49368182529c246154b38b0ee4cb6b09a Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Mon, 12 Dec 2022 15:41:00 +0100 Subject: [PATCH] accel: put completed tasks on the completed queue in process_sequence The first task on a sequence's task queue is the one that we're currently executing. By moving the place where we remove it from that queue and place it on the completed queue to process_sequence(), we'll be able to perform some extra steps (e.g. memory domain push) after a task has been completed. Signed-off-by: Konrad Sztyber Change-Id: Ia98f491eb52be0156954372461e05c198c070e3b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15946 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- lib/accel/accel.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/accel/accel.c b/lib/accel/accel.c index d7ec3f0d8..b42ed0c54 100644 --- a/lib/accel/accel.c +++ b/lib/accel/accel.c @@ -1239,11 +1239,7 @@ accel_process_sequence(struct spdk_accel_sequence *seq) seq->in_process_sequence = true; task = TAILQ_FIRST(&seq->tasks); - if (task == NULL) { - /* We've processed all tasks */ - accel_sequence_complete(seq); - return; - } + assert(task != NULL); do { state = seq->state; @@ -1290,8 +1286,9 @@ accel_process_sequence(struct spdk_accel_sequence *seq) } break; case ACCEL_SEQUENCE_STATE_COMPLETE_TASK: - /* Update the task pointer here, in case a task was completed by a module - * from submit_tasks() */ + TAILQ_REMOVE(&seq->tasks, task, seq_link); + TAILQ_INSERT_TAIL(&seq->completed, task, seq_link); + /* Check if there are any remaining tasks */ task = TAILQ_FIRST(&seq->tasks); if (task == NULL) { /* Immediately return here to make sure we don't touch the sequence @@ -1337,9 +1334,6 @@ accel_sequence_task_cb(void *cb_arg, int status) assert(seq->state == ACCEL_SEQUENCE_STATE_AWAIT_TASK); accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_COMPLETE_TASK); - TAILQ_REMOVE(&seq->tasks, task, seq_link); - TAILQ_INSERT_TAIL(&seq->completed, task, seq_link); - if (spdk_unlikely(status != 0)) { SPDK_ERRLOG("Failed to execute %s operation, sequence: %p\n", g_opcode_strings[task->op_code], seq);