• Aristeu Rozanski's avatar
    x86, NMI watchdog: setup before enabling NMI watchdog · b3e15bde
    Aristeu Rozanski authored
    There's a small window when NMI watchdog is being set up that if any NMIs
    are triggered, the NMI code will make make use of not initalized wd_ops
    elements:
    	void setup_apic_nmi_watchdog(void *unused)
    	{
    		if (__get_cpu_var(wd_enabled))
    			return;
    
    		/* cheap hack to support suspend/resume */
    		/* if cpu0 is not active neither should the other cpus */
    		if (smp_processor_id() != 0 && atomic_read(&nmi_active) <= 0)
    			return;
    
    		switch (nmi_watchdog) {
    		case NMI_LOCAL_APIC:
    			/* enable it before to avoid race with handler */
    -->			__get_cpu_var(wd_enabled) = 1;
    -->			if (lapic_watchdog_init(nmi_hz) < 0) {
    (...)
    	asmlinkage notrace __kprobes void default_do_nmi(struct pt_regs *regs)
    	{
    	(...)
    			if (nmi_watchdog_tick(regs, reason))
    				return;
    (...)
    	notrace __kprobes int
    	nmi_watchdog_tick(struct pt_regs *regs, unsigned reason)
    	{
    	(...)
    		if (!__get_cpu_var(wd_enabled))
    			return rc;
    		switch (nmi_watchdog) {
    		case NMI_LOCAL_APIC:
    			rc |= lapic_wd_event(nmi_hz);
    (...)
    int lapic_wd_event(unsigned nmi_hz)
    {
    	struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk);
    	u64 ctr;
    
    -->	rdmsrl(wd->perfctr_msr, ctr);
    
    and wd->*_msr will be initialized on each processor type specific setup, after
    enabling NMIs for PMIs. Since the counter was just set, the chances of an
    performance counter generated NMI is minimal, but any other unknown NMI would
    trigger the problem. This patch fixes the problem by setting everything up
    before enabling performance counter generated NMIs and will set wd_enabled
    using a callback function.
    Signed-off-by: default avatarAristeu Rozanski <aris@redhat.com>
    Acked-by: default avatarDon Zickus <dzickus@redhat.com>
    Acked-by: default avatarPrarit Bhargava <prarit@redhat.com>
    Acked-by: default avatarVivek Goyal <vgoyal@redhat.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    b3e15bde
nmi.c 12.3 KB