event: Do not change scheduler while scheduling

Signed-off-by: Maciej Szwed <maciej.szwed@intel.com>
Change-Id: Idb8cce814b90f7a7a4a06c81507ce79da91e312c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4856
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Maciej Szwed 2020-10-23 14:02:06 +02:00 committed by Tomasz Zawadzki
parent b309e8cefa
commit 1b1e52cb47

View File

@ -66,6 +66,7 @@ TAILQ_HEAD(, spdk_scheduler) g_scheduler_list
= TAILQ_HEAD_INITIALIZER(g_scheduler_list);
static struct spdk_scheduler *g_scheduler;
static struct spdk_scheduler *g_new_scheduler;
static struct spdk_reactor *g_scheduling_reactor;
static uint32_t g_scheduler_period;
static struct spdk_scheduler_core_info *g_core_infos = NULL;
@ -109,15 +110,27 @@ _spdk_scheduler_set(char *name)
return -ENOENT;
}
if (g_scheduler != NULL && g_scheduler->deinit != NULL) {
g_scheduler->deinit(&g_governor);
if (g_reactors == NULL || g_scheduling_reactor == NULL) {
g_new_scheduler = scheduler;
g_scheduler = scheduler;
return 0;
}
if (g_scheduling_reactor->flags.is_scheduling) {
g_new_scheduler = scheduler;
} else {
if (g_scheduler->deinit != NULL) {
g_scheduler->deinit(&g_governor);
}
g_new_scheduler = scheduler;
g_scheduler = scheduler;
}
if (scheduler->init != NULL) {
scheduler->init(&g_governor);
}
g_scheduler = scheduler;
return 0;
}
@ -676,10 +689,18 @@ reactor_run(void *arg)
if (spdk_unlikely((reactor->tsc_last - last_sched) > g_scheduler_period &&
reactor == g_scheduling_reactor &&
!reactor->flags.is_scheduling &&
g_scheduler->balance)) {
last_sched = reactor->tsc_last;
_reactors_scheduler_gather_metrics(NULL, NULL);
!reactor->flags.is_scheduling)) {
if (spdk_unlikely(g_scheduler != g_new_scheduler)) {
if (g_scheduler->deinit != NULL) {
g_scheduler->deinit(&g_governor);
}
g_scheduler = g_new_scheduler;
}
if (spdk_unlikely(g_scheduler->balance != NULL)) {
last_sched = reactor->tsc_last;
_reactors_scheduler_gather_metrics(NULL, NULL);
}
}
if (g_reactor_state != SPDK_REACTOR_STATE_RUNNING) {