nvmf: only poll admin queue once every 10 ms
This should enhance performance, since the hardware admin queue poll function takes a mutex and should not be in the performance path. Change-Id: I7e4acde0337aaf7079811612cba5348acf0a467d Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
5d8c94536a
commit
7dfc5e922d
@ -49,10 +49,15 @@ nvmf_direct_ctrlr_get_data(struct nvmf_session *session)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nvmf_direct_ctrlr_poll_for_completions(struct nvmf_session *session)
|
nvmf_direct_ctrlr_poll_for_io_completions(struct nvmf_session *session)
|
||||||
|
{
|
||||||
|
spdk_nvme_qpair_process_completions(session->subsys->ctrlr.dev.direct.io_qpair, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nvmf_direct_ctrlr_poll_for_admin_completions(struct nvmf_session *session)
|
||||||
{
|
{
|
||||||
spdk_nvme_ctrlr_process_admin_completions(session->subsys->ctrlr.dev.direct.ctrlr);
|
spdk_nvme_ctrlr_process_admin_completions(session->subsys->ctrlr.dev.direct.ctrlr);
|
||||||
spdk_nvme_qpair_process_completions(session->subsys->ctrlr.dev.direct.io_qpair, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -251,5 +256,6 @@ const struct spdk_nvmf_ctrlr_ops spdk_nvmf_direct_ctrlr_ops = {
|
|||||||
.ctrlr_get_data = nvmf_direct_ctrlr_get_data,
|
.ctrlr_get_data = nvmf_direct_ctrlr_get_data,
|
||||||
.process_admin_cmd = nvmf_direct_ctrlr_process_admin_cmd,
|
.process_admin_cmd = nvmf_direct_ctrlr_process_admin_cmd,
|
||||||
.process_io_cmd = nvmf_direct_ctrlr_process_io_cmd,
|
.process_io_cmd = nvmf_direct_ctrlr_process_io_cmd,
|
||||||
.poll_for_completions = nvmf_direct_ctrlr_poll_for_completions,
|
.poll_for_io_completions = nvmf_direct_ctrlr_poll_for_io_completions,
|
||||||
|
.poll_for_admin_completions = nvmf_direct_ctrlr_poll_for_admin_completions,
|
||||||
};
|
};
|
||||||
|
@ -42,6 +42,8 @@
|
|||||||
#include "spdk/trace.h"
|
#include "spdk/trace.h"
|
||||||
#include "spdk/nvmf_spec.h"
|
#include "spdk/nvmf_spec.h"
|
||||||
|
|
||||||
|
#define ADMIN_POLL_MICROSECONDS 10000 /* 10 milliseconds */
|
||||||
|
|
||||||
static TAILQ_HEAD(, spdk_nvmf_subsystem) g_subsystems = TAILQ_HEAD_INITIALIZER(g_subsystems);
|
static TAILQ_HEAD(, spdk_nvmf_subsystem) g_subsystems = TAILQ_HEAD_INITIALIZER(g_subsystems);
|
||||||
|
|
||||||
struct spdk_nvmf_subsystem *
|
struct spdk_nvmf_subsystem *
|
||||||
@ -85,13 +87,29 @@ spdk_nvmf_subsystem_poller(void *arg)
|
|||||||
|
|
||||||
/* For NVMe subsystems, check the backing physical device for completions. */
|
/* For NVMe subsystems, check the backing physical device for completions. */
|
||||||
if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) {
|
if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) {
|
||||||
session->subsys->ctrlr.ops->poll_for_completions(session);
|
session->subsys->ctrlr.ops->poll_for_io_completions(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For each connection in the session, check for RDMA completions */
|
/* For each connection in the session, check for RDMA completions */
|
||||||
spdk_nvmf_session_poll(session);
|
spdk_nvmf_session_poll(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
spdk_nvmf_subsystem_admin_poll(void *arg)
|
||||||
|
{
|
||||||
|
struct spdk_nvmf_subsystem *subsystem = arg;
|
||||||
|
struct nvmf_session *session = subsystem->session;
|
||||||
|
|
||||||
|
if (!session) {
|
||||||
|
/* No active connections, so just return */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) {
|
||||||
|
session->subsys->ctrlr.ops->poll_for_admin_completions(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct spdk_nvmf_subsystem *
|
struct spdk_nvmf_subsystem *
|
||||||
nvmf_create_subsystem(int num, const char *name,
|
nvmf_create_subsystem(int num, const char *name,
|
||||||
enum spdk_nvmf_subtype subtype,
|
enum spdk_nvmf_subtype subtype,
|
||||||
@ -114,6 +132,8 @@ nvmf_create_subsystem(int num, const char *name,
|
|||||||
|
|
||||||
subsystem->lcore = lcore;
|
subsystem->lcore = lcore;
|
||||||
spdk_poller_register(&subsystem->poller, spdk_nvmf_subsystem_poller, subsystem, lcore, NULL, 0);
|
spdk_poller_register(&subsystem->poller, spdk_nvmf_subsystem_poller, subsystem, lcore, NULL, 0);
|
||||||
|
spdk_poller_register(&subsystem->admin_poller, spdk_nvmf_subsystem_admin_poll, subsystem,
|
||||||
|
lcore, NULL, ADMIN_POLL_MICROSECONDS);
|
||||||
|
|
||||||
TAILQ_INSERT_HEAD(&g_subsystems, subsystem, entries);
|
TAILQ_INSERT_HEAD(&g_subsystems, subsystem, entries);
|
||||||
|
|
||||||
|
@ -88,9 +88,14 @@ struct spdk_nvmf_ctrlr_ops {
|
|||||||
int (*process_io_cmd)(struct spdk_nvmf_request *req);
|
int (*process_io_cmd)(struct spdk_nvmf_request *req);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll for completions.
|
* Poll for I/O completions.
|
||||||
*/
|
*/
|
||||||
void (*poll_for_completions)(struct nvmf_session *session);
|
void (*poll_for_io_completions)(struct nvmf_session *session);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Poll for admin completions.
|
||||||
|
*/
|
||||||
|
void (*poll_for_admin_completions)(struct nvmf_session *session);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct spdk_nvmf_controller {
|
struct spdk_nvmf_controller {
|
||||||
@ -127,6 +132,7 @@ struct spdk_nvmf_subsystem {
|
|||||||
struct spdk_nvmf_controller ctrlr;
|
struct spdk_nvmf_controller ctrlr;
|
||||||
|
|
||||||
struct spdk_poller *poller;
|
struct spdk_poller *poller;
|
||||||
|
struct spdk_poller *admin_poller;
|
||||||
|
|
||||||
TAILQ_HEAD(, spdk_nvmf_listen_addr) listen_addrs;
|
TAILQ_HEAD(, spdk_nvmf_listen_addr) listen_addrs;
|
||||||
uint32_t num_listen_addrs;
|
uint32_t num_listen_addrs;
|
||||||
|
Loading…
Reference in New Issue
Block a user