Commit cf155f23 authored by Tomasz Zawadzki's avatar Tomasz Zawadzki
Browse files

lib/event: refactor _reactors_scheduler_update_core_mode()



Replaced multiple functions calls to _reactors_scheduler_update_core_mode(),
with a for loop.

Since changing reactor to interrupt mode is rare operation, most of the
time we ended up with unnecessarily long callstack.

Signed-off-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I1c7858653be9e2256943c1da5a27001be41682b6
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8714


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent cff96883
Loading
Loading
Loading
Loading
+15 −22
Original line number Diff line number Diff line
@@ -731,31 +731,24 @@ static void
_reactors_scheduler_update_core_mode(void *ctx)
{
	struct spdk_reactor *reactor;
	uint32_t i;
	int rc = 0;

	if (g_scheduler_core_number == SPDK_ENV_LCORE_ID_ANY) {
		g_scheduler_core_number = spdk_env_get_first_core();
	} else {
		g_scheduler_core_number = spdk_env_get_next_core(g_scheduler_core_number);
	}

	if (g_scheduler_core_number == SPDK_ENV_LCORE_ID_ANY) {
		_reactors_scheduler_fini();
		return;
	}

	reactor = spdk_reactor_get(g_scheduler_core_number);
	for (i = g_scheduler_core_number; i < SPDK_ENV_LCORE_ID_ANY; i = spdk_env_get_next_core(i)) {
		reactor = spdk_reactor_get(i);
		assert(reactor != NULL);
	if (reactor->in_interrupt != g_core_infos[g_scheduler_core_number].interrupt_mode) {
		if (reactor->in_interrupt != g_core_infos[i].interrupt_mode) {
			/* Switch next found reactor to new state */
		rc = spdk_reactor_set_interrupt_mode(g_scheduler_core_number,
						     g_core_infos[g_scheduler_core_number].interrupt_mode, _reactors_scheduler_update_core_mode, NULL);
			rc = spdk_reactor_set_interrupt_mode(i, g_core_infos[i].interrupt_mode,
							     _reactors_scheduler_update_core_mode, NULL);
			if (rc == 0) {
				/* Set core to start with after callback completes */
				g_scheduler_core_number = spdk_env_get_next_core(i);
				return;
			}
		}

	_reactors_scheduler_update_core_mode(NULL);
	}
	_reactors_scheduler_fini();
}

static void
@@ -764,7 +757,7 @@ _reactors_scheduler_balance(void *arg1, void *arg2)
	if (g_reactor_state == SPDK_REACTOR_STATE_RUNNING) {
		g_scheduler->balance(g_core_infos, g_reactor_count, &g_governor);

		g_scheduler_core_number = SPDK_ENV_LCORE_ID_ANY;
		g_scheduler_core_number = spdk_env_get_first_core();
		_reactors_scheduler_update_core_mode(NULL);
	}
}