diff options
Diffstat (limited to 'include/linux/preempt.h')
| -rw-r--r-- | include/linux/preempt.h | 26 | 
1 files changed, 24 insertions, 2 deletions
| diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 4d244e295e85..b4381f255a5c 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -77,6 +77,27 @@  /* preempt_count() and related functions, depends on PREEMPT_NEED_RESCHED */  #include <asm/preempt.h> +/** + * interrupt_context_level - return interrupt context level + * + * Returns the current interrupt context level. + *  0 - normal context + *  1 - softirq context + *  2 - hardirq context + *  3 - NMI context + */ +static __always_inline unsigned char interrupt_context_level(void) +{ +	unsigned long pc = preempt_count(); +	unsigned char level = 0; + +	level += !!(pc & (NMI_MASK)); +	level += !!(pc & (NMI_MASK | HARDIRQ_MASK)); +	level += !!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)); + +	return level; +} +  #define nmi_count()	(preempt_count() & NMI_MASK)  #define hardirq_count()	(preempt_count() & HARDIRQ_MASK)  #ifdef CONFIG_PREEMPT_RT @@ -122,9 +143,10 @@   * The preempt_count offset after spin_lock()   */  #if !defined(CONFIG_PREEMPT_RT) -#define PREEMPT_LOCK_OFFSET	PREEMPT_DISABLE_OFFSET +#define PREEMPT_LOCK_OFFSET		PREEMPT_DISABLE_OFFSET  #else -#define PREEMPT_LOCK_OFFSET	0 +/* Locks on RT do not disable preemption */ +#define PREEMPT_LOCK_OFFSET		0  #endif  /* |