diff options
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 20 |
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) | |||
3305 | void destroy_irq(unsigned int irq) | 3302 | void 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 | ||