aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/io_apic_64.c10
-rw-r--r--arch/x86/kernel/irq_64.c4
-rw-r--r--arch/x86/kernel/irqinit_64.c3
-rw-r--r--include/linux/irq.h2
-rw-r--r--kernel/irq/chip.c21
-rw-r--r--kernel/irq/handle.c23
-rw-r--r--kernel/irq/manage.c16
7 files changed, 38 insertions, 41 deletions
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
index 1b8cccb5ba25..a054db9ef190 100644
--- a/arch/x86/kernel/io_apic_64.c
+++ b/arch/x86/kernel/io_apic_64.c
@@ -1124,7 +1124,12 @@ static void ioapic_register_intr(int irq, unsigned long trigger)
1124{ 1124{
1125 struct irq_desc *desc; 1125 struct irq_desc *desc;
1126 1126
1127 desc = irq_to_desc(irq); 1127 /* first time to use this irq_desc */
1128 if (irq < 16)
1129 desc = irq_to_desc(irq);
1130 else
1131 desc = irq_to_desc_alloc(irq);
1132
1128 if (trigger) 1133 if (trigger)
1129 desc->status |= IRQ_LEVEL; 1134 desc->status |= IRQ_LEVEL;
1130 else 1135 else
@@ -1919,6 +1924,9 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void)
1919 irq = __get_cpu_var(vector_irq)[vector]; 1924 irq = __get_cpu_var(vector_irq)[vector];
1920 1925
1921 desc = irq_to_desc(irq); 1926 desc = irq_to_desc(irq);
1927 if (!desc)
1928 continue;
1929
1922 cfg = irq_cfg(irq); 1930 cfg = irq_cfg(irq);
1923 spin_lock(&desc->lock); 1931 spin_lock(&desc->lock);
1924 if (!cfg->move_cleanup_count) 1932 if (!cfg->move_cleanup_count)
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c
index f337f87c1e16..5d5976e0311a 100644
--- a/arch/x86/kernel/irq_64.c
+++ b/arch/x86/kernel/irq_64.c
@@ -83,7 +83,7 @@ int show_interrupts(struct seq_file *p, void *v)
83 83
84 if (i < nr_irqs) { 84 if (i < nr_irqs) {
85 unsigned any_count = 0; 85 unsigned any_count = 0;
86 struct irq_desc *desc = __irq_to_desc(i); 86 struct irq_desc *desc = irq_to_desc(i);
87 87
88 if (!desc) 88 if (!desc)
89 return 0; 89 return 0;
@@ -206,7 +206,7 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
206 stack_overflow_check(regs); 206 stack_overflow_check(regs);
207#endif 207#endif
208 208
209 desc = __irq_to_desc(irq); 209 desc = irq_to_desc(irq);
210 if (likely(desc)) 210 if (likely(desc))
211 generic_handle_irq_desc(irq, desc); 211 generic_handle_irq_desc(irq, desc);
212 else { 212 else {
diff --git a/arch/x86/kernel/irqinit_64.c b/arch/x86/kernel/irqinit_64.c
index cd9f42d028d9..d17fbc26d96f 100644
--- a/arch/x86/kernel/irqinit_64.c
+++ b/arch/x86/kernel/irqinit_64.c
@@ -143,7 +143,8 @@ void __init init_ISA_irqs(void)
143 init_8259A(0); 143 init_8259A(0);
144 144
145 for (i = 0; i < 16; i++) { 145 for (i = 0; i < 16; i++) {
146 struct irq_desc *desc = irq_to_desc(i); 146 /* first time call this irq_desc */
147 struct irq_desc *desc = irq_to_desc_alloc(i);
147 148
148 desc->status = IRQ_DISABLED; 149 desc->status = IRQ_DISABLED;
149 desc->action = NULL; 150 desc->action = NULL;
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 7b59e193a119..5fe1b01c11fe 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -191,7 +191,7 @@ struct irq_desc {
191} ____cacheline_internodealigned_in_smp; 191} ____cacheline_internodealigned_in_smp;
192 192
193extern struct irq_desc *irq_to_desc(unsigned int irq); 193extern struct irq_desc *irq_to_desc(unsigned int irq);
194extern struct irq_desc *__irq_to_desc(unsigned int irq); 194extern struct irq_desc *irq_to_desc_alloc(unsigned int irq);
195 195
196#ifndef CONFIG_HAVE_SPARSE_IRQ 196#ifndef CONFIG_HAVE_SPARSE_IRQ
197 197
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index a4bb0da9c88c..9fc5e69213de 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -27,7 +27,8 @@ void dynamic_irq_init(unsigned int irq)
27 struct irq_desc *desc; 27 struct irq_desc *desc;
28 unsigned long flags; 28 unsigned long flags;
29 29
30 desc = irq_to_desc(irq); 30 /* first time to use this irq_desc */
31 desc = irq_to_desc_alloc(irq);
31 if (!desc) { 32 if (!desc) {
32 WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq); 33 WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
33 return; 34 return;
@@ -60,7 +61,7 @@ void dynamic_irq_cleanup(unsigned int irq)
60 struct irq_desc *desc; 61 struct irq_desc *desc;
61 unsigned long flags; 62 unsigned long flags;
62 63
63 desc = __irq_to_desc(irq); 64 desc = irq_to_desc(irq);
64 if (!desc) { 65 if (!desc) {
65 WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq); 66 WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
66 return; 67 return;
@@ -92,7 +93,7 @@ int set_irq_chip(unsigned int irq, struct irq_chip *chip)
92 struct irq_desc *desc; 93 struct irq_desc *desc;
93 unsigned long flags; 94 unsigned long flags;
94 95
95 desc = __irq_to_desc(irq); 96 desc = irq_to_desc(irq);
96 if (!desc) { 97 if (!desc) {
97 WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq); 98 WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq);
98 return -EINVAL; 99 return -EINVAL;
@@ -122,7 +123,7 @@ int set_irq_type(unsigned int irq, unsigned int type)
122 unsigned long flags; 123 unsigned long flags;
123 int ret = -ENXIO; 124 int ret = -ENXIO;
124 125
125 desc = __irq_to_desc(irq); 126 desc = irq_to_desc(irq);
126 if (!desc) { 127 if (!desc) {
127 printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq); 128 printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
128 return -ENODEV; 129 return -ENODEV;
@@ -150,7 +151,7 @@ int set_irq_data(unsigned int irq, void *data)
150 struct irq_desc *desc; 151 struct irq_desc *desc;
151 unsigned long flags; 152 unsigned long flags;
152 153
153 desc = __irq_to_desc(irq); 154 desc = irq_to_desc(irq);
154 if (!desc) { 155 if (!desc) {
155 printk(KERN_ERR 156 printk(KERN_ERR
156 "Trying to install controller data for IRQ%d\n", irq); 157 "Trying to install controller data for IRQ%d\n", irq);
@@ -176,7 +177,7 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
176 struct irq_desc *desc; 177 struct irq_desc *desc;
177 unsigned long flags; 178 unsigned long flags;
178 179
179 desc = __irq_to_desc(irq); 180 desc = irq_to_desc(irq);
180 if (!desc) { 181 if (!desc) {
181 printk(KERN_ERR 182 printk(KERN_ERR
182 "Trying to install msi data for IRQ%d\n", irq); 183 "Trying to install msi data for IRQ%d\n", irq);
@@ -203,7 +204,7 @@ int set_irq_chip_data(unsigned int irq, void *data)
203 struct irq_desc *desc; 204 struct irq_desc *desc;
204 unsigned long flags; 205 unsigned long flags;
205 206
206 desc = __irq_to_desc(irq); 207 desc = irq_to_desc(irq);
207 if (!desc) { 208 if (!desc) {
208 printk(KERN_ERR 209 printk(KERN_ERR
209 "Trying to install chip data for IRQ%d\n", irq); 210 "Trying to install chip data for IRQ%d\n", irq);
@@ -554,7 +555,7 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
554 struct irq_desc *desc; 555 struct irq_desc *desc;
555 unsigned long flags; 556 unsigned long flags;
556 557
557 desc = __irq_to_desc(irq); 558 desc = irq_to_desc(irq);
558 if (!desc) { 559 if (!desc) {
559 printk(KERN_ERR 560 printk(KERN_ERR
560 "Trying to install type control for IRQ%d\n", irq); 561 "Trying to install type control for IRQ%d\n", irq);
@@ -618,7 +619,7 @@ void __init set_irq_noprobe(unsigned int irq)
618 struct irq_desc *desc; 619 struct irq_desc *desc;
619 unsigned long flags; 620 unsigned long flags;
620 621
621 desc = __irq_to_desc(irq); 622 desc = irq_to_desc(irq);
622 if (!desc) { 623 if (!desc) {
623 printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq); 624 printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
624 625
@@ -635,7 +636,7 @@ void __init set_irq_probe(unsigned int irq)
635 struct irq_desc *desc; 636 struct irq_desc *desc;
636 unsigned long flags; 637 unsigned long flags;
637 638
638 desc = __irq_to_desc(irq); 639 desc = irq_to_desc(irq);
639 if (!desc) { 640 if (!desc) {
640 printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq); 641 printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
641 642
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index e1d787e9169b..d44e3515eae1 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -151,7 +151,7 @@ early_param("nr_irq_desc", parse_nr_irq_desc);
151struct irq_desc *sparse_irqs; 151struct irq_desc *sparse_irqs;
152DEFINE_DYN_ARRAY(sparse_irqs, sizeof(struct irq_desc), nr_irq_desc, PAGE_SIZE, init_work); 152DEFINE_DYN_ARRAY(sparse_irqs, sizeof(struct irq_desc), nr_irq_desc, PAGE_SIZE, init_work);
153 153
154struct irq_desc *__irq_to_desc(unsigned int irq) 154struct irq_desc *irq_to_desc(unsigned int irq)
155{ 155{
156 struct irq_desc *desc; 156 struct irq_desc *desc;
157 157
@@ -169,7 +169,7 @@ struct irq_desc *__irq_to_desc(unsigned int irq)
169 } 169 }
170 return NULL; 170 return NULL;
171} 171}
172struct irq_desc *irq_to_desc(unsigned int irq) 172struct irq_desc *irq_to_desc_alloc(unsigned int irq)
173{ 173{
174 struct irq_desc *desc, *desc_pri; 174 struct irq_desc *desc, *desc_pri;
175 int i; 175 int i;
@@ -186,6 +186,7 @@ struct irq_desc *irq_to_desc(unsigned int irq)
186 186
187 if (desc->irq == -1U) { 187 if (desc->irq == -1U) {
188 desc->irq = irq; 188 desc->irq = irq;
189 printk(KERN_DEBUG "found new irq_desc for irq %d\n", desc->irq);
189 return desc; 190 return desc;
190 } 191 }
191 desc_pri = desc; 192 desc_pri = desc;
@@ -236,21 +237,7 @@ struct irq_desc *irq_to_desc(unsigned int irq)
236 237
237 desc->irq = irq; 238 desc->irq = irq;
238 desc_pri->next = desc; 239 desc_pri->next = desc;
239 { 240 printk(KERN_DEBUG "1 found new irq_desc for irq %d and pri will be irq %d\n", desc->irq, desc_pri->irq);
240 /* double check if some one mess up the list */
241 struct irq_desc *desc;
242 int count = 0;
243
244 desc = &sparse_irqs[0];
245 while (desc) {
246 printk(KERN_DEBUG "1 found irq_desc for irq %d\n", desc->irq);
247 if (desc->next)
248 printk(KERN_DEBUG "1 found irq_desc for irq %d and next will be irq %d\n", desc->irq, desc->next->irq);
249 desc = desc->next;
250 count++;
251 }
252 printk(KERN_DEBUG "1 all preallocted %d\n", count);
253 }
254 241
255 return desc; 242 return desc;
256} 243}
@@ -285,7 +272,7 @@ struct irq_desc *irq_to_desc(unsigned int irq)
285 272
286 return NULL; 273 return NULL;
287} 274}
288struct irq_desc *__irq_to_desc(unsigned int irq) 275struct irq_desc *irq_to_desc_alloc(unsigned int irq)
289{ 276{
290 return irq_to_desc(irq); 277 return irq_to_desc(irq);
291} 278}
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index c0b4d4df6de2..6df49218632a 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -31,7 +31,7 @@ cpumask_t irq_default_affinity = CPU_MASK_ALL;
31 */ 31 */
32void synchronize_irq(unsigned int irq) 32void synchronize_irq(unsigned int irq)
33{ 33{
34 struct irq_desc *desc = __irq_to_desc(irq); 34 struct irq_desc *desc = irq_to_desc(irq);
35 unsigned int status; 35 unsigned int status;
36 36
37 if (!desc) 37 if (!desc)
@@ -145,7 +145,7 @@ void disable_irq_nosync(unsigned int irq)
145 struct irq_desc *desc; 145 struct irq_desc *desc;
146 unsigned long flags; 146 unsigned long flags;
147 147
148 desc = __irq_to_desc(irq); 148 desc = irq_to_desc(irq);
149 if (!desc) 149 if (!desc)
150 return; 150 return;
151 151
@@ -174,7 +174,7 @@ void disable_irq(unsigned int irq)
174{ 174{
175 struct irq_desc *desc; 175 struct irq_desc *desc;
176 176
177 desc = __irq_to_desc(irq); 177 desc = irq_to_desc(irq);
178 if (!desc) 178 if (!desc)
179 return; 179 return;
180 180
@@ -218,7 +218,7 @@ void enable_irq(unsigned int irq)
218 struct irq_desc *desc; 218 struct irq_desc *desc;
219 unsigned long flags; 219 unsigned long flags;
220 220
221 desc = __irq_to_desc(irq); 221 desc = irq_to_desc(irq);
222 if (!desc) 222 if (!desc)
223 return; 223 return;
224 224
@@ -296,7 +296,7 @@ int can_request_irq(unsigned int irq, unsigned long irqflags)
296 struct irq_desc *desc; 296 struct irq_desc *desc;
297 struct irqaction *action; 297 struct irqaction *action;
298 298
299 desc = __irq_to_desc(irq); 299 desc = irq_to_desc(irq);
300 if (!desc) 300 if (!desc)
301 return 0; 301 return 0;
302 302
@@ -366,7 +366,7 @@ int setup_irq(unsigned int irq, struct irqaction *new)
366 int shared = 0; 366 int shared = 0;
367 int ret; 367 int ret;
368 368
369 desc = __irq_to_desc(irq); 369 desc = irq_to_desc(irq);
370 if (!desc) 370 if (!desc)
371 return -EINVAL; 371 return -EINVAL;
372 372
@@ -527,7 +527,7 @@ void free_irq(unsigned int irq, void *dev_id)
527 527
528 WARN_ON(in_interrupt()); 528 WARN_ON(in_interrupt());
529 529
530 desc = __irq_to_desc(irq); 530 desc = irq_to_desc(irq);
531 if (!desc) 531 if (!desc)
532 return; 532 return;
533 533
@@ -644,7 +644,7 @@ int request_irq(unsigned int irq, irq_handler_t handler,
644 if ((irqflags & IRQF_SHARED) && !dev_id) 644 if ((irqflags & IRQF_SHARED) && !dev_id)
645 return -EINVAL; 645 return -EINVAL;
646 646
647 desc = __irq_to_desc(irq); 647 desc = irq_to_desc(irq);
648 if (!desc) 648 if (!desc)
649 return -EINVAL; 649 return -EINVAL;
650 650