On Wed, Nov 10, 2021 at 08:24PM +0000, Valentin Schneider wrote: [...] > +#ifdef CONFIG_PREEMPT_DYNAMIC > + > +extern bool is_preempt_none(void); > +extern bool is_preempt_voluntary(void); > +extern bool is_preempt_full(void); > + > +#else > + > +#define is_preempt_none() IS_ENABLED(CONFIG_PREEMPT_NONE) > +#define is_preempt_voluntary() IS_ENABLED(CONFIG_PREEMPT_VOLUNTARY) > +#define is_preempt_full() IS_ENABLED(CONFIG_PREEMPT) > + > +#endif > + > +#define is_preempt_rt() IS_ENABLED(CONFIG_PREEMPT_RT) > + Can these callables be real functions in all configs, making the !DYNAMIC ones just static inline bool ones? That'd catch invalid use in #if etc. in all configs. > /* > * Does a critical section need to be broken due to another > * task waiting?: (technically does not depend on CONFIG_PREEMPTION, > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 97047aa7b6c2..9db7f77e53c3 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -6638,6 +6638,17 @@ static void __init preempt_dynamic_init(void) > } > } > > +#define PREEMPT_MODE_ACCESSOR(mode) \ > + bool is_preempt_##mode(void) \ > + { \ > + WARN_ON_ONCE(preempt_dynamic_mode == preempt_dynamic_undefined); \ > + return preempt_dynamic_mode == preempt_dynamic_##mode; \ > + } This needs an EXPORT_SYMBOL, so it's usable from modules like the kcsan_test module.