diff options
Diffstat (limited to 'kernel/softirq.c')
| -rw-r--r-- | kernel/softirq.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index c506f266a6b9..be7a8292f992 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
| @@ -46,7 +46,7 @@ irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned; | |||
| 46 | EXPORT_SYMBOL(irq_stat); | 46 | EXPORT_SYMBOL(irq_stat); |
| 47 | #endif | 47 | #endif |
| 48 | 48 | ||
| 49 | static struct softirq_action softirq_vec[32] __cacheline_aligned_in_smp; | 49 | static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; |
| 50 | 50 | ||
| 51 | static DEFINE_PER_CPU(struct task_struct *, ksoftirqd); | 51 | static DEFINE_PER_CPU(struct task_struct *, ksoftirqd); |
| 52 | 52 | ||
| @@ -205,7 +205,18 @@ restart: | |||
| 205 | 205 | ||
| 206 | do { | 206 | do { |
| 207 | if (pending & 1) { | 207 | if (pending & 1) { |
| 208 | int prev_count = preempt_count(); | ||
| 209 | |||
| 208 | h->action(h); | 210 | h->action(h); |
| 211 | |||
| 212 | if (unlikely(prev_count != preempt_count())) { | ||
| 213 | printk(KERN_ERR "huh, entered softirq %d %p" | ||
| 214 | "with preempt_count %08x," | ||
| 215 | " exited with %08x?\n", h - softirq_vec, | ||
| 216 | h->action, prev_count, preempt_count()); | ||
| 217 | preempt_count() = prev_count; | ||
| 218 | } | ||
| 219 | |||
| 209 | rcu_bh_qsctr_inc(cpu); | 220 | rcu_bh_qsctr_inc(cpu); |
| 210 | } | 221 | } |
| 211 | h++; | 222 | h++; |
