While making up its mind about whether to reschedule a target runqueue eagerly or lazily, resched_curr() needs to know if the target is executing in the kernel or in userspace. Add ct_state_cpu(). Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx> --- Using context-tracking for this seems like overkill. Is there a better way to achieve this? One problem with depending on user_enter() is that it happens much too late for our purposes. From the scheduler's point-of-view the exit state has effectively transitioned once the task exits the exit_to_user_loop() so we will see stale state while the task is done with exit_to_user_loop() but has not yet executed user_enter(). --- include/linux/context_tracking_state.h | 21 +++++++++++++++++++++ kernel/Kconfig.preempt | 1 + 2 files changed, 22 insertions(+) diff --git a/include/linux/context_tracking_state.h b/include/linux/context_tracking_state.h index bbff5f7f8803..6a8f1c7ba105 100644 --- a/include/linux/context_tracking_state.h +++ b/include/linux/context_tracking_state.h @@ -53,6 +53,13 @@ static __always_inline int __ct_state(void) { return raw_atomic_read(this_cpu_ptr(&context_tracking.state)) & CT_STATE_MASK; } + +static __always_inline int __ct_state_cpu(int cpu) +{ + struct context_tracking *ct = per_cpu_ptr(&context_tracking, cpu); + + return atomic_read(&ct->state) & CT_STATE_MASK; +} #endif #ifdef CONFIG_CONTEXT_TRACKING_IDLE @@ -139,6 +146,20 @@ static __always_inline int ct_state(void) return ret; } +static __always_inline int ct_state_cpu(int cpu) +{ + int ret; + + if (!context_tracking_enabled_cpu(cpu)) + return CONTEXT_DISABLED; + + preempt_disable(); + ret = __ct_state_cpu(cpu); + preempt_enable(); + + return ret; +} + #else static __always_inline bool context_tracking_enabled(void) { return false; } static __always_inline bool context_tracking_enabled_cpu(int cpu) { return false; } diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt index 715e7aebb9d8..aa87b5cd3ecc 100644 --- a/kernel/Kconfig.preempt +++ b/kernel/Kconfig.preempt @@ -80,6 +80,7 @@ config PREEMPT_COUNT config PREEMPTION bool select PREEMPT_COUNT + select CONTEXT_TRACKING_USER config SCHED_CORE bool "Core Scheduling for SMT" -- 2.31.1