Blame view

include/linux/irqflags.h 4.65 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
85
  /*
   * The local_irq_*() APIs are equal to the raw_local_irq*()
   * if !TRACE_IRQFLAGS.
   */
  #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
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
  #define local_save_flags(flags)				\
3f307891c   Steven Rostedt   locking: add type...
108
  	do {						\
df9ee2927   David Howells   Fix IRQ flag hand...
109
  		raw_local_save_flags(flags);		\
3f307891c   Steven Rostedt   locking: add type...
110
  	} while (0)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
111

df9ee2927   David Howells   Fix IRQ flag hand...
112
113
114
115
  #define irqs_disabled_flags(flags)			\
  	({						\
  		raw_irqs_disabled_flags(flags);		\
  	})
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
116

df9ee2927   David Howells   Fix IRQ flag hand...
117
118
119
120
121
122
123
124
125
126
127
  #define irqs_disabled()					\
  	({						\
  		unsigned long _flags;			\
  		raw_local_save_flags(_flags);		\
  		raw_irqs_disabled_flags(_flags);	\
  	})
  
  #define safe_halt()				\
  	do {					\
  		trace_hardirqs_on();		\
  		raw_safe_halt();		\
3f307891c   Steven Rostedt   locking: add type...
128
  	} while (0)
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
129

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

df9ee2927   David Howells   Fix IRQ flag hand...
131
132
133
134
135
136
137
138
139
140
141
142
143
  #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
  
  #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)
  #define local_save_flags(flags)	do { raw_local_save_flags(flags); } while (0)
  #define irqs_disabled()		(raw_irqs_disabled())
  #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
  #define safe_halt()		do { raw_safe_halt(); } while (0)
40b1f4e51   Michael Neuling   irq: trivial: Fix...
144
  #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
de30a2b35   Ingo Molnar   [PATCH] lockdep: ...
145
146
  
  #endif