When a sched_ext scheduler is loaded, depending on the configuration, it can handle also fair tasks, however it isn't trivial to understand if a certain task is currently handled by fair or ext outside of scheduler code. This can be a problem when writing verification or observability tools like RV monitors.
Export a task_is_scx_enabled() to allow quick classification by using the scx state SCX_TASK_ENABLED. To: Tejun Heo <[email protected]> To: Andrea Righi <[email protected]> Signed-off-by: Gabriele Monaco <[email protected]> --- include/linux/sched/ext.h | 2 ++ kernel/sched/ext.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/include/linux/sched/ext.h b/include/linux/sched/ext.h index bcb962d5ee7d..68e5aff95159 100644 --- a/include/linux/sched/ext.h +++ b/include/linux/sched/ext.h @@ -232,6 +232,7 @@ void print_scx_info(const char *log_lvl, struct task_struct *p); void scx_softlockup(u32 dur_s); bool scx_hardlockup(int cpu); bool scx_rcu_cpu_stall(void); +bool task_is_scx_enabled(struct task_struct *p); #else /* !CONFIG_SCHED_CLASS_EXT */ @@ -240,6 +241,7 @@ static inline void print_scx_info(const char *log_lvl, struct task_struct *p) {} static inline void scx_softlockup(u32 dur_s) {} static inline bool scx_hardlockup(int cpu) { return false; } static inline bool scx_rcu_cpu_stall(void) { return false; } +static inline bool task_is_scx_enabled(struct task_struct *p) { return false; } #endif /* CONFIG_SCHED_CLASS_EXT */ diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index 62b1f3ac5630..1e48bc3cde15 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -3772,6 +3772,14 @@ bool task_should_scx(int policy) return policy == SCHED_EXT; } +/* + * Used by verification/observability tools like RV monitors. + */ +bool task_is_scx_enabled(struct task_struct *p) +{ + return scx_get_task_state(p) == SCX_TASK_ENABLED; +} + bool scx_allow_ttwu_queue(const struct task_struct *p) { struct scx_sched *sch; -- 2.53.0
