nvme: move init_ctrlrs out of multi-process struct
Each process should manage its own list of controllers that are initializing; the list doesn't need to be shared between processes. This is the first step toward preventing non-PCI controllers from being added into the shared attached_ctrlrs list. Change-Id: Ia6f85fe89e28a04f0950da5362bb2f49d1b76da9 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-on: https://review.gerrithub.io/388695 Tested-by: 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>
This commit is contained in:
parent
1c4bdde9a4
commit
1804f3c528
@ -45,6 +45,16 @@ int32_t spdk_nvme_retry_count;
|
|||||||
/* gross timeout of 180 seconds in milliseconds */
|
/* gross timeout of 180 seconds in milliseconds */
|
||||||
static int g_nvme_driver_timeout_ms = 3 * 60 * 1000;
|
static int g_nvme_driver_timeout_ms = 3 * 60 * 1000;
|
||||||
|
|
||||||
|
static TAILQ_HEAD(, spdk_nvme_ctrlr) g_nvme_init_ctrlrs =
|
||||||
|
TAILQ_HEAD_INITIALIZER(g_nvme_init_ctrlrs);
|
||||||
|
|
||||||
|
/* Caller must hold g_spdk_nvme_driver->lock */
|
||||||
|
void
|
||||||
|
nvme_ctrlr_connected(struct spdk_nvme_ctrlr *ctrlr)
|
||||||
|
{
|
||||||
|
TAILQ_INSERT_TAIL(&g_nvme_init_ctrlrs, ctrlr, tailq);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvme_detach(struct spdk_nvme_ctrlr *ctrlr)
|
spdk_nvme_detach(struct spdk_nvme_ctrlr *ctrlr)
|
||||||
{
|
{
|
||||||
@ -300,7 +310,6 @@ nvme_driver_init(void)
|
|||||||
|
|
||||||
g_spdk_nvme_driver->initialized = false;
|
g_spdk_nvme_driver->initialized = false;
|
||||||
|
|
||||||
TAILQ_INIT(&g_spdk_nvme_driver->init_ctrlrs);
|
|
||||||
TAILQ_INIT(&g_spdk_nvme_driver->attached_ctrlrs);
|
TAILQ_INIT(&g_spdk_nvme_driver->attached_ctrlrs);
|
||||||
|
|
||||||
SPDK_STATIC_ASSERT(sizeof(host_id) == sizeof(g_spdk_nvme_driver->default_extended_host_id),
|
SPDK_STATIC_ASSERT(sizeof(host_id) == sizeof(g_spdk_nvme_driver->default_extended_host_id),
|
||||||
@ -329,7 +338,7 @@ nvme_ctrlr_probe(const struct spdk_nvme_transport_id *trid, void *devhandle,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(&g_spdk_nvme_driver->init_ctrlrs, ctrlr, tailq);
|
TAILQ_INSERT_TAIL(&g_nvme_init_ctrlrs, ctrlr, tailq);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,9 +354,9 @@ nvme_init_controllers(void *cb_ctx, spdk_nvme_attach_cb attach_cb)
|
|||||||
|
|
||||||
nvme_robust_mutex_lock(&g_spdk_nvme_driver->lock);
|
nvme_robust_mutex_lock(&g_spdk_nvme_driver->lock);
|
||||||
|
|
||||||
/* Initialize all new controllers in the init_ctrlrs list in parallel. */
|
/* Initialize all new controllers in the g_nvme_init_ctrlrs list in parallel. */
|
||||||
while (!TAILQ_EMPTY(&g_spdk_nvme_driver->init_ctrlrs)) {
|
while (!TAILQ_EMPTY(&g_nvme_init_ctrlrs)) {
|
||||||
TAILQ_FOREACH_SAFE(ctrlr, &g_spdk_nvme_driver->init_ctrlrs, tailq, ctrlr_tmp) {
|
TAILQ_FOREACH_SAFE(ctrlr, &g_nvme_init_ctrlrs, tailq, ctrlr_tmp) {
|
||||||
/* Drop the driver lock while calling nvme_ctrlr_process_init()
|
/* Drop the driver lock while calling nvme_ctrlr_process_init()
|
||||||
* since it needs to acquire the driver lock internally when calling
|
* since it needs to acquire the driver lock internally when calling
|
||||||
* nvme_ctrlr_start().
|
* nvme_ctrlr_start().
|
||||||
@ -362,7 +371,7 @@ nvme_init_controllers(void *cb_ctx, spdk_nvme_attach_cb attach_cb)
|
|||||||
|
|
||||||
if (start_rc) {
|
if (start_rc) {
|
||||||
/* Controller failed to initialize. */
|
/* Controller failed to initialize. */
|
||||||
TAILQ_REMOVE(&g_spdk_nvme_driver->init_ctrlrs, ctrlr, tailq);
|
TAILQ_REMOVE(&g_nvme_init_ctrlrs, ctrlr, tailq);
|
||||||
nvme_ctrlr_destruct(ctrlr);
|
nvme_ctrlr_destruct(ctrlr);
|
||||||
rc = -1;
|
rc = -1;
|
||||||
break;
|
break;
|
||||||
@ -373,7 +382,7 @@ nvme_init_controllers(void *cb_ctx, spdk_nvme_attach_cb attach_cb)
|
|||||||
* Controller has been initialized.
|
* Controller has been initialized.
|
||||||
* Move it to the attached_ctrlrs list.
|
* Move it to the attached_ctrlrs list.
|
||||||
*/
|
*/
|
||||||
TAILQ_REMOVE(&g_spdk_nvme_driver->init_ctrlrs, ctrlr, tailq);
|
TAILQ_REMOVE(&g_nvme_init_ctrlrs, ctrlr, tailq);
|
||||||
TAILQ_INSERT_TAIL(&g_spdk_nvme_driver->attached_ctrlrs, ctrlr, tailq);
|
TAILQ_INSERT_TAIL(&g_spdk_nvme_driver->attached_ctrlrs, ctrlr, tailq);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -465,7 +465,6 @@ struct spdk_nvme_ctrlr {
|
|||||||
|
|
||||||
struct nvme_driver {
|
struct nvme_driver {
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
TAILQ_HEAD(, spdk_nvme_ctrlr) init_ctrlrs;
|
|
||||||
TAILQ_HEAD(, spdk_nvme_ctrlr) attached_ctrlrs;
|
TAILQ_HEAD(, spdk_nvme_ctrlr) attached_ctrlrs;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
uint8_t default_extended_host_id[16];
|
uint8_t default_extended_host_id[16];
|
||||||
@ -562,6 +561,7 @@ void nvme_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr);
|
|||||||
void nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove);
|
void nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove);
|
||||||
int nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr);
|
int nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr);
|
||||||
int nvme_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr);
|
int nvme_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr);
|
||||||
|
void nvme_ctrlr_connected(struct spdk_nvme_ctrlr *ctrlr);
|
||||||
|
|
||||||
int nvme_ctrlr_submit_admin_request(struct spdk_nvme_ctrlr *ctrlr,
|
int nvme_ctrlr_submit_admin_request(struct spdk_nvme_ctrlr *ctrlr,
|
||||||
struct nvme_request *req);
|
struct nvme_request *req);
|
||||||
|
@ -1238,7 +1238,7 @@ nvme_rdma_ctrlr_scan(const struct spdk_nvme_transport_id *discovery_trid,
|
|||||||
if (direct_connect == true) {
|
if (direct_connect == true) {
|
||||||
/* Set the ready state to skip the normal init process */
|
/* Set the ready state to skip the normal init process */
|
||||||
discovery_ctrlr->state = NVME_CTRLR_STATE_READY;
|
discovery_ctrlr->state = NVME_CTRLR_STATE_READY;
|
||||||
TAILQ_INSERT_TAIL(&g_spdk_nvme_driver->init_ctrlrs, discovery_ctrlr, tailq);
|
nvme_ctrlr_connected(discovery_ctrlr);
|
||||||
nvme_ctrlr_add_process(discovery_ctrlr, 0);
|
nvme_ctrlr_add_process(discovery_ctrlr, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ test_spdk_nvme_probe(void)
|
|||||||
|
|
||||||
/* driver init passes, transport available, we are primary */
|
/* driver init passes, transport available, we are primary */
|
||||||
MOCK_SET(spdk_process_is_primary, bool, true);
|
MOCK_SET(spdk_process_is_primary, bool, true);
|
||||||
TAILQ_INIT(&dummy.init_ctrlrs);
|
TAILQ_INIT(&g_nvme_init_ctrlrs);
|
||||||
rc = spdk_nvme_probe(trid, cb_ctx, probe_cb, attach_cb, remove_cb);
|
rc = spdk_nvme_probe(trid, cb_ctx, probe_cb, attach_cb, remove_cb);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
|
|
||||||
@ -203,8 +203,8 @@ test_nvme_init_controllers(void)
|
|||||||
memset(&ctrlr, 0, sizeof(struct spdk_nvme_ctrlr));
|
memset(&ctrlr, 0, sizeof(struct spdk_nvme_ctrlr));
|
||||||
CU_ASSERT(pthread_mutexattr_init(&attr) == 0);
|
CU_ASSERT(pthread_mutexattr_init(&attr) == 0);
|
||||||
CU_ASSERT(pthread_mutex_init(&test_driver.lock, &attr) == 0);
|
CU_ASSERT(pthread_mutex_init(&test_driver.lock, &attr) == 0);
|
||||||
TAILQ_INIT(&test_driver.init_ctrlrs);
|
TAILQ_INIT(&g_nvme_init_ctrlrs);
|
||||||
TAILQ_INSERT_TAIL(&test_driver.init_ctrlrs, &ctrlr, tailq);
|
TAILQ_INSERT_TAIL(&g_nvme_init_ctrlrs, &ctrlr, tailq);
|
||||||
TAILQ_INIT(&test_driver.attached_ctrlrs);
|
TAILQ_INIT(&test_driver.attached_ctrlrs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -217,7 +217,7 @@ test_nvme_init_controllers(void)
|
|||||||
rc = nvme_init_controllers(cb_ctx, attach_cb);
|
rc = nvme_init_controllers(cb_ctx, attach_cb);
|
||||||
CU_ASSERT(rc == -1);
|
CU_ASSERT(rc == -1);
|
||||||
CU_ASSERT(g_spdk_nvme_driver->initialized == true);
|
CU_ASSERT(g_spdk_nvme_driver->initialized == true);
|
||||||
CU_ASSERT(TAILQ_EMPTY(&g_spdk_nvme_driver->init_ctrlrs));
|
CU_ASSERT(TAILQ_EMPTY(&g_nvme_init_ctrlrs));
|
||||||
CU_ASSERT(ut_destruct_called == true);
|
CU_ASSERT(ut_destruct_called == true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -225,13 +225,13 @@ test_nvme_init_controllers(void)
|
|||||||
* forward by setting the ctrl state so that it can be moved
|
* forward by setting the ctrl state so that it can be moved
|
||||||
* the attached_ctrlrs list.
|
* the attached_ctrlrs list.
|
||||||
*/
|
*/
|
||||||
TAILQ_INSERT_TAIL(&test_driver.init_ctrlrs, &ctrlr, tailq);
|
TAILQ_INSERT_TAIL(&g_nvme_init_ctrlrs, &ctrlr, tailq);
|
||||||
ctrlr.state = NVME_CTRLR_STATE_READY;
|
ctrlr.state = NVME_CTRLR_STATE_READY;
|
||||||
MOCK_SET(nvme_ctrlr_process_init, int, 0);
|
MOCK_SET(nvme_ctrlr_process_init, int, 0);
|
||||||
rc = nvme_init_controllers(cb_ctx, attach_cb);
|
rc = nvme_init_controllers(cb_ctx, attach_cb);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
CU_ASSERT(ut_attach_cb_called == true);
|
CU_ASSERT(ut_attach_cb_called == true);
|
||||||
CU_ASSERT(TAILQ_EMPTY(&g_spdk_nvme_driver->init_ctrlrs));
|
CU_ASSERT(TAILQ_EMPTY(&g_nvme_init_ctrlrs));
|
||||||
CU_ASSERT(TAILQ_FIRST(&g_spdk_nvme_driver->attached_ctrlrs) == &ctrlr);
|
CU_ASSERT(TAILQ_FIRST(&g_spdk_nvme_driver->attached_ctrlrs) == &ctrlr);
|
||||||
|
|
||||||
g_spdk_nvme_driver = NULL;
|
g_spdk_nvme_driver = NULL;
|
||||||
@ -307,7 +307,7 @@ test_nvme_driver_init(void)
|
|||||||
g_spdk_nvme_driver = NULL;
|
g_spdk_nvme_driver = NULL;
|
||||||
rc = nvme_driver_init();
|
rc = nvme_driver_init();
|
||||||
CU_ASSERT(g_spdk_nvme_driver->initialized == false);
|
CU_ASSERT(g_spdk_nvme_driver->initialized == false);
|
||||||
CU_ASSERT(TAILQ_EMPTY(&g_spdk_nvme_driver->init_ctrlrs));
|
CU_ASSERT(TAILQ_EMPTY(&g_nvme_init_ctrlrs));
|
||||||
CU_ASSERT(TAILQ_EMPTY(&g_spdk_nvme_driver->attached_ctrlrs));
|
CU_ASSERT(TAILQ_EMPTY(&g_spdk_nvme_driver->attached_ctrlrs));
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
|
|
||||||
@ -622,10 +622,10 @@ test_nvme_ctrlr_probe(void)
|
|||||||
MOCK_SET(dummy_probe_cb, bool, true);
|
MOCK_SET(dummy_probe_cb, bool, true);
|
||||||
MOCK_SET_P(nvme_transport_ctrlr_construct,
|
MOCK_SET_P(nvme_transport_ctrlr_construct,
|
||||||
struct spdk_nvme_ctrlr *, &ut_nvme_transport_ctrlr_construct);
|
struct spdk_nvme_ctrlr *, &ut_nvme_transport_ctrlr_construct);
|
||||||
TAILQ_INIT(&g_spdk_nvme_driver->init_ctrlrs);
|
TAILQ_INIT(&g_nvme_init_ctrlrs);
|
||||||
rc = nvme_ctrlr_probe(trid, devhandle, dummy_probe_cb, cb_ctx);
|
rc = nvme_ctrlr_probe(trid, devhandle, dummy_probe_cb, cb_ctx);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
dummy = TAILQ_FIRST(&g_spdk_nvme_driver->init_ctrlrs);
|
dummy = TAILQ_FIRST(&g_nvme_init_ctrlrs);
|
||||||
CU_ASSERT(dummy == &ut_nvme_transport_ctrlr_construct);
|
CU_ASSERT(dummy == &ut_nvme_transport_ctrlr_construct);
|
||||||
|
|
||||||
free(g_spdk_nvme_driver);
|
free(g_spdk_nvme_driver);
|
||||||
|
Loading…
Reference in New Issue
Block a user