From 47a6578ee55c47dc84d168ac83eb730a4c7f293a Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Wed, 19 May 2021 05:47:34 -0400 Subject: [PATCH] lib/event: calculate last_stats in event framework Rather than to rely on schedulers to access and modify last_stats values over multiple scheduling periods, move that operation to event framework. Providing this to the schedulers in generic manner is better than enforcing that each scheduler has to keep track of this data on their own. Signed-off-by: Tomasz Zawadzki Change-Id: Icaf3b4af80d86fafaddf328fd230db9743d21ab5 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7971 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Konrad Sztyber --- lib/event/reactor.c | 10 +++++++--- lib/event/scheduler_dynamic.c | 3 --- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/event/reactor.c b/lib/event/reactor.c index f1d66d1e0..3242d92e2 100644 --- a/lib/event/reactor.c +++ b/lib/event/reactor.c @@ -674,11 +674,18 @@ static void _init_thread_stats(struct spdk_reactor *reactor, struct spdk_lw_thread *lw_thread) { struct spdk_thread *thread = spdk_thread_get_from_ctx(lw_thread); + struct spdk_thread_stats last_stats; + + /* Save last stats before replacing them. */ + last_stats = lw_thread->current_stats; lw_thread->lcore = reactor->lcore; spdk_set_thread(thread); spdk_thread_get_stats(&lw_thread->current_stats); + spdk_set_thread(NULL); + + lw_thread->last_stats = last_stats; } static void @@ -1170,7 +1177,6 @@ _reactor_schedule_thread(struct spdk_thread *thread) { uint32_t core; struct spdk_lw_thread *lw_thread; - struct spdk_thread_stats last_stats; struct spdk_event *evt = NULL; struct spdk_cpuset *cpumask; uint32_t i; @@ -1184,9 +1190,7 @@ _reactor_schedule_thread(struct spdk_thread *thread) lw_thread = spdk_thread_get_ctx(thread); assert(lw_thread != NULL); core = lw_thread->lcore; - last_stats = lw_thread->last_stats; memset(lw_thread, 0, sizeof(*lw_thread)); - lw_thread->last_stats = last_stats; if (current_lcore != SPDK_ENV_LCORE_ID_ANY) { local_reactor = spdk_reactor_get(current_lcore); diff --git a/lib/event/scheduler_dynamic.c b/lib/event/scheduler_dynamic.c index ceaaa90dd..063da396c 100644 --- a/lib/event/scheduler_dynamic.c +++ b/lib/event/scheduler_dynamic.c @@ -71,9 +71,6 @@ _get_thread_load(struct spdk_lw_thread *lw_thread) busy = lw_thread->current_stats.busy_tsc - lw_thread->last_stats.busy_tsc; idle = lw_thread->current_stats.idle_tsc - lw_thread->last_stats.idle_tsc; - lw_thread->last_stats.busy_tsc = lw_thread->current_stats.busy_tsc; - lw_thread->last_stats.idle_tsc = lw_thread->current_stats.idle_tsc; - if (busy == 0) { /* No work was done, exit before possible division by 0. */ return 0;