Blame view

include/linux/irqflags.h 4.72 KB
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
1
2
3
4
5
6
7
8
9
10
11
12
  /*
   * include/linux/irqflags.h
   *
   * IRQ flags tracing: follow the state of the hardirq and softirq flags and
   * provide callbacks for transitions between ON and OFF states.
   *
   * This file gets included from lowlevel asm headers too, to provide
   * wrapped versions of the local_irq_*() APIs, based on the
   * raw_local_irq_*() macros from the lowlevel headers.
   */
  #ifndef _LINUX_TRACE_IRQFLAGS_H
  #define _LINUX_TRACE_IRQFLAGS_H
3f307891c   Steven Rostedt   locking: add type...
13
  #include <linux/typecheck.h>
df9ee2927   David Howells   Fix IRQ flag hand...
14
  #include <asm/irqflags.h>
3f307891c   Steven Rostedt   locking: add type...
15

de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
16
  #ifdef CONFIG_TRACE_IRQFLAGS
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
17
18
    extern void trace_softirqs_on(unsigned long ip);
    extern void trace_softirqs_off(unsigned long ip);
81d68a96a   Steven Rostedt   ftrace: trace irq...
19
20
    extern void trace_hardirqs_on(void);
    extern void trace_hardirqs_off(void);
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
21
22
23
24
25
26
  # define trace_hardirq_context(p)	((p)->hardirq_context)
  # define trace_softirq_context(p)	((p)->softirq_context)
  # define trace_hardirqs_enabled(p)	((p)->hardirqs_enabled)
  # define trace_softirqs_enabled(p)	((p)->softirqs_enabled)
  # define trace_hardirq_enter()	do { current->hardirq_context++; } while (0)
  # define trace_hardirq_exit()	do { current->hardirq_context--; } while (0)
d820ac4c2   Ingo Molnar   locking: rename t...
27
28
  # define lockdep_softirq_enter()	do { current->softirq_context++; } while (0)
  # define lockdep_softirq_exit()	do { current->softirq_context--; } while (0)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
29
30
31
32
33
34
35
36
37
38
39
40
  # define INIT_TRACE_IRQFLAGS	.softirqs_enabled = 1,
  #else
  # define trace_hardirqs_on()		do { } while (0)
  # define trace_hardirqs_off()		do { } while (0)
  # define trace_softirqs_on(ip)		do { } while (0)
  # define trace_softirqs_off(ip)		do { } while (0)
  # define trace_hardirq_context(p)	0
  # define trace_softirq_context(p)	0
  # define trace_hardirqs_enabled(p)	0
  # define trace_softirqs_enabled(p)	0
  # define trace_hardirq_enter()		do { } while (0)
  # define trace_hardirq_exit()		do { } while (0)
d820ac4c2   Ingo Molnar   locking: rename t...
41
42
  # define lockdep_softirq_enter()	do { } while (0)
  # define lockdep_softirq_exit()		do { } while (0)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
43
44
  # define INIT_TRACE_IRQFLAGS
  #endif
6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
45
46
  #if defined(CONFIG_IRQSOFF_TRACER) || \
  	defined(CONFIG_PREEMPT_TRACER)
81d68a96a   Steven Rostedt   ftrace: trace irq...
47
48
49
50
51
52
   extern void stop_critical_timings(void);
   extern void start_critical_timings(void);
  #else
  # define stop_critical_timings() do { } while (0)
  # define start_critical_timings() do { } while (0)
  #endif
df9ee2927   David Howells   Fix IRQ flag hand...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  /*
   * Wrap the arch provided IRQ routines to provide appropriate checks.
   */
  #define raw_local_irq_disable()		arch_local_irq_disable()
  #define raw_local_irq_enable()		arch_local_irq_enable()
  #define raw_local_irq_save(flags)			\
  	do {						\
  		typecheck(unsigned long, flags);	\
  		flags = arch_local_irq_save();		\
  	} while (0)
  #define raw_local_irq_restore(flags)			\
  	do {						\
  		typecheck(unsigned long, flags);	\
  		arch_local_irq_restore(flags);		\
  	} while (0)
  #define raw_local_save_flags(flags)			\
  	do {						\
  		typecheck(unsigned long, flags);	\
  		flags = arch_local_save_flags();	\
  	} while (0)
  #define raw_irqs_disabled_flags(flags)			\
  	({						\
  		typecheck(unsigned long, flags);	\
  		arch_irqs_disabled_flags(flags);	\
  	})
  #define raw_irqs_disabled()		(arch_irqs_disabled())
  #define raw_safe_halt()			arch_safe_halt()
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
80

df9ee2927   David Howells   Fix IRQ flag hand...
81
82
83
84
  /*
   * The local_irq_*() APIs are equal to the raw_local_irq*()
   * if !TRACE_IRQFLAGS.
   */
db2dcb4f9   Jan Beulich   irqflags: Fix (at...
85
  #ifdef CONFIG_TRACE_IRQFLAGS
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
86
87
88
89
  #define local_irq_enable() \
  	do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
  #define local_irq_disable() \
  	do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
3f307891c   Steven Rostedt   locking: add type...
90
91
  #define local_irq_save(flags)				\
  	do {						\
3f307891c   Steven Rostedt   locking: add type...
92
93
94
  		raw_local_irq_save(flags);		\
  		trace_hardirqs_off();			\
  	} while (0)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
95

3f307891c   Steven Rostedt   locking: add type...
96
97
98
  
  #define local_irq_restore(flags)			\
  	do {						\
3f307891c   Steven Rostedt   locking: add type...
99
100
101
102
103
104
105
  		if (raw_irqs_disabled_flags(flags)) {	\
  			raw_local_irq_restore(flags);	\
  			trace_hardirqs_off();		\
  		} else {				\
  			trace_hardirqs_on();		\
  			raw_local_irq_restore(flags);	\
  		}					\
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
106
  	} while (0)
df9ee2927   David Howells   Fix IRQ flag hand...
107
108
109
110
111
  
  #define safe_halt()				\
  	do {					\
  		trace_hardirqs_on();		\
  		raw_safe_halt();		\
3f307891c   Steven Rostedt   locking: add type...
112
  	} while (0)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
113

de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
114

db2dcb4f9   Jan Beulich   irqflags: Fix (at...
115
  #else /* !CONFIG_TRACE_IRQFLAGS */
df9ee2927   David Howells   Fix IRQ flag hand...
116
117
118
119
120
121
122
123
  
  #define local_irq_enable()	do { raw_local_irq_enable(); } while (0)
  #define local_irq_disable()	do { raw_local_irq_disable(); } while (0)
  #define local_irq_save(flags)					\
  	do {							\
  		raw_local_irq_save(flags);			\
  	} while (0)
  #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
df9ee2927   David Howells   Fix IRQ flag hand...
124
  #define safe_halt()		do { raw_safe_halt(); } while (0)
db2dcb4f9   Jan Beulich   irqflags: Fix (at...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  #endif /* CONFIG_TRACE_IRQFLAGS */
  
  #define local_save_flags(flags)	raw_local_save_flags(flags)
  
  /*
   * Some architectures don't define arch_irqs_disabled(), so even if either
   * definition would be fine we need to use different ones for the time being
   * to avoid build issues.
   */
  #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
  #define irqs_disabled()					\
  	({						\
  		unsigned long _flags;			\
  		raw_local_save_flags(_flags);		\
  		raw_irqs_disabled_flags(_flags);	\
  	})
  #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
  #define irqs_disabled()	raw_irqs_disabled()
40b1f4e51   Michael Neuling   irq: trivial: Fix...
143
  #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
144

db2dcb4f9   Jan Beulich   irqflags: Fix (at...
145
  #define irqs_disabled_flags(flags) raw_irqs_disabled_flags(flags)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
146
  #endif