From ab9f08f58550be86cbc3b18ad0b8d80b7b5b290f Mon Sep 17 00:00:00 2001 From: Andra Paraschiv Date: Thu, 2 Mar 2023 14:19:06 +0000 Subject: [PATCH] lib/uksched/*: Use per-lcpu variable for current thread Currently there is a global variable that keeps track of the current thread that is used by the scheduler logic. Use a per-lcpu variable instead, to also match the case when multiple cores are used for the unikernel setup. Signed-off-by: Andra Paraschiv Reviewed-by: Razvan Virtan Approved-by: Marc Rittinghaus Tested-by: Unikraft CI GitHub-Closes: #784 --- lib/uksched/include/uk/sched_impl.h | 7 +++++-- lib/uksched/include/uk/thread.h | 5 +++-- lib/uksched/sched.c | 7 +++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/uksched/include/uk/sched_impl.h b/lib/uksched/include/uk/sched_impl.h index d01b600ec..bf09b90a3 100644 --- a/lib/uksched/include/uk/sched_impl.h +++ b/lib/uksched/include/uk/sched_impl.h @@ -84,11 +84,14 @@ unsigned int uk_sched_thread_gc(struct uk_sched *sched); static inline void uk_sched_thread_switch(struct uk_thread *next) { - struct uk_thread *prev = __uk_sched_thread_current; + struct uk_thread *prev; + + prev = ukplat_per_lcpu_current(__uk_sched_thread_current); UK_ASSERT(prev); - __uk_sched_thread_current = next; + ukplat_per_lcpu_current(__uk_sched_thread_current) = next; + prev->tlsp = ukplat_tlsp_get(); if (prev->ectx) ukarch_ectx_store(prev->ectx); diff --git a/lib/uksched/include/uk/thread.h b/lib/uksched/include/uk/thread.h index 52ff52fd8..6579a4a4c 100644 --- a/lib/uksched/include/uk/thread.h +++ b/lib/uksched/include/uk/thread.h @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -89,12 +90,12 @@ UK_TAILQ_HEAD(uk_thread_list, struct uk_thread); uk_sched_thread_exit() /* managed by sched.c */ -extern struct uk_thread *__uk_sched_thread_current; +extern UKPLAT_PER_LCPU_DEFINE(struct uk_thread *, __uk_sched_thread_current); static inline struct uk_thread *uk_thread_current(void) { - return __uk_sched_thread_current; + return ukplat_per_lcpu_current(__uk_sched_thread_current); } /* diff --git a/lib/uksched/sched.c b/lib/uksched/sched.c index 7ac275997..4edb22f1c 100644 --- a/lib/uksched/sched.c +++ b/lib/uksched/sched.c @@ -43,8 +43,7 @@ struct uk_sched *uk_sched_head; -/* FIXME: Define per CPU (CPU-local variable declaration needed) */ -struct uk_thread *__uk_sched_thread_current; +UKPLAT_PER_LCPU_DEFINE(struct uk_thread *, __uk_sched_thread_current); int uk_sched_register(struct uk_sched *s) { @@ -220,7 +219,7 @@ int uk_sched_start(struct uk_sched *s) uk_thread_set_runnable(main_thread); /* Set main_thread as current scheduled thread */ - __uk_sched_thread_current = main_thread; + ukplat_per_lcpu_current(__uk_sched_thread_current) = main_thread; /* Add main to the scheduler's thread list */ UK_TAILQ_INSERT_TAIL(&s->thread_list, main_thread, thread_list); @@ -235,7 +234,7 @@ int uk_sched_start(struct uk_sched *s) return 0; err_unset_thread_current: - __uk_sched_thread_current = NULL; + ukplat_per_lcpu_current(__uk_sched_thread_current) = NULL; uk_thread_release(main_thread); err_out: return ret; -- 2.39.5