Skip to content

Commit 8f8573a

Browse files
author
Ingo Molnar
committed
Merge branches 'irq/genirq', 'irq/sparseirq' and 'irq/urgent' into irq/core
4 parents 37bed90 + 0e43785 + 005bf0e + 548c893 commit 8f8573a

File tree

33 files changed

+97
-70
lines changed

33 files changed

+97
-70
lines changed

arch/alpha/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ show_interrupts(struct seq_file *p, void *v)
9090
seq_printf(p, "%10u ", kstat_irqs(irq));
9191
#else
9292
for_each_online_cpu(j)
93-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]);
93+
seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j));
9494
#endif
9595
seq_printf(p, " %14s", irq_desc[irq].chip->typename);
9696
seq_printf(p, " %c%s",

arch/alpha/kernel/irq_alpha.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ do_entInt(unsigned long type, unsigned long vector,
6464
smp_percpu_timer_interrupt(regs);
6565
cpu = smp_processor_id();
6666
if (cpu != boot_cpuid) {
67-
kstat_cpu(cpu).irqs[RTC_IRQ]++;
67+
kstat_incr_irqs_this_cpu(RTC_IRQ, irq_to_desc(RTC_IRQ));
6868
} else {
6969
handle_irq(RTC_IRQ);
7070
}

arch/arm/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ int show_interrupts(struct seq_file *p, void *v)
7676

7777
seq_printf(p, "%3d: ", i);
7878
for_each_present_cpu(cpu)
79-
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
79+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu));
8080
seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-");
8181
seq_printf(p, " %s", action->name);
8282
for (action = action->next; action; action = action->next)

arch/arm/mach-ns9xxx/irq.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ static struct irq_chip ns9xxx_chip = {
6363
#else
6464
static void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
6565
{
66-
unsigned int cpu = smp_processor_id();
6766
struct irqaction *action;
6867
irqreturn_t action_ret;
6968

@@ -72,7 +71,7 @@ static void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
7271
BUG_ON(desc->status & IRQ_INPROGRESS);
7372

7473
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
75-
kstat_cpu(cpu).irqs[irq]++;
74+
kstat_incr_irqs_this_cpu(irq, desc);
7675

7776
action = desc->action;
7877
if (unlikely(!action || (desc->status & IRQ_DISABLED)))

arch/avr32/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ int show_interrupts(struct seq_file *p, void *v)
5858

5959
seq_printf(p, "%3d: ", i);
6060
for_each_online_cpu(cpu)
61-
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
61+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu));
6262
seq_printf(p, " %8s", irq_desc[i].chip->name ? : "-");
6363
seq_printf(p, " %s", action->name);
6464
for (action = action->next; action; action = action->next)

arch/blackfin/kernel/irqchip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ int show_interrupts(struct seq_file *p, void *v)
8383
goto skip;
8484
seq_printf(p, "%3d: ", i);
8585
for_each_online_cpu(j)
86-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
86+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
8787
seq_printf(p, " %8s", irq_desc[i].chip->name);
8888
seq_printf(p, " %s", action->name);
8989
for (action = action->next; action; action = action->next)

arch/cris/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int show_interrupts(struct seq_file *p, void *v)
6666
seq_printf(p, "%10u ", kstat_irqs(i));
6767
#else
6868
for_each_online_cpu(j)
69-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
69+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
7070
#endif
7171
seq_printf(p, " %14s", irq_desc[i].chip->typename);
7272
seq_printf(p, " %s", action->name);

arch/frv/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ int show_interrupts(struct seq_file *p, void *v)
7474
if (action) {
7575
seq_printf(p, "%3d: ", i);
7676
for_each_present_cpu(cpu)
77-
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
77+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu));
7878
seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-");
7979
seq_printf(p, " %s", action->name);
8080
for (action = action->next;

arch/h8300/kernel/irq.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ asmlinkage void do_IRQ(int irq)
183183
#if defined(CONFIG_PROC_FS)
184184
int show_interrupts(struct seq_file *p, void *v)
185185
{
186-
int i = *(loff_t *) v, j;
186+
int i = *(loff_t *) v;
187187
struct irqaction * action;
188188
unsigned long flags;
189189

@@ -196,7 +196,7 @@ int show_interrupts(struct seq_file *p, void *v)
196196
if (!action)
197197
goto unlock;
198198
seq_printf(p, "%3d: ",i);
199-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
199+
seq_printf(p, "%10u ", kstat_irqs(i));
200200
seq_printf(p, " %14s", irq_desc[i].chip->name);
201201
seq_printf(p, "-%-8s", irq_desc[i].name);
202202
seq_printf(p, " %s", action->name);

arch/ia64/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ int show_interrupts(struct seq_file *p, void *v)
8080
seq_printf(p, "%10u ", kstat_irqs(i));
8181
#else
8282
for_each_online_cpu(j) {
83-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
83+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
8484
}
8585
#endif
8686
seq_printf(p, " %14s", irq_desc[i].chip->name);

arch/m32r/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ int show_interrupts(struct seq_file *p, void *v)
4949
seq_printf(p, "%10u ", kstat_irqs(i));
5050
#else
5151
for_each_online_cpu(j)
52-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
52+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
5353
#endif
5454
seq_printf(p, " %14s", irq_desc[i].chip->typename);
5555
seq_printf(p, " %s", action->name);

arch/mips/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ int show_interrupts(struct seq_file *p, void *v)
108108
seq_printf(p, "%10u ", kstat_irqs(i));
109109
#else
110110
for_each_online_cpu(j)
111-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
111+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
112112
#endif
113113
seq_printf(p, " %14s", irq_desc[i].chip->name);
114114
seq_printf(p, "-%-8s", irq_desc[i].name);

arch/mn10300/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ int show_interrupts(struct seq_file *p, void *v)
221221
if (action) {
222222
seq_printf(p, "%3d: ", i);
223223
for_each_present_cpu(cpu)
224-
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
224+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu));
225225
seq_printf(p, " %14s.%u", irq_desc[i].chip->name,
226226
(GxICR(i) & GxICR_LEVEL) >>
227227
GxICR_LEVEL_SHIFT);

arch/parisc/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ int show_interrupts(struct seq_file *p, void *v)
183183
seq_printf(p, "%3d: ", i);
184184
#ifdef CONFIG_SMP
185185
for_each_online_cpu(j)
186-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
186+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
187187
#else
188188
seq_printf(p, "%10u ", kstat_irqs(i));
189189
#endif

arch/powerpc/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ int show_interrupts(struct seq_file *p, void *v)
190190
seq_printf(p, "%3d: ", i);
191191
#ifdef CONFIG_SMP
192192
for_each_online_cpu(j)
193-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
193+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
194194
#else
195195
seq_printf(p, "%10u ", kstat_irqs(i));
196196
#endif /* CONFIG_SMP */

arch/powerpc/platforms/cell/interrupt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ static void handle_iic_irq(unsigned int irq, struct irq_desc *desc)
254254
goto out_eoi;
255255
}
256256

257-
kstat_cpu(cpu).irqs[irq]++;
257+
kstat_incr_irqs_this_cpu(irq, desc);
258258

259259
/* Mark the IRQ currently in progress.*/
260260
desc->status |= IRQ_INPROGRESS;

arch/sh/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ int show_interrupts(struct seq_file *p, void *v)
5151
goto unlock;
5252
seq_printf(p, "%3d: ",i);
5353
for_each_online_cpu(j)
54-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
54+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
5555
seq_printf(p, " %14s", irq_desc[i].chip->name);
5656
seq_printf(p, "-%-8s", irq_desc[i].name);
5757
seq_printf(p, " %s", action->name);

arch/sparc/kernel/irq_64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ int show_interrupts(struct seq_file *p, void *v)
185185
seq_printf(p, "%10u ", kstat_irqs(i));
186186
#else
187187
for_each_online_cpu(j)
188-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
188+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
189189
#endif
190190
seq_printf(p, " %9s", irq_desc[i].chip->typename);
191191
seq_printf(p, " %s", action->name);

arch/sparc/kernel/time_64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@
3636
#include <linux/clocksource.h>
3737
#include <linux/of_device.h>
3838
#include <linux/platform_device.h>
39+
#include <linux/irq.h>
3940

4041
#include <asm/oplib.h>
4142
#include <asm/timer.h>
42-
#include <asm/irq.h>
4343
#include <asm/io.h>
4444
#include <asm/prom.h>
4545
#include <asm/starfire.h>

arch/um/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ int show_interrupts(struct seq_file *p, void *v)
4242
seq_printf(p, "%10u ", kstat_irqs(i));
4343
#else
4444
for_each_online_cpu(j)
45-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
45+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
4646
#endif
4747
seq_printf(p, " %14s", irq_desc[i].chip->typename);
4848
seq_printf(p, " %s", action->name);

arch/xtensa/kernel/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ int show_interrupts(struct seq_file *p, void *v)
9999
seq_printf(p, "%10u ", kstat_irqs(i));
100100
#else
101101
for_each_online_cpu(j)
102-
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
102+
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
103103
#endif
104104
seq_printf(p, " %14s", irq_desc[i].chip->typename);
105105
seq_printf(p, " %s", action->name);

drivers/char/random.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@
241241
#include <linux/percpu.h>
242242
#include <linux/cryptohash.h>
243243

244+
#ifdef CONFIG_GENERIC_HARDIRQS
245+
# include <linux/irq.h>
246+
#endif
247+
244248
#include <asm/processor.h>
245249
#include <asm/uaccess.h>
246250
#include <asm/irq.h>
@@ -558,7 +562,7 @@ struct timer_rand_state {
558562
unsigned dont_count_entropy:1;
559563
};
560564

561-
#ifndef CONFIG_SPARSE_IRQ
565+
#ifndef CONFIG_GENERIC_HARDIRQS
562566

563567
static struct timer_rand_state *irq_timer_state[NR_IRQS];
564568

drivers/pci/intr_remapping.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ struct irq_2_iommu {
2020
u8 irte_mask;
2121
};
2222

23-
#ifdef CONFIG_SPARSE_IRQ
23+
#ifdef CONFIG_GENERIC_HARDIRQS
2424
static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu)
2525
{
2626
struct irq_2_iommu *iommu;

include/linux/interrupt.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,12 @@ static inline void init_irq_proc(void)
462462
}
463463
#endif
464464

465+
#if defined(CONFIG_GENERIC_HARDIRQS) && defined(CONFIG_DEBUG_SHIRQ)
466+
extern void debug_poll_all_shared_irqs(void);
467+
#else
468+
static inline void debug_poll_all_shared_irqs(void) { }
469+
#endif
470+
465471
int show_interrupts(struct seq_file *p, void *v);
466472

467473
struct irq_desc;

include/linux/irq.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,10 @@ struct irq_2_iommu;
160160
*/
161161
struct irq_desc {
162162
unsigned int irq;
163-
#ifdef CONFIG_SPARSE_IRQ
164163
struct timer_rand_state *timer_rand_state;
165164
unsigned int *kstat_irqs;
166-
# ifdef CONFIG_INTR_REMAP
165+
#ifdef CONFIG_INTR_REMAP
167166
struct irq_2_iommu *irq_2_iommu;
168-
# endif
169167
#endif
170168
irq_flow_handler_t handle_irq;
171169
struct irq_chip *chip;
@@ -202,12 +200,6 @@ extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc
202200
extern struct irq_desc irq_desc[NR_IRQS];
203201
#else /* CONFIG_SPARSE_IRQ */
204202
extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
205-
206-
#define kstat_irqs_this_cpu(DESC) \
207-
((DESC)->kstat_irqs[smp_processor_id()])
208-
#define kstat_incr_irqs_this_cpu(irqno, DESC) \
209-
((DESC)->kstat_irqs[smp_processor_id()]++)
210-
211203
#endif /* CONFIG_SPARSE_IRQ */
212204

213205
extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);

include/linux/irqnr.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@ extern struct irq_desc *irq_to_desc(unsigned int irq);
2828
# define for_each_irq_desc(irq, desc) \
2929
for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \
3030
irq++, desc = irq_to_desc(irq)) \
31-
if (desc)
31+
if (!desc) \
32+
; \
33+
else
3234

3335

3436
# define for_each_irq_desc_reverse(irq, desc) \
3537
for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; \
3638
irq--, desc = irq_to_desc(irq)) \
37-
if (desc)
39+
if (!desc) \
40+
; \
41+
else
3842

3943
#endif /* CONFIG_GENERIC_HARDIRQS */
4044

include/linux/kernel_stat.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct cpu_usage_stat {
2828

2929
struct kernel_stat {
3030
struct cpu_usage_stat cpustat;
31-
#ifndef CONFIG_SPARSE_IRQ
31+
#ifndef CONFIG_GENERIC_HARDIRQS
3232
unsigned int irqs[NR_IRQS];
3333
#endif
3434
};
@@ -41,7 +41,7 @@ DECLARE_PER_CPU(struct kernel_stat, kstat);
4141

4242
extern unsigned long long nr_context_switches(void);
4343

44-
#ifndef CONFIG_SPARSE_IRQ
44+
#ifndef CONFIG_GENERIC_HARDIRQS
4545
#define kstat_irqs_this_cpu(irq) \
4646
(kstat_this_cpu.irqs[irq])
4747

@@ -52,16 +52,19 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq,
5252
{
5353
kstat_this_cpu.irqs[irq]++;
5454
}
55-
#endif
56-
5755

58-
#ifndef CONFIG_SPARSE_IRQ
5956
static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
6057
{
6158
return kstat_cpu(cpu).irqs[irq];
6259
}
6360
#else
61+
#include <linux/irq.h>
6462
extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
63+
#define kstat_irqs_this_cpu(DESC) \
64+
((DESC)->kstat_irqs[smp_processor_id()])
65+
#define kstat_incr_irqs_this_cpu(irqno, DESC) \
66+
((DESC)->kstat_irqs[smp_processor_id()]++)
67+
6568
#endif
6669

6770
/*

kernel/irq/chip.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ void dynamic_irq_cleanup(unsigned int irq)
7878
desc->handle_irq = handle_bad_irq;
7979
desc->chip = &no_irq_chip;
8080
desc->name = NULL;
81+
clear_kstat_irqs(desc);
8182
spin_unlock_irqrestore(&desc->lock, flags);
8283
}
8384

@@ -290,7 +291,8 @@ static inline void mask_ack_irq(struct irq_desc *desc, int irq)
290291
desc->chip->mask_ack(irq);
291292
else {
292293
desc->chip->mask(irq);
293-
desc->chip->ack(irq);
294+
if (desc->chip->ack)
295+
desc->chip->ack(irq);
294296
}
295297
}
296298

@@ -476,7 +478,8 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
476478
kstat_incr_irqs_this_cpu(irq, desc);
477479

478480
/* Start handling the irq */
479-
desc->chip->ack(irq);
481+
if (desc->chip->ack)
482+
desc->chip->ack(irq);
480483
desc = irq_remap_to_desc(irq, desc);
481484

482485
/* Mark the IRQ currently in progress.*/

0 commit comments

Comments
 (0)