From 67234b6ad428a0fa5cc5cb451bce36c882974dc0 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Fri, 26 Apr 2019 12:58:21 -0700 Subject: [PATCH] event: Attempt to respect cpumask when scheduling threads Individual threads can have their own CPU mask. Attempt to respect that in the scheduler. Change-Id: I2bd08d4249bdae32a459ed8770b88090346be5dc Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452258 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- lib/event/reactor.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/event/reactor.c b/lib/event/reactor.c index 712969a49..8b19839c9 100644 --- a/lib/event/reactor.c +++ b/lib/event/reactor.c @@ -405,21 +405,37 @@ spdk_reactor_schedule_thread(struct spdk_thread *thread) { uint32_t core; struct spdk_lw_thread *lw_thread; - struct spdk_event *evt; + struct spdk_event *evt = NULL; + struct spdk_cpuset *cpumask; + uint32_t i; + + cpumask = spdk_thread_get_cpumask(thread); lw_thread = spdk_thread_get_ctx(thread); assert(lw_thread != NULL); memset(lw_thread, 0, sizeof(*lw_thread)); pthread_mutex_lock(&g_scheduler_mtx); - if (g_next_core > spdk_env_get_last_core()) { - g_next_core = spdk_env_get_first_core(); + for (i = 0; i < spdk_env_get_core_count(); i++) { + if (g_next_core > spdk_env_get_last_core()) { + g_next_core = spdk_env_get_first_core(); + } + core = g_next_core; + g_next_core = spdk_env_get_next_core(g_next_core); + + if (spdk_cpuset_get_cpu(cpumask, core)) { + evt = spdk_event_allocate(core, _schedule_thread, lw_thread, NULL); + break; + } } - core = g_next_core; - g_next_core = spdk_env_get_next_core(g_next_core); pthread_mutex_unlock(&g_scheduler_mtx); - evt = spdk_event_allocate(core, _schedule_thread, lw_thread, NULL); + assert(evt != NULL); + if (evt == NULL) { + SPDK_ERRLOG("Unable to schedule thread on requested core mask.\n"); + return -1; + } + spdk_event_call(evt); return 0;