event: Move scheduler set call and scheduling reactor set call
This fixes issue where scheduler is not being initialized on first set. Signed-off-by: Maciej Szwed <maciej.szwed@intel.com> Change-Id: I881438955f08852fb72187a2b92c7acfb12cd662 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5029 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
3962f9047a
commit
75022aa205
@ -110,23 +110,20 @@ _spdk_scheduler_set(char *name)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_reactors == NULL || g_scheduling_reactor == NULL) {
|
|
||||||
g_new_scheduler = scheduler;
|
|
||||||
g_scheduler = scheduler;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_scheduling_reactor->flags.is_scheduling) {
|
if (g_scheduling_reactor->flags.is_scheduling) {
|
||||||
g_new_scheduler = scheduler;
|
if (g_scheduler != g_new_scheduler) {
|
||||||
|
/* Scheduler already changed, cannot defer multiple deinits */
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (g_scheduler->deinit != NULL) {
|
if (g_scheduler != NULL && g_scheduler->deinit != NULL) {
|
||||||
g_scheduler->deinit(&g_governor);
|
g_scheduler->deinit(&g_governor);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_new_scheduler = scheduler;
|
|
||||||
g_scheduler = scheduler;
|
g_scheduler = scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_new_scheduler = scheduler;
|
||||||
|
|
||||||
if (scheduler->init != NULL) {
|
if (scheduler->init != NULL) {
|
||||||
scheduler->init(&g_governor);
|
scheduler->init(&g_governor);
|
||||||
}
|
}
|
||||||
@ -197,16 +194,11 @@ static bool reactor_thread_op_supported(enum spdk_thread_op op);
|
|||||||
int
|
int
|
||||||
spdk_reactors_init(void)
|
spdk_reactors_init(void)
|
||||||
{
|
{
|
||||||
|
struct spdk_reactor *reactor;
|
||||||
int rc;
|
int rc;
|
||||||
uint32_t i, last_core;
|
uint32_t i, last_core, current_core;
|
||||||
char mempool_name[32];
|
char mempool_name[32];
|
||||||
|
|
||||||
rc = _spdk_scheduler_set("static");
|
|
||||||
if (rc != 0) {
|
|
||||||
SPDK_ERRLOG("Failed setting up scheduler\n");
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(mempool_name, sizeof(mempool_name), "evtpool_%d", getpid());
|
snprintf(mempool_name, sizeof(mempool_name), "evtpool_%d", getpid());
|
||||||
g_spdk_event_mempool = spdk_mempool_create(mempool_name,
|
g_spdk_event_mempool = spdk_mempool_create(mempool_name,
|
||||||
262144 - 1, /* Power of 2 minus 1 is optimal for memory consumption */
|
262144 - 1, /* Power of 2 minus 1 is optimal for memory consumption */
|
||||||
@ -247,6 +239,14 @@ spdk_reactors_init(void)
|
|||||||
reactor_construct(&g_reactors[i], i);
|
reactor_construct(&g_reactors[i], i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
current_core = spdk_env_get_current_core();
|
||||||
|
reactor = spdk_reactor_get(current_core);
|
||||||
|
assert(reactor != NULL);
|
||||||
|
g_scheduling_reactor = reactor;
|
||||||
|
|
||||||
|
rc = _spdk_scheduler_set("static");
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
g_reactor_state = SPDK_REACTOR_STATE_INITIALIZED;
|
g_reactor_state = SPDK_REACTOR_STATE_INITIALIZED;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -827,7 +827,6 @@ spdk_reactors_start(void)
|
|||||||
/* Start the main reactor */
|
/* Start the main reactor */
|
||||||
reactor = spdk_reactor_get(current_core);
|
reactor = spdk_reactor_get(current_core);
|
||||||
assert(reactor != NULL);
|
assert(reactor != NULL);
|
||||||
g_scheduling_reactor = reactor;
|
|
||||||
reactor_run(reactor);
|
reactor_run(reactor);
|
||||||
|
|
||||||
spdk_env_thread_wait_all();
|
spdk_env_thread_wait_all();
|
||||||
|
@ -59,6 +59,8 @@ test_init_reactors(void)
|
|||||||
{
|
{
|
||||||
uint32_t core;
|
uint32_t core;
|
||||||
|
|
||||||
|
MOCK_SET(spdk_env_get_current_core, 0);
|
||||||
|
|
||||||
allocate_cores(3);
|
allocate_cores(3);
|
||||||
|
|
||||||
CU_ASSERT(spdk_reactors_init() == 0);
|
CU_ASSERT(spdk_reactors_init() == 0);
|
||||||
@ -71,6 +73,8 @@ test_init_reactors(void)
|
|||||||
spdk_reactors_fini();
|
spdk_reactors_fini();
|
||||||
|
|
||||||
free_cores();
|
free_cores();
|
||||||
|
|
||||||
|
MOCK_CLEAR(spdk_env_get_current_core);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -90,6 +94,8 @@ test_event_call(void)
|
|||||||
struct spdk_event *evt;
|
struct spdk_event *evt;
|
||||||
struct spdk_reactor *reactor;
|
struct spdk_reactor *reactor;
|
||||||
|
|
||||||
|
MOCK_SET(spdk_env_get_current_core, 0);
|
||||||
|
|
||||||
allocate_cores(1);
|
allocate_cores(1);
|
||||||
|
|
||||||
CU_ASSERT(spdk_reactors_init() == 0);
|
CU_ASSERT(spdk_reactors_init() == 0);
|
||||||
@ -109,6 +115,8 @@ test_event_call(void)
|
|||||||
spdk_reactors_fini();
|
spdk_reactors_fini();
|
||||||
|
|
||||||
free_cores();
|
free_cores();
|
||||||
|
|
||||||
|
MOCK_CLEAR(spdk_env_get_current_core);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -119,6 +127,8 @@ test_schedule_thread(void)
|
|||||||
struct spdk_reactor *reactor;
|
struct spdk_reactor *reactor;
|
||||||
struct spdk_lw_thread *lw_thread;
|
struct spdk_lw_thread *lw_thread;
|
||||||
|
|
||||||
|
MOCK_SET(spdk_env_get_current_core, 0);
|
||||||
|
|
||||||
allocate_cores(5);
|
allocate_cores(5);
|
||||||
|
|
||||||
CU_ASSERT(spdk_reactors_init() == 0);
|
CU_ASSERT(spdk_reactors_init() == 0);
|
||||||
@ -169,6 +179,8 @@ test_reschedule_thread(void)
|
|||||||
struct spdk_reactor *reactor;
|
struct spdk_reactor *reactor;
|
||||||
struct spdk_lw_thread *lw_thread;
|
struct spdk_lw_thread *lw_thread;
|
||||||
|
|
||||||
|
MOCK_SET(spdk_env_get_current_core, 0);
|
||||||
|
|
||||||
allocate_cores(3);
|
allocate_cores(3);
|
||||||
|
|
||||||
CU_ASSERT(spdk_reactors_init() == 0);
|
CU_ASSERT(spdk_reactors_init() == 0);
|
||||||
@ -269,12 +281,12 @@ test_for_each_reactor(void)
|
|||||||
bool done = false;
|
bool done = false;
|
||||||
struct spdk_reactor *reactor;
|
struct spdk_reactor *reactor;
|
||||||
|
|
||||||
|
MOCK_SET(spdk_env_get_current_core, 0);
|
||||||
|
|
||||||
allocate_cores(5);
|
allocate_cores(5);
|
||||||
|
|
||||||
CU_ASSERT(spdk_reactors_init() == 0);
|
CU_ASSERT(spdk_reactors_init() == 0);
|
||||||
|
|
||||||
MOCK_SET(spdk_env_get_current_core, 0);
|
|
||||||
|
|
||||||
spdk_for_each_reactor(for_each_reactor_cb, &count, &done, for_each_reactor_done);
|
spdk_for_each_reactor(for_each_reactor_cb, &count, &done, for_each_reactor_done);
|
||||||
|
|
||||||
MOCK_CLEAR(spdk_env_get_current_core);
|
MOCK_CLEAR(spdk_env_get_current_core);
|
||||||
@ -350,13 +362,14 @@ test_reactor_stats(void)
|
|||||||
* - idle TSC of reactor should be 500 (= 200 + 300).
|
* - idle TSC of reactor should be 500 (= 200 + 300).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
MOCK_SET(spdk_env_get_current_core, 0);
|
||||||
|
|
||||||
allocate_cores(1);
|
allocate_cores(1);
|
||||||
|
|
||||||
CU_ASSERT(spdk_reactors_init() == 0);
|
CU_ASSERT(spdk_reactors_init() == 0);
|
||||||
|
|
||||||
spdk_cpuset_set_cpu(&cpuset, 0, true);
|
spdk_cpuset_set_cpu(&cpuset, 0, true);
|
||||||
|
|
||||||
MOCK_SET(spdk_env_get_current_core, 0);
|
|
||||||
MOCK_SET(spdk_get_ticks, 100);
|
MOCK_SET(spdk_get_ticks, 100);
|
||||||
|
|
||||||
thread1 = spdk_thread_create(NULL, &cpuset);
|
thread1 = spdk_thread_create(NULL, &cpuset);
|
||||||
@ -427,6 +440,8 @@ test_reactor_stats(void)
|
|||||||
spdk_reactors_fini();
|
spdk_reactors_fini();
|
||||||
|
|
||||||
free_cores();
|
free_cores();
|
||||||
|
|
||||||
|
MOCK_CLEAR(spdk_env_get_current_core);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
Reference in New Issue
Block a user