nvmf: add an outstanding admin IO tracker in direct mode

Change-Id: I06e0de6dc28115f0cb53151d67138f9271093687
Signed-off-by: GangCao <gang.cao@intel.com>
This commit is contained in:
GangCao 2017-03-10 11:06:31 +08:00 committed by Jim Harris
parent 7224a42d9d
commit f75fe7394a
3 changed files with 21 additions and 3 deletions

View File

@ -138,6 +138,7 @@ struct spdk_nvmf_subsystem {
struct spdk_nvme_qpair *io_qpair; struct spdk_nvme_qpair *io_qpair;
struct spdk_pci_addr pci_addr; struct spdk_pci_addr pci_addr;
struct spdk_poller *admin_poller; struct spdk_poller *admin_poller;
int32_t outstanding_admin_cmd_count;
} direct; } direct;
struct { struct {

View File

@ -63,6 +63,10 @@ nvmf_direct_ctrlr_poll_for_admin_completions(void *arg)
static void static void
nvmf_direct_ctrlr_poll_for_completions(struct spdk_nvmf_subsystem *subsystem) nvmf_direct_ctrlr_poll_for_completions(struct spdk_nvmf_subsystem *subsystem)
{ {
if (subsystem->dev.direct.outstanding_admin_cmd_count > 0) {
nvmf_direct_ctrlr_poll_for_admin_completions(subsystem);
}
if (subsystem->dev.direct.admin_poller == NULL) { if (subsystem->dev.direct.admin_poller == NULL) {
int lcore = spdk_app_get_current_core(); int lcore = spdk_app_get_current_core();
@ -71,8 +75,6 @@ nvmf_direct_ctrlr_poll_for_completions(struct spdk_nvmf_subsystem *subsystem)
subsystem, lcore, 10000); subsystem, lcore, 10000);
} }
nvmf_direct_ctrlr_poll_for_admin_completions(subsystem);
spdk_nvme_qpair_process_completions(subsystem->dev.direct.io_qpair, 0); spdk_nvme_qpair_process_completions(subsystem->dev.direct.io_qpair, 0);
} }
@ -88,6 +90,17 @@ nvmf_direct_ctrlr_complete_cmd(void *ctx, const struct spdk_nvme_cpl *cmp)
spdk_nvmf_request_complete(req); spdk_nvmf_request_complete(req);
} }
static void
nvmf_direct_ctrlr_complete_admin_cmd(void *ctx, const struct spdk_nvme_cpl *cmp)
{
struct spdk_nvmf_request *req = ctx;
struct spdk_nvmf_subsystem *subsystem = req->conn->sess->subsys;
subsystem->dev.direct.outstanding_admin_cmd_count--;
nvmf_direct_ctrlr_complete_cmd(ctx, cmp);
}
static int static int
nvmf_direct_ctrlr_admin_identify_nslist(struct spdk_nvme_ctrlr *ctrlr, nvmf_direct_ctrlr_admin_identify_nslist(struct spdk_nvme_ctrlr *ctrlr,
struct spdk_nvmf_request *req) struct spdk_nvmf_request *req)
@ -224,13 +237,16 @@ passthrough:
rc = spdk_nvme_ctrlr_cmd_admin_raw(subsystem->dev.direct.ctrlr, rc = spdk_nvme_ctrlr_cmd_admin_raw(subsystem->dev.direct.ctrlr,
cmd, cmd,
req->data, req->length, req->data, req->length,
nvmf_direct_ctrlr_complete_cmd, nvmf_direct_ctrlr_complete_admin_cmd,
req); req);
if (rc) { if (rc) {
SPDK_ERRLOG("Error submitting admin opc 0x%02x\n", cmd->opc); SPDK_ERRLOG("Error submitting admin opc 0x%02x\n", cmd->opc);
response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
subsystem->dev.direct.outstanding_admin_cmd_count++;
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
} }

View File

@ -208,6 +208,7 @@ spdk_nvmf_create_subsystem(const char *nqn,
if (mode == NVMF_SUBSYSTEM_MODE_DIRECT) { if (mode == NVMF_SUBSYSTEM_MODE_DIRECT) {
subsystem->ops = &spdk_nvmf_direct_ctrlr_ops; subsystem->ops = &spdk_nvmf_direct_ctrlr_ops;
subsystem->dev.direct.outstanding_admin_cmd_count = 0;
} else { } else {
subsystem->ops = &spdk_nvmf_virtual_ctrlr_ops; subsystem->ops = &spdk_nvmf_virtual_ctrlr_ops;
} }