diff options
author | Yinghai Lu <yinghai@kernel.org> | 2009-03-30 23:37:20 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-03 13:14:44 -0400 |
commit | 9756b15e1b58453a6fd54b85c1ad8515209e10bb (patch) | |
tree | 1b6ba55e845bbd07460c0c4e061641564b9a69b2 | |
parent | 8fe74cf053de7ad2124a894996f84fa890a81093 (diff) |
irq: fix cpumask memory leak on offstack cpumask kernels
Need to free the old cpumask for affinity and pending_mask.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
LKML-Reference: <49D18FF0.50707@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | include/linux/irq.h | 14 | ||||
-rw-r--r-- | kernel/irq/numa_migrate.c | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 974890b3c52f..99d147efe399 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -482,6 +482,16 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc, | |||
482 | #endif | 482 | #endif |
483 | } | 483 | } |
484 | 484 | ||
485 | static inline void free_desc_masks(struct irq_desc *old_desc, | ||
486 | struct irq_desc *new_desc) | ||
487 | { | ||
488 | free_cpumask_var(old_desc->affinity); | ||
489 | |||
490 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
491 | free_cpumask_var(old_desc->pending_mask); | ||
492 | #endif | ||
493 | } | ||
494 | |||
485 | #else /* !CONFIG_SMP */ | 495 | #else /* !CONFIG_SMP */ |
486 | 496 | ||
487 | static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, | 497 | static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, |
@@ -495,6 +505,10 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc, | |||
495 | { | 505 | { |
496 | } | 506 | } |
497 | 507 | ||
508 | static inline void free_desc_masks(struct irq_desc *old_desc, | ||
509 | struct irq_desc *new_desc) | ||
510 | { | ||
511 | } | ||
498 | #endif /* CONFIG_SMP */ | 512 | #endif /* CONFIG_SMP */ |
499 | 513 | ||
500 | #endif /* _LINUX_IRQ_H */ | 514 | #endif /* _LINUX_IRQ_H */ |
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index 243d6121e50e..44bbdcbaf8d2 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
@@ -54,6 +54,7 @@ static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, | |||
54 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) | 54 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) |
55 | { | 55 | { |
56 | free_kstat_irqs(old_desc, desc); | 56 | free_kstat_irqs(old_desc, desc); |
57 | free_desc_masks(old_desc, desc); | ||
57 | arch_free_chip_data(old_desc, desc); | 58 | arch_free_chip_data(old_desc, desc); |
58 | } | 59 | } |
59 | 60 | ||