irq: clear kstat_irqs
Impact: get correct kstat_irqs [/proc/interrupts] for msi/msi-x etc need to call clear_kstat_irqs(), so when we reuse that irq_desc, we get correct kstat in /proc/interrupts. This makes /proc/interrupts not have <NULL> entries. Don't need to worry about arch that doesn't support genirq, because they will not call dynamic_irq_cleanup(). v2: simplify and make clear_kstat_irqs more robust Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
4d87c5bec5
commit
0f3c2a89c1
3 changed files with 7 additions and 0 deletions
|
@ -78,6 +78,7 @@ void dynamic_irq_cleanup(unsigned int irq)
|
||||||
desc->handle_irq = handle_bad_irq;
|
desc->handle_irq = handle_bad_irq;
|
||||||
desc->chip = &no_irq_chip;
|
desc->chip = &no_irq_chip;
|
||||||
desc->name = NULL;
|
desc->name = NULL;
|
||||||
|
clear_kstat_irqs(desc);
|
||||||
spin_unlock_irqrestore(&desc->lock, flags);
|
spin_unlock_irqrestore(&desc->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,11 @@ struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
|
||||||
}
|
}
|
||||||
#endif /* !CONFIG_SPARSE_IRQ */
|
#endif /* !CONFIG_SPARSE_IRQ */
|
||||||
|
|
||||||
|
void clear_kstat_irqs(struct irq_desc *desc)
|
||||||
|
{
|
||||||
|
memset(desc->kstat_irqs, 0, nr_cpu_ids * sizeof(*(desc->kstat_irqs)));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* What should we do if we get a hw irq event on an illegal vector?
|
* What should we do if we get a hw irq event on an illegal vector?
|
||||||
* Each architecture has to answer this themself.
|
* Each architecture has to answer this themself.
|
||||||
|
|
|
@ -15,6 +15,7 @@ extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
|
||||||
|
|
||||||
extern struct lock_class_key irq_desc_lock_class;
|
extern struct lock_class_key irq_desc_lock_class;
|
||||||
extern void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr);
|
extern void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr);
|
||||||
|
extern void clear_kstat_irqs(struct irq_desc *desc);
|
||||||
extern spinlock_t sparse_irq_lock;
|
extern spinlock_t sparse_irq_lock;
|
||||||
extern struct irq_desc *irq_desc_ptrs[NR_IRQS];
|
extern struct irq_desc *irq_desc_ptrs[NR_IRQS];
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue