From 1b1e52cb47d3ad70e97e31007cd718c8ba6ac196 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Fri, 23 Oct 2020 14:02:06 +0200 Subject: [PATCH] event: Do not change scheduler while scheduling Signed-off-by: Maciej Szwed Change-Id: Idb8cce814b90f7a7a4a06c81507ce79da91e312c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4856 Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins --- lib/event/reactor.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/event/reactor.c b/lib/event/reactor.c index 07c50218d..cabe2c151 100644 --- a/lib/event/reactor.c +++ b/lib/event/reactor.c @@ -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) {