2#ifndef __LINUX_PREEMPT_H
3#define __LINUX_PREEMPT_H
38#define PREEMPT_SHIFT 0
39#define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS)
40#define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS)
41#define NMI_SHIFT (HARDIRQ_SHIFT + HARDIRQ_BITS)
43#define __IRQ_MASK(x) ((1UL << (x))-1)
45#define PREEMPT_MASK (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
46#define SOFTIRQ_MASK (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
47#define HARDIRQ_MASK (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
48#define NMI_MASK (__IRQ_MASK(NMI_BITS) << NMI_SHIFT)
50#define PREEMPT_OFFSET (1UL << PREEMPT_SHIFT)
51#define SOFTIRQ_OFFSET (1UL << SOFTIRQ_SHIFT)
52#define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT)
53#define NMI_OFFSET (1UL << NMI_SHIFT)
55#define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET)
57#define PREEMPT_DISABLED (PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED)
65#define INIT_PREEMPT_COUNT PREEMPT_OFFSET
76#define FORK_PREEMPT_COUNT (2*PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED)
92 unsigned long pc = preempt_count();
93 unsigned char level = 0;
108#define nmi_count() (preempt_count() & NMI_MASK)
109#define hardirq_count() (preempt_count() & HARDIRQ_MASK)
110#ifdef CONFIG_PREEMPT_RT
111# define softirq_count() (current->softirq_disable_cnt & SOFTIRQ_MASK)
112# define irq_count() ((preempt_count() & (NMI_MASK | HARDIRQ_MASK)) | softirq_count())
114# define softirq_count() (preempt_count() & SOFTIRQ_MASK)
115# define irq_count() (preempt_count() & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_MASK))
126#define in_nmi() (nmi_count())
127#define in_hardirq() (hardirq_count())
128#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET)
129#ifdef CONFIG_PREEMPT_RT
130# define in_task() (!((preempt_count() & (NMI_MASK | HARDIRQ_MASK)) | in_serving_softirq()))
132# define in_task() (!(preempt_count() & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))
140#define in_softirq() (softirq_count())
141#define in_interrupt() (irq_count())
146#if defined(CONFIG_PREEMPT_COUNT)
147# define PREEMPT_DISABLE_OFFSET PREEMPT_OFFSET
149# define PREEMPT_DISABLE_OFFSET 0
155#if !defined(CONFIG_PREEMPT_RT)
156#define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET
159#define PREEMPT_LOCK_OFFSET 0
175#define SOFTIRQ_LOCK_OFFSET (SOFTIRQ_DISABLE_OFFSET + PREEMPT_LOCK_OFFSET)
184#define in_atomic() (preempt_count() != 0)
190#define in_atomic_preempt_off() (preempt_count() != PREEMPT_DISABLE_OFFSET)
192#if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_TRACE_PREEMPT_TOGGLE)
195#define preempt_count_dec_and_test() \
196 ({ preempt_count_sub(1); should_resched(0); })
198#define preempt_count_add(val) __preempt_count_add(val)
199#define preempt_count_sub(val) __preempt_count_sub(val)
200#define preempt_count_dec_and_test() __preempt_count_dec_and_test()
203#define __preempt_count_inc() __preempt_count_add(1)
204#define __preempt_count_dec() __preempt_count_sub(1)
206#define preempt_count_inc() preempt_count_add(1)
207#define preempt_count_dec() preempt_count_sub(1)
209#ifdef CONFIG_PREEMPT_COUNT
211#define preempt_disable() \
213 preempt_count_inc(); \
217#define sched_preempt_enable_no_resched() \
220 preempt_count_dec(); \
223#define preempt_enable_no_resched() sched_preempt_enable_no_resched()
225#define preemptible() (preempt_count() == 0 && !irqs_disabled())
227#ifdef CONFIG_PREEMPTION
228#define preempt_enable() \
231 if (unlikely(preempt_count_dec_and_test())) \
232 __preempt_schedule(); \
235#define preempt_enable_notrace() \
238 if (unlikely(__preempt_count_dec_and_test())) \
239 __preempt_schedule_notrace(); \
242#define preempt_check_resched() \
244 if (should_resched(0)) \
245 __preempt_schedule(); \
249#define preempt_enable() \
252 preempt_count_dec(); \
255#define preempt_enable_notrace() \
258 __preempt_count_dec(); \
261#define preempt_check_resched() do { } while (0)
264#define preempt_disable_notrace() \
266 __preempt_count_inc(); \
270#define preempt_enable_no_resched_notrace() \
273 __preempt_count_dec(); \
284#define preempt_disable() barrier()
285#define sched_preempt_enable_no_resched() barrier()
286#define preempt_enable_no_resched() barrier()
287#define preempt_enable() barrier()
288#define preempt_check_resched() do { } while (0)
290#define preempt_disable_notrace() barrier()
291#define preempt_enable_no_resched_notrace() barrier()
292#define preempt_enable_notrace() barrier()
293#define preemptible() 0
301#undef sched_preempt_enable_no_resched
302#undef preempt_enable_no_resched
303#undef preempt_enable_no_resched_notrace
304#undef preempt_check_resched
307#define preempt_set_need_resched() \
309 set_preempt_need_resched(); \
311#define preempt_fold_need_resched() \
313 if (tif_need_resched()) \
314 set_preempt_need_resched(); \
317#ifdef CONFIG_PREEMPT_NOTIFIERS
319struct preempt_notifier;
337 void (*sched_in)(
struct preempt_notifier *notifier,
int cpu);
338 void (*sched_out)(
struct preempt_notifier *notifier,
349struct preempt_notifier {
351 struct preempt_ops *ops;
354void preempt_notifier_inc(
void);
355void preempt_notifier_dec(
void);
356void preempt_notifier_register(
struct preempt_notifier *notifier);
357void preempt_notifier_unregister(
struct preempt_notifier *notifier);
359static inline void preempt_notifier_init(
struct preempt_notifier *notifier,
360 struct preempt_ops *ops)
363 notifier->link.next =
NULL;
364 notifier->link.pprev =
NULL;
451#define preempt_disable_nested() \
453 if (IS_ENABLED(CONFIG_PREEMPT_RT)) \
456 lockdep_assert_preemption_disabled(); \
471#ifdef CONFIG_PREEMPT_DYNAMIC
473extern bool preempt_model_none(
void);
474extern bool preempt_model_voluntary(
void);
475extern bool preempt_model_full(
void);
476extern bool preempt_model_lazy(
void);
480static inline bool preempt_model_none(
void)
484static inline bool preempt_model_voluntary(
void)
488static inline bool preempt_model_full(
void)
493static inline bool preempt_model_lazy(
void)
500static inline bool preempt_model_rt(
void)
515static inline bool preempt_model_preemptible(
void)
517 return preempt_model_full() || preempt_model_lazy() || preempt_model_rt();
#define NULL
Definition actypes.h:561
#define DEFINE_LOCK_GUARD_0(_name, _lock, _unlock,...)
Definition cleanup.h:320
#define __always_inline
Definition compiler_attributes.h:55
const char * level
Definition drm_print.h:515
#define IS_ENABLED(option)
Definition kconfig.h:80
const char * preempt_model_str(void)
#define preempt_count_add(val)
Definition preempt.h:198
#define preempt_disable_notrace()
Definition preempt.h:290
#define HARDIRQ_MASK
Definition preempt.h:47
#define preempt_enable_notrace()
Definition preempt.h:469
#define NMI_MASK
Definition preempt.h:48
#define preempt_disable()
Definition preempt.h:284
#define preempt_enable()
Definition preempt.h:287
#define SOFTIRQ_OFFSET
Definition preempt.h:51
#define preempt_count_sub(val)
Definition preempt.h:199
Definition hashtable.h:30