Commit 1b1e52cb authored by Maciej Szwed's avatar Maciej Szwed Committed by Tomasz Zawadzki
Browse files

event: Do not change scheduler while scheduling



Signed-off-by: default avatarMaciej Szwed <maciej.szwed@intel.com>
Change-Id: Idb8cce814b90f7a7a4a06c81507ce79da91e312c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4856


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent b309e8ce
Loading
Loading
Loading
Loading
+28 −7
Original line number Diff line number Diff line
@@ -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) {
	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,11 +689,19 @@ 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)) {
				  !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) {
			break;