scsi: Revert submission queue and suspend submission during LUN reset

Submission queue deleted by https://review.gerrithub.io/393911
is necessary to support proper LUN reset.

Hence revert the removal in this patch.

And using the submission queue, suspend IO task submission during
LUN reset to limit completion time of LUN reset.

Change-Id: I3cdc4f0165fe845637112c2900407d6b4a09df79
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/434765
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Shuhei Matsumoto 2018-11-29 10:18:50 +09:00 committed by Ben Walker
parent 6dd09113e5
commit b409bf4080
5 changed files with 55 additions and 12 deletions

View File

@ -262,7 +262,8 @@ spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev,
{
assert(task != NULL);
spdk_scsi_lun_execute_task(task->lun, task);
spdk_scsi_lun_append_task(task->lun, task);
spdk_scsi_lun_execute_tasks(task->lun);
}
static struct spdk_scsi_port *

View File

@ -38,6 +38,7 @@
#include "spdk/thread.h"
#include "spdk/event.h"
#include "spdk/util.h"
#include "spdk/likely.h"
void
spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
@ -131,7 +132,9 @@ spdk_scsi_lun_execute_mgmt_task(struct spdk_scsi_lun *lun)
}
task = TAILQ_FIRST(&lun->pending_mgmt_tasks);
if (task == NULL) {
if (spdk_likely(task == NULL)) {
/* Try to execute all pending tasks */
spdk_scsi_lun_execute_tasks(lun);
return;
}
TAILQ_REMOVE(&lun->pending_mgmt_tasks, task, scsi_link);
@ -176,8 +179,8 @@ spdk_scsi_task_process_null_lun(struct spdk_scsi_task *task)
}
}
void
spdk_scsi_lun_execute_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
static void
_spdk_scsi_lun_execute_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
{
int rc;
@ -207,6 +210,29 @@ spdk_scsi_lun_execute_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *tas
}
}
void
spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
{
TAILQ_INSERT_TAIL(&lun->pending_tasks, task, scsi_link);
}
void
spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun)
{
struct spdk_scsi_task *task, *task_tmp;
if (spdk_scsi_lun_has_pending_mgmt_tasks(lun)) {
/* Pending IO tasks will wait for completion of existing mgmt tasks.
*/
return;
}
TAILQ_FOREACH_SAFE(task, &lun->pending_tasks, scsi_link, task_tmp) {
TAILQ_REMOVE(&lun->pending_tasks, task, scsi_link);
_spdk_scsi_lun_execute_task(lun, task);
}
}
static void
spdk_scsi_lun_remove(struct spdk_scsi_lun *lun)
{
@ -344,6 +370,7 @@ spdk_scsi_lun_construct(struct spdk_bdev *bdev,
}
TAILQ_INIT(&lun->tasks);
TAILQ_INIT(&lun->pending_tasks);
TAILQ_INIT(&lun->mgmt_tasks);
TAILQ_INIT(&lun->pending_mgmt_tasks);
@ -476,10 +503,12 @@ spdk_scsi_lun_has_pending_mgmt_tasks(const struct spdk_scsi_lun *lun)
!TAILQ_EMPTY(&lun->mgmt_tasks);
}
/* This check includes both pending and submitted (outstanding) tasks. */
bool
spdk_scsi_lun_has_pending_tasks(const struct spdk_scsi_lun *lun)
{
return !TAILQ_EMPTY(&lun->tasks);
return !TAILQ_EMPTY(&lun->pending_tasks) ||
!TAILQ_EMPTY(&lun->tasks);
}
bool

View File

@ -115,9 +115,12 @@ struct spdk_scsi_lun {
/** List of open descriptors for this LUN. */
TAILQ_HEAD(, spdk_scsi_desc) open_descs;
/** pending tasks */
/** submitted tasks */
TAILQ_HEAD(tasks, spdk_scsi_task) tasks;
/** pending tasks */
TAILQ_HEAD(pending_tasks, spdk_scsi_task) pending_tasks;
/** submitted management tasks */
TAILQ_HEAD(mgmt_tasks, spdk_scsi_task) mgmt_tasks;
@ -143,7 +146,8 @@ _spdk_scsi_lun *spdk_scsi_lun_construct(struct spdk_bdev *bdev,
void *hotremove_ctx);
void spdk_scsi_lun_destruct(struct spdk_scsi_lun *lun);
void spdk_scsi_lun_execute_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task);
void spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task);
void spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun);
void spdk_scsi_lun_append_mgmt_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task);
void spdk_scsi_lun_execute_mgmt_task(struct spdk_scsi_lun *lun);
bool spdk_scsi_lun_has_pending_mgmt_tasks(const struct spdk_scsi_lun *lun);

View File

@ -128,7 +128,12 @@ spdk_scsi_lun_has_pending_mgmt_tasks(const struct spdk_scsi_lun *lun)
}
void
spdk_scsi_lun_execute_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
{
}
void
spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun)
{
}

View File

@ -245,7 +245,8 @@ lun_task_mgmt_execute_abort_task_not_supported(void)
task.lun = lun;
task.cdb = cdb;
spdk_scsi_lun_execute_task(lun, &task);
spdk_scsi_lun_append_task(lun, &task);
spdk_scsi_lun_execute_tasks(lun);
/* task should now be on the tasks list */
CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
@ -289,7 +290,8 @@ lun_task_mgmt_execute_abort_task_all_not_supported(void)
task.lun = lun;
task.cdb = cdb;
spdk_scsi_lun_execute_task(lun, &task);
spdk_scsi_lun_append_task(lun, &task);
spdk_scsi_lun_execute_tasks(lun);
/* task should now be on the tasks list */
CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
@ -453,7 +455,8 @@ lun_execute_scsi_task_pending(void)
*/
CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
spdk_scsi_lun_execute_task(lun, &task);
spdk_scsi_lun_append_task(lun, &task);
spdk_scsi_lun_execute_tasks(lun);
/* Assert the task has been successfully added to the tasks queue */
CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
@ -490,7 +493,8 @@ lun_execute_scsi_task_complete(void)
*/
CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
spdk_scsi_lun_execute_task(lun, &task);
spdk_scsi_lun_append_task(lun, &task);
spdk_scsi_lun_execute_tasks(lun);
/* Assert the task has not been added to the tasks queue */
CU_ASSERT(TAILQ_EMPTY(&lun->tasks));