The Intel PerfMon NMI watchdog was using the generic reservation
function which always reserves the first performance counter. But the
watchdog actually uses the second performance counter, thus we need a
specialised function.

Signed-off-by: Björn Steinbrink <[EMAIL PROTECTED]>
---
 arch/i386/kernel/cpu/perfctr-watchdog.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/arch/i386/kernel/cpu/perfctr-watchdog.c 
b/arch/i386/kernel/cpu/perfctr-watchdog.c
index a12dbcf..efc3232 100644
--- a/arch/i386/kernel/cpu/perfctr-watchdog.c
+++ b/arch/i386/kernel/cpu/perfctr-watchdog.c
@@ -562,9 +562,27 @@ static int setup_intel_arch_watchdog(unsigned nmi_hz)
        return 1;
 }
 
+static int intel_arch_reserve(void)
+{
+       if (!reserve_perfctr_nmi(MSR_ARCH_PERFMON_PERFCTR1))
+               return 0;
+
+       if (!reserve_evntsel_nmi(MSR_ARCH_PERFMON_EVENTSEL1)) {
+               release_perfctr_nmi(MSR_ARCH_PERFMON_PERFCTR1);
+               return 0;
+       }
+       return 1;
+}
+
+static void intel_arch_unreserve(void)
+{
+       release_evntsel_nmi(MSR_ARCH_PERFMON_EVENTSEL1);
+       release_perfctr_nmi(MSR_ARCH_PERFMON_PERFCTR1);
+}
+
 static struct wd_ops intel_arch_wd_ops = {
-       .reserve = single_msr_reserve,
-       .unreserve = single_msr_unreserve,
+       .reserve = intel_arch_reserve,
+       .unreserve = intel_arch_unreserve,
        .setup = setup_intel_arch_watchdog,
        .rearm = p6_rearm,
        .stop = single_msr_stop_watchdog,
-- 
1.5.2.2

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to