diff options
author | Andi Kleen <ak@suse.de> | 2007-04-16 10:30:27 +0200 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-04-16 10:30:27 +0200 |
commit | 1714f9bfc92d6ee67e84127332a1fae27772acfe (patch) | |
tree | a89256be07359cbb0586a52c00ae985e1de12561 /arch/i386 | |
parent | 08269c6d38e003adb12f55c6d795daa89bdc1bae (diff) | |
download | kernel_samsung_espresso10-1714f9bfc92d6ee67e84127332a1fae27772acfe.zip kernel_samsung_espresso10-1714f9bfc92d6ee67e84127332a1fae27772acfe.tar.gz kernel_samsung_espresso10-1714f9bfc92d6ee67e84127332a1fae27772acfe.tar.bz2 |
[PATCH] x86: Fix potential overflow in perfctr reservation
While reviewing this code again I found a potential overflow of the bitmap.
The p4 oprofile can theoretically set bits beyond the reservation bitmap for
specific configurations. Avoid that by sizing the bitmaps properly.
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/kernel/nmi.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index a98ba88..9f1e8c1 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c @@ -41,16 +41,17 @@ int nmi_watchdog_enabled; * different subsystems this reservation system just tries to coordinate * things a little */ -static DEFINE_PER_CPU(unsigned long, perfctr_nmi_owner); -static DEFINE_PER_CPU(unsigned long, evntsel_nmi_owner[3]); - -static cpumask_t backtrace_mask = CPU_MASK_NONE; /* this number is calculated from Intel's MSR_P4_CRU_ESCR5 register and it's * offset from MSR_P4_BSU_ESCR0. It will be the max for all platforms (for now) */ #define NMI_MAX_COUNTER_BITS 66 +#define NMI_MAX_COUNTER_LONGS BITS_TO_LONGS(NMI_MAX_COUNTER_BITS) +static DEFINE_PER_CPU(unsigned long, perfctr_nmi_owner[NMI_MAX_COUNTER_LONGS]); +static DEFINE_PER_CPU(unsigned long, evntsel_nmi_owner[NMI_MAX_COUNTER_LONGS]); + +static cpumask_t backtrace_mask = CPU_MASK_NONE; /* nmi_active: * >0: the lapic NMI watchdog is active, but can be disabled * <0: the lapic NMI watchdog has not been set up, and cannot |