Commit 75022aa2 authored by Maciej Szwed's avatar Maciej Szwed Committed by Tomasz Zawadzki
Browse files

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: default avatarMaciej Szwed <maciej.szwed@intel.com>
Change-Id: I881438955f08852fb72187a2b92c7acfb12cd662
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5029


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 3962f904
Loading
Loading
Loading
Loading
+17 −18
Original line number Diff line number Diff line
@@ -110,23 +110,20 @@ _spdk_scheduler_set(char *name)
		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) {
		g_new_scheduler = scheduler;
		if (g_scheduler != g_new_scheduler) {
			/* Scheduler already changed, cannot defer multiple deinits */
			return -EBUSY;
		}
	} else {
		if (g_scheduler->deinit != NULL) {
		if (g_scheduler != NULL && g_scheduler->deinit != NULL) {
			g_scheduler->deinit(&g_governor);
		}

		g_new_scheduler = scheduler;
		g_scheduler = scheduler;
	}

	g_new_scheduler = scheduler;

	if (scheduler->init != NULL) {
		scheduler->init(&g_governor);
	}
@@ -197,16 +194,11 @@ static bool reactor_thread_op_supported(enum spdk_thread_op op);
int
spdk_reactors_init(void)
{
	struct spdk_reactor *reactor;
	int rc;
	uint32_t i, last_core;
	uint32_t i, last_core, current_core;
	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());
	g_spdk_event_mempool = spdk_mempool_create(mempool_name,
			       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);
	}

	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;

	return 0;
@@ -827,7 +827,6 @@ spdk_reactors_start(void)
	/* Start the main reactor */
	reactor = spdk_reactor_get(current_core);
	assert(reactor != NULL);
	g_scheduling_reactor = reactor;
	reactor_run(reactor);

	spdk_env_thread_wait_all();
+18 −3
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ test_init_reactors(void)
{
	uint32_t core;

	MOCK_SET(spdk_env_get_current_core, 0);

	allocate_cores(3);

	CU_ASSERT(spdk_reactors_init() == 0);
@@ -71,6 +73,8 @@ test_init_reactors(void)
	spdk_reactors_fini();

	free_cores();

	MOCK_CLEAR(spdk_env_get_current_core);
}

static void
@@ -90,6 +94,8 @@ test_event_call(void)
	struct spdk_event *evt;
	struct spdk_reactor *reactor;

	MOCK_SET(spdk_env_get_current_core, 0);

	allocate_cores(1);

	CU_ASSERT(spdk_reactors_init() == 0);
@@ -109,6 +115,8 @@ test_event_call(void)
	spdk_reactors_fini();

	free_cores();

	MOCK_CLEAR(spdk_env_get_current_core);
}

static void
@@ -119,6 +127,8 @@ test_schedule_thread(void)
	struct spdk_reactor *reactor;
	struct spdk_lw_thread *lw_thread;

	MOCK_SET(spdk_env_get_current_core, 0);

	allocate_cores(5);

	CU_ASSERT(spdk_reactors_init() == 0);
@@ -169,6 +179,8 @@ test_reschedule_thread(void)
	struct spdk_reactor *reactor;
	struct spdk_lw_thread *lw_thread;

	MOCK_SET(spdk_env_get_current_core, 0);

	allocate_cores(3);

	CU_ASSERT(spdk_reactors_init() == 0);
@@ -269,12 +281,12 @@ test_for_each_reactor(void)
	bool done = false;
	struct spdk_reactor *reactor;

	MOCK_SET(spdk_env_get_current_core, 0);

	allocate_cores(5);

	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);

	MOCK_CLEAR(spdk_env_get_current_core);
@@ -350,13 +362,14 @@ test_reactor_stats(void)
	 * - idle TSC of reactor should be 500 (= 200 + 300).
	 */

	MOCK_SET(spdk_env_get_current_core, 0);

	allocate_cores(1);

	CU_ASSERT(spdk_reactors_init() == 0);

	spdk_cpuset_set_cpu(&cpuset, 0, true);

	MOCK_SET(spdk_env_get_current_core, 0);
	MOCK_SET(spdk_get_ticks, 100);

	thread1 = spdk_thread_create(NULL, &cpuset);
@@ -427,6 +440,8 @@ test_reactor_stats(void)
	spdk_reactors_fini();

	free_cores();

	MOCK_CLEAR(spdk_env_get_current_core);
}

int