aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/apic/io_apic.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
-rw-r--r--arch/x86/kernel/apic/io_apic.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 5e4cce254e43..e93a76bc8670 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3278,12 +3278,9 @@ unsigned int create_irq_nr(unsigned int irq_want, int node)
3278 } 3278 }
3279 spin_unlock_irqrestore(&vector_lock, flags); 3279 spin_unlock_irqrestore(&vector_lock, flags);
3280 3280
3281 if (irq > 0) { 3281 if (irq > 0)
3282 dynamic_irq_init(irq); 3282 dynamic_irq_init_keep_chip_data(irq);
3283 /* restore it, in case dynamic_irq_init clear it */ 3283
3284 if (desc_new)
3285 desc_new->chip_data = cfg_new;
3286 }
3287 return irq; 3284 return irq;
3288} 3285}
3289 3286
@@ -3305,19 +3302,12 @@ int create_irq(void)
3305void destroy_irq(unsigned int irq) 3302void destroy_irq(unsigned int irq)
3306{ 3303{
3307 unsigned long flags; 3304 unsigned long flags;
3308 struct irq_cfg *cfg;
3309 struct irq_desc *desc;
3310 3305
3311 /* store it, in case dynamic_irq_cleanup clear it */ 3306 dynamic_irq_cleanup_keep_chip_data(irq);
3312 desc = irq_to_desc(irq);
3313 cfg = desc->chip_data;
3314 dynamic_irq_cleanup(irq);
3315 /* connect back irq_cfg */
3316 desc->chip_data = cfg;
3317 3307
3318 free_irte(irq); 3308 free_irte(irq);
3319 spin_lock_irqsave(&vector_lock, flags); 3309 spin_lock_irqsave(&vector_lock, flags);
3320 __clear_irq_vector(irq, cfg); 3310 __clear_irq_vector(irq, get_irq_chip_data(irq));
3321 spin_unlock_irqrestore(&vector_lock, flags); 3311 spin_unlock_irqrestore(&vector_lock, flags);
3322} 3312}
3323 3313