|
@@ -44,10 +44,11 @@ static char irq_user_affinity[NR_IRQS];
|
|
|
|
|
|
int irq_select_affinity(unsigned int irq)
|
|
|
{
|
|
|
+ struct irq_desc *desc = irq_to_desc[irq];
|
|
|
static int last_cpu;
|
|
|
int cpu = last_cpu + 1;
|
|
|
|
|
|
- if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq])
|
|
|
+ if (!desc || !get_irq_desc_chip(desc)->set_affinity || irq_user_affinity[irq])
|
|
|
return 1;
|
|
|
|
|
|
while (!cpu_possible(cpu) ||
|
|
@@ -55,8 +56,8 @@ int irq_select_affinity(unsigned int irq)
|
|
|
cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
|
|
|
last_cpu = cpu;
|
|
|
|
|
|
- cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu));
|
|
|
- irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu));
|
|
|
+ cpumask_copy(desc->affinity, cpumask_of(cpu));
|
|
|
+ get_irq_desc_chip(desc)->set_affinity(irq, cpumask_of(cpu));
|
|
|
return 0;
|
|
|
}
|
|
|
#endif /* CONFIG_SMP */
|
|
@@ -67,6 +68,7 @@ show_interrupts(struct seq_file *p, void *v)
|
|
|
int j;
|
|
|
int irq = *(loff_t *) v;
|
|
|
struct irqaction * action;
|
|
|
+ struct irq_desc *desc;
|
|
|
unsigned long flags;
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
@@ -79,8 +81,13 @@ show_interrupts(struct seq_file *p, void *v)
|
|
|
#endif
|
|
|
|
|
|
if (irq < ACTUAL_NR_IRQS) {
|
|
|
- raw_spin_lock_irqsave(&irq_desc[irq].lock, flags);
|
|
|
- action = irq_desc[irq].action;
|
|
|
+ desc = irq_to_desc(irq);
|
|
|
+
|
|
|
+ if (!desc)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ raw_spin_lock_irqsave(&desc->lock, flags);
|
|
|
+ action = desc->action;
|
|
|
if (!action)
|
|
|
goto unlock;
|
|
|
seq_printf(p, "%3d: ", irq);
|
|
@@ -90,7 +97,7 @@ show_interrupts(struct seq_file *p, void *v)
|
|
|
for_each_online_cpu(j)
|
|
|
seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j));
|
|
|
#endif
|
|
|
- seq_printf(p, " %14s", irq_desc[irq].chip->name);
|
|
|
+ seq_printf(p, " %14s", get_irq_desc_chip(desc)->name);
|
|
|
seq_printf(p, " %c%s",
|
|
|
(action->flags & IRQF_DISABLED)?'+':' ',
|
|
|
action->name);
|
|
@@ -103,7 +110,7 @@ show_interrupts(struct seq_file *p, void *v)
|
|
|
|
|
|
seq_putc(p, '\n');
|
|
|
unlock:
|
|
|
- raw_spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
|
|
|
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
} else if (irq == ACTUAL_NR_IRQS) {
|
|
|
#ifdef CONFIG_SMP
|
|
|
seq_puts(p, "IPI: ");
|
|
@@ -142,8 +149,10 @@ handle_irq(int irq)
|
|
|
* handled by some other CPU. (or is disabled)
|
|
|
*/
|
|
|
static unsigned int illegal_count=0;
|
|
|
+ struct irq_desc *desc = irq_to_desc(irq);
|
|
|
|
|
|
- if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) {
|
|
|
+ if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS &&
|
|
|
+ illegal_count < MAX_ILLEGAL_IRQS)) {
|
|
|
irq_err_count++;
|
|
|
illegal_count++;
|
|
|
printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
|
|
@@ -159,7 +168,7 @@ handle_irq(int irq)
|
|
|
* at IPL 0.
|
|
|
*/
|
|
|
local_irq_disable();
|
|
|
- generic_handle_irq(irq);
|
|
|
+ generic_handle_irq_desc(irq, desc);
|
|
|
irq_exit();
|
|
|
}
|
|
|
|