diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq/autoprobe.c | 10 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 32 | ||||
| -rw-r--r-- | kernel/irq/handle.c | 138 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 35 | ||||
| -rw-r--r-- | kernel/irq/migration.c | 14 | ||||
| -rw-r--r-- | kernel/irq/proc.c | 36 | ||||
| -rw-r--r-- | kernel/irq/resend.c | 2 | ||||
| -rw-r--r-- | kernel/irq/spurious.c | 5 | 
8 files changed, 199 insertions, 73 deletions
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index c689e9851a8..c45ab718cf0 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c @@ -39,7 +39,7 @@ unsigned long probe_irq_on(void)  	 * flush such a longstanding irq before considering it as spurious.  	 */  	for (i = nr_irqs-1; i > 0; i--) { -		desc = irq_desc + i; +		desc = irq_to_desc(i);  		spin_lock_irq(&desc->lock);  		if (!desc->action && !(desc->status & IRQ_NOPROBE)) { @@ -69,7 +69,7 @@ unsigned long probe_irq_on(void)  	 * happened in the previous stage, it may have masked itself)  	 */  	for (i = nr_irqs-1; i > 0; i--) { -		desc = irq_desc + i; +		desc = irq_to_desc(i);  		spin_lock_irq(&desc->lock);  		if (!desc->action && !(desc->status & IRQ_NOPROBE)) { @@ -92,7 +92,7 @@ unsigned long probe_irq_on(void)  	for (i = 0; i < nr_irqs; i++) {  		unsigned int status; -		desc = irq_desc + i; +		desc = irq_to_desc(i);  		spin_lock_irq(&desc->lock);  		status = desc->status; @@ -131,7 +131,7 @@ unsigned int probe_irq_mask(unsigned long val)  	mask = 0;  	for (i = 0; i < nr_irqs; i++) { -		struct irq_desc *desc = irq_desc + i; +		struct irq_desc *desc = irq_to_desc(i);  		unsigned int status;  		spin_lock_irq(&desc->lock); @@ -174,7 +174,7 @@ int probe_irq_off(unsigned long val)  	int i, irq_found = 0, nr_irqs = 0;  	for (i = 0; i < nr_irqs; i++) { -		struct irq_desc *desc = irq_desc + i; +		struct irq_desc *desc = irq_to_desc(i);  		unsigned int status;  		spin_lock_irq(&desc->lock); diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index bba66e09870..76c225cf4b2 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -33,7 +33,7 @@ void dynamic_irq_init(unsigned int irq)  	}  	/* Ensure we don't have left over values from a previous use of this irq */ -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	desc->status = IRQ_DISABLED;  	desc->chip = &no_irq_chip; @@ -65,7 +65,7 @@ void dynamic_irq_cleanup(unsigned int irq)  		return;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	if (desc->action) {  		spin_unlock_irqrestore(&desc->lock, flags); @@ -100,7 +100,7 @@ int set_irq_chip(unsigned int irq, struct irq_chip *chip)  	if (!chip)  		chip = &no_irq_chip; -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	irq_chip_set_defaults(chip);  	desc->chip = chip; @@ -126,7 +126,7 @@ int set_irq_type(unsigned int irq, unsigned int type)  		return -ENODEV;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	if (type == IRQ_TYPE_NONE)  		return 0; @@ -155,7 +155,7 @@ int set_irq_data(unsigned int irq, void *data)  		return -EINVAL;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	desc->handler_data = data;  	spin_unlock_irqrestore(&desc->lock, flags); @@ -180,7 +180,7 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)  		       "Trying to install msi data for IRQ%d\n", irq);  		return -EINVAL;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	desc->msi_desc = entry;  	if (entry) @@ -198,9 +198,10 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)   */  int set_irq_chip_data(unsigned int irq, void *data)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc;  	unsigned long flags; +	desc = irq_to_desc(irq);  	if (irq >= nr_irqs || !desc->chip) {  		printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq);  		return -EINVAL; @@ -219,8 +220,9 @@ EXPORT_SYMBOL(set_irq_chip_data);   */  static void default_enable(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc; +	desc = irq_to_desc(irq);  	desc->chip->unmask(irq);  	desc->status &= ~IRQ_MASKED;  } @@ -237,7 +239,10 @@ static void default_disable(unsigned int irq)   */  static unsigned int default_startup(unsigned int irq)  { -	irq_desc[irq].chip->enable(irq); +	struct irq_desc *desc; + +	desc = irq_to_desc(irq); +	desc->chip->enable(irq);  	return 0;  } @@ -247,8 +252,9 @@ static unsigned int default_startup(unsigned int irq)   */  static void default_shutdown(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc; +	desc = irq_to_desc(irq);  	desc->chip->mask(irq);  	desc->status |= IRQ_MASKED;  } @@ -551,7 +557,7 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,  		return;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	if (!handle)  		handle = handle_bad_irq; @@ -616,7 +622,7 @@ void __init set_irq_noprobe(unsigned int irq)  		return;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	desc->status |= IRQ_NOPROBE; @@ -634,7 +640,7 @@ void __init set_irq_probe(unsigned int irq)  		return;  	} -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	desc->status &= ~IRQ_NOPROBE; diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 6ce3bcc2b8f..9fc33b3378e 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -18,6 +18,14 @@  #include "internals.h" +#ifdef CONFIG_TRACE_IRQFLAGS + +/* + * lockdep: we want to handle all irq_desc locks as a single lock-class: + */ +static struct lock_class_key irq_desc_lock_class; +#endif +  /**   * handle_bad_irq - handle spurious and unhandled irqs   * @irq:       the interrupt number @@ -51,7 +59,8 @@ int nr_irqs = NR_IRQS;  EXPORT_SYMBOL_GPL(nr_irqs);  #ifdef CONFIG_HAVE_DYN_ARRAY -static struct irq_desc irq_desc_init __initdata = { +static struct irq_desc irq_desc_init = { +	.irq = -1U,  	.status = IRQ_DISABLED,  	.chip = &no_irq_chip,  	.handle_irq = handle_bad_irq, @@ -62,6 +71,27 @@ static struct irq_desc irq_desc_init __initdata = {  #endif  }; + +static void init_one_irq_desc(struct irq_desc *desc) +{ +	memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); +#ifdef CONFIG_TRACE_IRQFLAGS +	lockdep_set_class(&desc->lock, &irq_desc_lock_class); +#endif +} + +#ifdef CONFIG_HAVE_SPARSE_IRQ +static int nr_irq_desc = 32; + +static int __init parse_nr_irq_desc(char *arg) +{ +	if (arg) +		nr_irq_desc = simple_strtoul(arg, NULL, 0); +	return 0; +} + +early_param("nr_irq_desc", parse_nr_irq_desc); +  static void __init init_work(void *data)  {  	struct dyn_array *da = data; @@ -71,12 +101,83 @@ static void __init init_work(void *data)  	desc = *da->name;  	for (i = 0; i < *da->nr; i++) -		memcpy(&desc[i], &irq_desc_init, sizeof(struct irq_desc)); +		init_one_irq_desc(&desc[i]); + +	for (i = 1; i < *da->nr; i++) +		desc[i-1].next = &desc[i];  } -struct irq_desc *irq_desc; +static struct irq_desc *sparse_irqs; +DEFINE_DYN_ARRAY(sparse_irqs, sizeof(struct irq_desc), nr_irq_desc, PAGE_SIZE, init_work); + +extern int after_bootmem; +extern void *__alloc_bootmem_nopanic(unsigned long size, +			     unsigned long align, +			     unsigned long goal); +struct irq_desc *irq_to_desc(unsigned int irq) +{ +	struct irq_desc *desc, *desc_pri; +	int i; +	int count = 0; + +	BUG_ON(irq == -1U); + +	desc_pri = desc = &sparse_irqs[0]; +	while (desc) { +		if (desc->irq == irq) +			return desc; + +		if (desc->irq == -1U) { +			desc->irq = irq; +			return desc; +		} +		desc_pri = desc; +		desc = desc->next; +		count++; +	} + +	/* +	 *  we run out of pre-allocate ones, allocate more +	 */ +	printk(KERN_DEBUG "try to get more irq_desc %d\n", nr_irq_desc); + +	if (after_bootmem) +		desc = kzalloc(sizeof(struct irq_desc)*nr_irq_desc, GFP_ATOMIC); +	else +		desc = __alloc_bootmem_nopanic(sizeof(struct irq_desc)*nr_irq_desc, PAGE_SIZE, 0); + +	if (!desc) +		panic("please boot with nr_irq_desc= %d\n", count * 2); + +	for (i = 0; i < nr_irq_desc; i++) +		init_one_irq_desc(&desc[i]); + +	for (i = 1; i < nr_irq_desc; i++) +		desc[i-1].next = &desc[i]; + +	desc->irq = irq; +	desc_pri->next = desc; + +	return desc; +} +#else +static void __init init_work(void *data) +{ +	struct dyn_array *da = data; +	int i; +	struct  irq_desc *desc; + +	desc = *da->name; + +	for (i = 0; i < *da->nr; i++) +		init_one_irq_desc(&desc[i]); + +} +static struct irq_desc *irq_desc;  DEFINE_DYN_ARRAY(irq_desc, sizeof(struct irq_desc), nr_irqs, PAGE_SIZE, init_work); +#endif +  #else  struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { @@ -85,12 +186,23 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {  		.chip = &no_irq_chip,  		.handle_irq = handle_bad_irq,  		.depth = 1, -		.lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock), +		.lock = __SPIN_LOCK_UNLOCKED(sparse_irqs->lock),  #ifdef CONFIG_SMP  		.affinity = CPU_MASK_ALL  #endif  	}  }; + +#endif + +#ifndef CONFIG_HAVE_SPARSE_IRQ +struct irq_desc *irq_to_desc(unsigned int irq) +{ +	if (irq < nr_irqs) +		return &irq_desc[irq]; + +	return NULL; +}  #endif  /* @@ -99,7 +211,10 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {   */  static void ack_bad(unsigned int irq)  { -	print_irq_desc(irq, irq_desc + irq); +	struct irq_desc *desc; + +	desc = irq_to_desc(irq); +	print_irq_desc(irq, desc);  	ack_bad_irq(irq);  } @@ -196,7 +311,7 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)   */  unsigned int __do_IRQ(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	struct irqaction *action;  	unsigned int status; @@ -287,19 +402,16 @@ out:  }  #endif -#ifdef CONFIG_TRACE_IRQFLAGS - -/* - * lockdep: we want to handle all irq_desc locks as a single lock-class: - */ -static struct lock_class_key irq_desc_lock_class; +#ifdef CONFIG_TRACE_IRQFLAGS  void early_init_irq_lock_class(void)  { +#ifndef CONFIG_HAVE_DYN_ARRAY  	int i;  	for (i = 0; i < nr_irqs; i++)  		lockdep_set_class(&irq_desc[i].lock, &irq_desc_lock_class); +#endif  } -  #endif + diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index d5a4333d8f1..b5943e9f95a 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -31,7 +31,7 @@ cpumask_t irq_default_affinity = CPU_MASK_ALL;   */  void synchronize_irq(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	unsigned int status;  	if (irq >= nr_irqs) @@ -64,7 +64,7 @@ EXPORT_SYMBOL(synchronize_irq);   */  int irq_can_set_affinity(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	if (CHECK_IRQ_PER_CPU(desc->status) || !desc->chip ||  	    !desc->chip->set_affinity) @@ -81,7 +81,7 @@ int irq_can_set_affinity(unsigned int irq)   */  int irq_set_affinity(unsigned int irq, cpumask_t cpumask)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	if (!desc->chip->set_affinity)  		return -EINVAL; @@ -111,14 +111,16 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask)  int irq_select_affinity(unsigned int irq)  {  	cpumask_t mask; +	struct irq_desc *desc;  	if (!irq_can_set_affinity(irq))  		return 0;  	cpus_and(mask, cpu_online_map, irq_default_affinity); -	irq_desc[irq].affinity = mask; -	irq_desc[irq].chip->set_affinity(irq, mask); +	desc = irq_to_desc(irq); +	desc->affinity = mask; +	desc->chip->set_affinity(irq, mask);  	set_balance_irq_affinity(irq, mask);  	return 0; @@ -140,7 +142,7 @@ int irq_select_affinity(unsigned int irq)   */  void disable_irq_nosync(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags;  	if (irq >= nr_irqs) @@ -169,7 +171,7 @@ EXPORT_SYMBOL(disable_irq_nosync);   */  void disable_irq(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	if (irq >= nr_irqs)  		return; @@ -211,7 +213,7 @@ static void __enable_irq(struct irq_desc *desc, unsigned int irq)   */  void enable_irq(unsigned int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags;  	if (irq >= nr_irqs) @@ -225,7 +227,7 @@ EXPORT_SYMBOL(enable_irq);  static int set_irq_wake_real(unsigned int irq, unsigned int on)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	int ret = -ENXIO;  	if (desc->chip->set_wake) @@ -248,7 +250,7 @@ static int set_irq_wake_real(unsigned int irq, unsigned int on)   */  int set_irq_wake(unsigned int irq, unsigned int on)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags;  	int ret = 0; @@ -288,12 +290,13 @@ EXPORT_SYMBOL(set_irq_wake);   */  int can_request_irq(unsigned int irq, unsigned long irqflags)  { +	struct irq_desc *desc = irq_to_desc(irq);  	struct irqaction *action; -	if (irq >= nr_irqs || irq_desc[irq].status & IRQ_NOREQUEST) +	if (irq >= nr_irqs || desc->status & IRQ_NOREQUEST)  		return 0; -	action = irq_desc[irq].action; +	action = desc->action;  	if (action)  		if (irqflags & action->flags & IRQF_SHARED)  			action = NULL; @@ -349,7 +352,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,   */  int setup_irq(unsigned int irq, struct irqaction *new)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	struct irqaction *old, **p;  	const char *old_name = NULL;  	unsigned long flags; @@ -518,7 +521,7 @@ void free_irq(unsigned int irq, void *dev_id)  	if (irq >= nr_irqs)  		return; -	desc = irq_desc + irq; +	desc = irq_to_desc(irq);  	spin_lock_irqsave(&desc->lock, flags);  	p = &desc->action;  	for (;;) { @@ -615,6 +618,7 @@ int request_irq(unsigned int irq, irq_handler_t handler,  {  	struct irqaction *action;  	int retval; +	struct irq_desc *desc;  #ifdef CONFIG_LOCKDEP  	/* @@ -632,7 +636,8 @@ int request_irq(unsigned int irq, irq_handler_t handler,  		return -EINVAL;  	if (irq >= nr_irqs)  		return -EINVAL; -	if (irq_desc[irq].status & IRQ_NOREQUEST) +	desc = irq_to_desc(irq); +	if (desc->status & IRQ_NOREQUEST)  		return -EINVAL;  	if (!handler)  		return -EINVAL; diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 77b7acc875c..90b920d3f52 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c @@ -3,18 +3,18 @@  void set_pending_irq(unsigned int irq, cpumask_t mask)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags;  	spin_lock_irqsave(&desc->lock, flags);  	desc->status |= IRQ_MOVE_PENDING; -	irq_desc[irq].pending_mask = mask; +	desc->pending_mask = mask;  	spin_unlock_irqrestore(&desc->lock, flags);  }  void move_masked_irq(int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	cpumask_t tmp;  	if (likely(!(desc->status & IRQ_MOVE_PENDING))) @@ -30,7 +30,7 @@ void move_masked_irq(int irq)  	desc->status &= ~IRQ_MOVE_PENDING; -	if (unlikely(cpus_empty(irq_desc[irq].pending_mask))) +	if (unlikely(cpus_empty(desc->pending_mask)))  		return;  	if (!desc->chip->set_affinity) @@ -38,7 +38,7 @@ void move_masked_irq(int irq)  	assert_spin_locked(&desc->lock); -	cpus_and(tmp, irq_desc[irq].pending_mask, cpu_online_map); +	cpus_and(tmp, desc->pending_mask, cpu_online_map);  	/*  	 * If there was a valid mask to work with, please @@ -55,12 +55,12 @@ void move_masked_irq(int irq)  	if (likely(!cpus_empty(tmp))) {  		desc->chip->set_affinity(irq,tmp);  	} -	cpus_clear(irq_desc[irq].pending_mask); +	cpus_clear(desc->pending_mask);  }  void move_native_irq(int irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	if (likely(!(desc->status & IRQ_MOVE_PENDING)))  		return; diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index e5225a65a4f..c2f356c808f 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -19,7 +19,7 @@ static struct proc_dir_entry *root_irq_dir;  static int irq_affinity_proc_show(struct seq_file *m, void *v)  { -	struct irq_desc *desc = irq_desc + (long)m->private; +	struct irq_desc *desc = irq_to_desc((long)m->private);  	cpumask_t *mask = &desc->affinity;  #ifdef CONFIG_GENERIC_PENDING_IRQ @@ -43,7 +43,7 @@ static ssize_t irq_affinity_proc_write(struct file *file,  	cpumask_t new_value;  	int err; -	if (!irq_desc[irq].chip->set_affinity || no_irq_affinity || +	if (!irq_to_desc(irq)->chip->set_affinity || no_irq_affinity ||  	    irq_balancing_disabled(irq))  		return -EIO; @@ -132,20 +132,20 @@ static const struct file_operations default_affinity_proc_fops = {  static int irq_spurious_read(char *page, char **start, off_t off,  				  int count, int *eof, void *data)  { -	struct irq_desc *d = &irq_desc[(long) data]; +	struct irq_desc *desc = irq_to_desc((long) data);  	return sprintf(page, "count %u\n"  			     "unhandled %u\n"  			     "last_unhandled %u ms\n", -			d->irq_count, -			d->irqs_unhandled, -			jiffies_to_msecs(d->last_unhandled)); +			desc->irq_count, +			desc->irqs_unhandled, +			jiffies_to_msecs(desc->last_unhandled));  }  #define MAX_NAMELEN 128  static int name_unique(unsigned int irq, struct irqaction *new_action)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	struct irqaction *action;  	unsigned long flags;  	int ret = 1; @@ -165,8 +165,9 @@ static int name_unique(unsigned int irq, struct irqaction *new_action)  void register_handler_proc(unsigned int irq, struct irqaction *action)  {  	char name [MAX_NAMELEN]; +	struct irq_desc *desc = irq_to_desc(irq); -	if (!irq_desc[irq].dir || action->dir || !action->name || +	if (!desc->dir || action->dir || !action->name ||  					!name_unique(irq, action))  		return; @@ -174,7 +175,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action)  	snprintf(name, MAX_NAMELEN, "%s", action->name);  	/* create /proc/irq/1234/handler/ */ -	action->dir = proc_mkdir(name, irq_desc[irq].dir); +	action->dir = proc_mkdir(name, desc->dir);  }  #undef MAX_NAMELEN @@ -185,25 +186,24 @@ void register_irq_proc(unsigned int irq)  {  	char name [MAX_NAMELEN];  	struct proc_dir_entry *entry; +	struct irq_desc *desc = irq_to_desc(irq); -	if (!root_irq_dir || -		(irq_desc[irq].chip == &no_irq_chip) || -			irq_desc[irq].dir) +	if (!root_irq_dir || (desc->chip == &no_irq_chip) || desc->dir)  		return;  	memset(name, 0, MAX_NAMELEN);  	sprintf(name, "%d", irq);  	/* create /proc/irq/1234 */ -	irq_desc[irq].dir = proc_mkdir(name, root_irq_dir); +	desc->dir = proc_mkdir(name, root_irq_dir);  #ifdef CONFIG_SMP  	/* create /proc/irq/<irq>/smp_affinity */ -	proc_create_data("smp_affinity", 0600, irq_desc[irq].dir, +	proc_create_data("smp_affinity", 0600, desc->dir,  			 &irq_affinity_proc_fops, (void *)(long)irq);  #endif -	entry = create_proc_entry("spurious", 0444, irq_desc[irq].dir); +	entry = create_proc_entry("spurious", 0444, desc->dir);  	if (entry) {  		entry->data = (void *)(long)irq;  		entry->read_proc = irq_spurious_read; @@ -214,8 +214,10 @@ void register_irq_proc(unsigned int irq)  void unregister_handler_proc(unsigned int irq, struct irqaction *action)  { -	if (action->dir) -		remove_proc_entry(action->dir->name, irq_desc[irq].dir); +	if (action->dir) { +		struct irq_desc *desc = irq_to_desc(irq); +		remove_proc_entry(action->dir->name, desc->dir); +	}  }  void register_default_affinity_proc(void) diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index cba8aa5bc7f..89c7117acf2 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c @@ -36,7 +36,7 @@ static void resend_irqs(unsigned long arg)  	while (!bitmap_empty(irqs_resend, nr_irqs)) {  		irq = find_first_bit(irqs_resend, nr_irqs);  		clear_bit(irq, irqs_resend); -		desc = irq_desc + irq; +		desc = irq_to_desc(irq);  		local_irq_disable();  		desc->handle_irq(irq, desc);  		local_irq_enable(); diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index e26ca1e90c0..b5d906002e1 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c @@ -92,11 +92,12 @@ static int misrouted_irq(int irq)  	int ok = 0;  	for (i = 1; i < nr_irqs; i++) { -		struct irq_desc *desc = irq_desc + i; +		struct irq_desc *desc;  		if (i == irq)	/* Already tried */  			continue; +		desc = irq_to_desc(i);  		if (try_one_irq(i, desc))  			ok = 1;  	} @@ -108,7 +109,7 @@ static void poll_spurious_irqs(unsigned long dummy)  {  	int i;  	for (i = 1; i < nr_irqs; i++) { -		struct irq_desc *desc = irq_desc + i; +		struct irq_desc *desc = irq_to_desc(i);  		unsigned int status;  		/* Racy but it doesn't matter */  |