[lkml]   [2007]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    SubjectRe: nmi_watchdog=2 regression in 2.6.21
    On Tue, 2007-08-28 at 12:46 -0700, Stephane Eranian wrote:

    > I think I found the problem. As I suspected, it seems there is an assymetry
    > between the 1st end 2nd counter (just like what they have on P6 core). Yet
    > for architectural perfmon v1, this restriction is supposed to be lifted.
    > Unfortunately, a quick look at the errata document at
    > for Core Duo shows bugs A49 as 'nofix':
    > Core Duo processor has a bug which renders the enable bit (22) of
    > PERFEVTSEL1 inoperative. The processor behaves like former P6 cores,
    > the enable bit of PERFEVTSEL0 controls the activation of both counters

    Your patch switched the nmi from PERFEVTSEL0 to PERFEVTSEL1 (right?)..
    So 0 works, 1 does not , for me anyway ..

    > That explains why you get the 'NMI stuck' message when using PERFEVTSEL1.
    > I suspect when using PERFEVTSEL0, then NMI watchdog is not stuck. So it
    > is possible that in case NMI is stuck the code does not cleanly shutdown the
    > NMI interrupt and you get some spurious NMI interrupt later in the boot at
    > you are stuck because you are holding a lock. We need to look at the error
    > path of check_nmi_watchdog(). I glance through it and could not find the place
    > where the APIC vector is cleared.

    As far as I can tell the check_nmi_watchdog() doesn't take locks, and it
    can't safely share a lock with the NMI ..

    The patch below fixes the hang (not the stuck NMI) .. Not totally sure
    why, but the cpus are stuck in a loop waiting for the endflag which
    never comes .. This also plays with the nmi hz which might do
    something.. /proc/interrupt doesn't show any nmi's either..


    Signed-off-by: Daniel Walker <>

    Index: linux-2.6.22/arch/i386/kernel/nmi.c
    --- linux-2.6.22.orig/arch/i386/kernel/nmi.c 2007-08-15 00:51:12.000000000 +0000
    +++ linux-2.6.22/arch/i386/kernel/nmi.c 2007-08-28 20:15:04.000000000 +0000
    @@ -82,7 +82,7 @@ static __init void nmi_cpu_busy(void *da
    static int __init check_nmi_watchdog(void)
    unsigned int *prev_nmi_count;
    - int cpu;
    + int cpu, ret = 0;

    if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT))
    return 0;
    @@ -125,18 +125,18 @@ static int __init check_nmi_watchdog(voi
    if (!atomic_read(&nmi_active)) {
    atomic_set(&nmi_active, -1);
    - return -1;
    - }
    + printk("nmi malfunctioning.\n");
    + ret = -1;
    + } else
    + printk("OK.\n");
    endflag = 1;
    - printk("OK.\n");
    /* now that we know it works we can reduce NMI frequency to
    something more reasonable; makes a difference in some configs */
    if (nmi_watchdog == NMI_LOCAL_APIC)
    nmi_hz = lapic_adjust_nmi_hz(1);

    - return 0;
    + return ret;
    /* This needs to happen later in boot so counters are working */

    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at

     \ /
      Last update: 2007-08-28 22:25    [W:0.037 / U:5.976 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site