Messages in this thread Patch in this message | | | From | Ankur Arora <> | Subject | [PATCH 11/30] sched: runtime preemption config under PREEMPT_AUTO | Date | Mon, 12 Feb 2024 21:55:35 -0800 |
| |
Reuse sched_dynamic_update() and related logic to enable choosing the preemption model at boot or runtime for PREEMPT_AUTO.
The interface is identical to PREEMPT_DYNAMIC.
Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@redhat.com> Cc: Vincent Guittot <vincent.guittot@linaro.org> Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com> --- include/linux/sched.h | 2 +- kernel/sched/core.c | 31 +++++++++++++++++++++++++++---- kernel/sched/debug.c | 6 +++--- kernel/sched/sched.h | 2 +- 4 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h index d226c2920cff..58e6ea7572a0 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2073,7 +2073,7 @@ extern int __cond_resched_rwlock_write(rwlock_t *lock); __cond_resched_rwlock_write(lock); \ }) -#ifdef CONFIG_PREEMPT_DYNAMIC +#if defined(CONFIG_PREEMPT_DYNAMIC) || defined(CONFIG_PREEMPT_AUTO) extern bool preempt_model_none(void); extern bool preempt_model_voluntary(void); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 6c5de6c1da27..e5d631197f35 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8692,9 +8692,13 @@ int __cond_resched_rwlock_write(rwlock_t *lock) } EXPORT_SYMBOL(__cond_resched_rwlock_write); -#if defined(CONFIG_PREEMPT_DYNAMIC) +#if defined(CONFIG_PREEMPT_DYNAMIC) || defined (CONFIG_PREEMPT_AUTO) +#ifdef CONFIG_PREEMPT_DYNAMIC #define PREEMPT_MODE "Dynamic Preempt" +#else +#define PREEMPT_MODE "Preempt Auto" +#endif enum { preempt_dynamic_undefined = -1, @@ -8769,11 +8773,11 @@ PREEMPT_MODEL_ACCESSOR(none); PREEMPT_MODEL_ACCESSOR(voluntary); PREEMPT_MODEL_ACCESSOR(full); -#else /* !CONFIG_PREEMPT_DYNAMIC */ +#else /* !CONFIG_PREEMPT_DYNAMIC && !CONFIG_PREEMPT_AUTO */ static inline void preempt_dynamic_init(void) { } -#endif /* !CONFIG_PREEMPT_DYNAMIC */ +#endif /* !CONFIG_PREEMPT_DYNAMIC && !CONFIG_PREEMPT_AUTO */ #ifdef CONFIG_PREEMPT_DYNAMIC @@ -8904,7 +8908,26 @@ void sched_dynamic_klp_disable(void) #endif /* CONFIG_HAVE_PREEMPT_DYNAMIC_CALL */ -#endif /* #ifdef CONFIG_PREEMPT_DYNAMIC */ +#elif defined(CONFIG_PREEMPT_AUTO) + +static void __sched_dynamic_update(int mode) +{ + switch (mode) { + case preempt_dynamic_none: + preempt_dynamic_mode = preempt_dynamic_undefined; + break; + + case preempt_dynamic_voluntary: + preempt_dynamic_mode = preempt_dynamic_undefined; + break; + + case preempt_dynamic_full: + preempt_dynamic_mode = preempt_dynamic_undefined; + break; + } +} + +#endif /* CONFIG_PREEMPT_AUTO */ /** * yield - yield the current processor to other threads. diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 8d5d98a5834d..e53f1b73bf4a 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -216,7 +216,7 @@ static const struct file_operations sched_scaling_fops = { #endif /* SMP */ -#ifdef CONFIG_PREEMPT_DYNAMIC +#if defined(CONFIG_PREEMPT_DYNAMIC) || defined(CONFIG_PREEMPT_AUTO) static ssize_t sched_dynamic_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) @@ -276,7 +276,7 @@ static const struct file_operations sched_dynamic_fops = { .release = single_release, }; -#endif /* CONFIG_PREEMPT_DYNAMIC */ +#endif /* CONFIG_PREEMPT_DYNAMIC || CONFIG_PREEMPT_AUTO */ __read_mostly bool sched_debug_verbose; @@ -343,7 +343,7 @@ static __init int sched_init_debug(void) debugfs_create_file("features", 0644, debugfs_sched, NULL, &sched_feat_fops); debugfs_create_file_unsafe("verbose", 0644, debugfs_sched, &sched_debug_verbose, &sched_verbose_fops); -#ifdef CONFIG_PREEMPT_DYNAMIC +#if defined(CONFIG_PREEMPT_DYNAMIC) || defined(CONFIG_PREEMPT_AUTO) debugfs_create_file("preempt", 0644, debugfs_sched, NULL, &sched_dynamic_fops); #endif diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 001fe047bd5d..34899d17553e 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -3229,7 +3229,7 @@ extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *w extern int try_to_wake_up(struct task_struct *tsk, unsigned int state, int wake_flags); -#ifdef CONFIG_PREEMPT_DYNAMIC +#if defined(CONFIG_PREEMPT_DYNAMIC) || defined(CONFIG_PREEMPT_AUTO) extern int preempt_dynamic_mode; extern int sched_dynamic_mode(const char *str); extern void sched_dynamic_update(int mode); -- 2.31.1
| |