diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-06-18 03:29:37 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-20 09:45:29 -0400 |
commit | 0f476b6d91a1395bda6464e653ce66ea9bea7167 (patch) | |
tree | 28a7f73ebc553dec0ee136395c99f641b0cbf6cc /kernel | |
parent | 4620b49f76096fa5183eecad7d689faa898a4c82 (diff) |
softirq: remove irqs_disabled warning from local_bh_enable
There's no need to use local_irq_save() over local_irq_disable() in the
local_bh_enable code since it is a bug to call it with irqs disabled and
do_softirq will enable irqs if there is any pending work.
Consolidate the code from local_bh_enable and ..._ip to avoid having a
disconnect between them in the warnings they trigger that is currently
there.
Also always trigger the warning on in_irq(), not just in the
trace-irqflags case.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Michael Buesch <mb@bu3sch.de>
Cc: David Ellingsworth <david@identd.dyndns.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/softirq.c | 48 |
1 files changed, 11 insertions, 37 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 86775340ef1d..2cf2502b7c73 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -131,23 +131,17 @@ void _local_bh_enable(void) | |||
131 | 131 | ||
132 | EXPORT_SYMBOL(_local_bh_enable); | 132 | EXPORT_SYMBOL(_local_bh_enable); |
133 | 133 | ||
134 | void local_bh_enable(void) | 134 | static inline void _local_bh_enable_ip(unsigned long ip) |
135 | { | 135 | { |
136 | WARN_ON_ONCE(in_irq() || irqs_disabled()); | ||
136 | #ifdef CONFIG_TRACE_IRQFLAGS | 137 | #ifdef CONFIG_TRACE_IRQFLAGS |
137 | unsigned long flags; | 138 | local_irq_disable(); |
138 | |||
139 | WARN_ON_ONCE(in_irq()); | ||
140 | #endif | ||
141 | WARN_ON_ONCE(irqs_disabled()); | ||
142 | |||
143 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
144 | local_irq_save(flags); | ||
145 | #endif | 139 | #endif |
146 | /* | 140 | /* |
147 | * Are softirqs going to be turned on now: | 141 | * Are softirqs going to be turned on now: |
148 | */ | 142 | */ |
149 | if (softirq_count() == SOFTIRQ_OFFSET) | 143 | if (softirq_count() == SOFTIRQ_OFFSET) |
150 | trace_softirqs_on((unsigned long)__builtin_return_address(0)); | 144 | trace_softirqs_on(ip); |
151 | /* | 145 | /* |
152 | * Keep preemption disabled until we are done with | 146 | * Keep preemption disabled until we are done with |
153 | * softirq processing: | 147 | * softirq processing: |
@@ -159,40 +153,20 @@ void local_bh_enable(void) | |||
159 | 153 | ||
160 | dec_preempt_count(); | 154 | dec_preempt_count(); |
161 | #ifdef CONFIG_TRACE_IRQFLAGS | 155 | #ifdef CONFIG_TRACE_IRQFLAGS |
162 | local_irq_restore(flags); | 156 | local_irq_enable(); |
163 | #endif | 157 | #endif |
164 | preempt_check_resched(); | 158 | preempt_check_resched(); |
165 | } | 159 | } |
160 | |||
161 | void local_bh_enable(void) | ||
162 | { | ||
163 | _local_bh_enable_ip((unsigned long)__builtin_return_address(0)); | ||
164 | } | ||
166 | EXPORT_SYMBOL(local_bh_enable); | 165 | EXPORT_SYMBOL(local_bh_enable); |
167 | 166 | ||
168 | void local_bh_enable_ip(unsigned long ip) | 167 | void local_bh_enable_ip(unsigned long ip) |
169 | { | 168 | { |
170 | #ifdef CONFIG_TRACE_IRQFLAGS | 169 | _local_bh_enable_ip(ip); |
171 | unsigned long flags; | ||
172 | |||
173 | WARN_ON_ONCE(in_irq()); | ||
174 | |||
175 | local_irq_save(flags); | ||
176 | #endif | ||
177 | /* | ||
178 | * Are softirqs going to be turned on now: | ||
179 | */ | ||
180 | if (softirq_count() == SOFTIRQ_OFFSET) | ||
181 | trace_softirqs_on(ip); | ||
182 | /* | ||
183 | * Keep preemption disabled until we are done with | ||
184 | * softirq processing: | ||
185 | */ | ||
186 | sub_preempt_count(SOFTIRQ_OFFSET - 1); | ||
187 | |||
188 | if (unlikely(!in_interrupt() && local_softirq_pending())) | ||
189 | do_softirq(); | ||
190 | |||
191 | dec_preempt_count(); | ||
192 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
193 | local_irq_restore(flags); | ||
194 | #endif | ||
195 | preempt_check_resched(); | ||
196 | } | 170 | } |
197 | EXPORT_SYMBOL(local_bh_enable_ip); | 171 | EXPORT_SYMBOL(local_bh_enable_ip); |
198 | 172 | ||