genirq: Query arch for number of early descriptors
sparse irq sets up NR_IRQS_LEGACY irq descriptors and archs then go ahead and allocate more. Use the unused return value of arch_probe_nr_irqs() to let the architecture return the number of early allocations. Fix up all users. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
					parent
					
						
							
								aa99ec0f3f
							
						
					
				
			
			
				commit
				
					
						b683de2b3c
					
				
			
		
					 6 changed files with 16 additions and 12 deletions
				
			
		|  | @ -157,10 +157,8 @@ void __init init_IRQ(void) | ||||||
| 	struct irq_desc *desc; | 	struct irq_desc *desc; | ||||||
| 	int irq; | 	int irq; | ||||||
| 
 | 
 | ||||||
| 	for (irq = 0; irq < nr_irqs; irq++) { | 	for (irq = 0; irq < nr_irqs; irq++) | ||||||
| 		desc = irq_to_desc_alloc_node(irq, 0); |  | ||||||
| 		desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE; | 		desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE; | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	init_arch_irq(); | 	init_arch_irq(); | ||||||
| } | } | ||||||
|  | @ -169,7 +167,7 @@ void __init init_IRQ(void) | ||||||
| int __init arch_probe_nr_irqs(void) | int __init arch_probe_nr_irqs(void) | ||||||
| { | { | ||||||
| 	nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS; | 	nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS; | ||||||
| 	return 0; | 	return nr_irqs; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -290,7 +290,7 @@ void __init init_IRQ(void) | ||||||
| int __init arch_probe_nr_irqs(void) | int __init arch_probe_nr_irqs(void) | ||||||
| { | { | ||||||
| 	nr_irqs = sh_mv.mv_nr_irqs; | 	nr_irqs = sh_mv.mv_nr_irqs; | ||||||
| 	return 0; | 	return NR_IRQS_LEGACY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3880,7 +3880,7 @@ int __init arch_probe_nr_irqs(void) | ||||||
| 	if (nr < nr_irqs) | 	if (nr < nr_irqs) | ||||||
| 		nr_irqs = nr; | 		nr_irqs = nr; | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return NR_IRQS_LEGACY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -214,6 +214,10 @@ struct irq_chip { | ||||||
|  */ |  */ | ||||||
| #include <asm/hw_irq.h> | #include <asm/hw_irq.h> | ||||||
| 
 | 
 | ||||||
|  | #ifndef NR_IRQS_LEGACY | ||||||
|  | # define NR_IRQS_LEGACY 0 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifndef ARCH_IRQ_INIT_FLAGS | #ifndef ARCH_IRQ_INIT_FLAGS | ||||||
| # define ARCH_IRQ_INIT_FLAGS	0 | # define ARCH_IRQ_INIT_FLAGS	0 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -226,16 +226,16 @@ struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node) | ||||||
| 
 | 
 | ||||||
| int __init early_irq_init(void) | int __init early_irq_init(void) | ||||||
| { | { | ||||||
| 	int i, node = first_online_node; | 	int i, initcnt, node = first_online_node; | ||||||
| 	struct irq_desc *desc; | 	struct irq_desc *desc; | ||||||
| 
 | 
 | ||||||
| 	init_irq_default_affinity(); | 	init_irq_default_affinity(); | ||||||
| 
 | 
 | ||||||
| 	 /* initialize nr_irqs based on nr_cpu_ids */ | 	/* Let arch update nr_irqs and return the nr of preallocated irqs */ | ||||||
| 	arch_probe_nr_irqs(); | 	initcnt = arch_probe_nr_irqs(); | ||||||
| 	printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d\n", NR_IRQS, nr_irqs); | 	printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d %d\n", NR_IRQS, nr_irqs, initcnt); | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < NR_IRQS_LEGACY; i++) { | 	for (i = 0; i < initcnt; i++) { | ||||||
| 		desc = alloc_desc(i, node); | 		desc = alloc_desc(i, node); | ||||||
| 		set_bit(i, allocated_irqs); | 		set_bit(i, allocated_irqs); | ||||||
| 		irq_insert_desc(i, desc); | 		irq_insert_desc(i, desc); | ||||||
|  |  | ||||||
|  | @ -886,9 +886,10 @@ int __init __weak early_irq_init(void) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_GENERIC_HARDIRQS | ||||||
| int __init __weak arch_probe_nr_irqs(void) | int __init __weak arch_probe_nr_irqs(void) | ||||||
| { | { | ||||||
| 	return 0; | 	return NR_IRQS_LEGACY; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int __init __weak arch_early_irq_init(void) | int __init __weak arch_early_irq_init(void) | ||||||
|  | @ -900,3 +901,4 @@ int __weak arch_init_chip_data(struct irq_desc *desc, int node) | ||||||
| { | { | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thomas Gleixner
				Thomas Gleixner