1
linux/include/asm-x86
Aristeu Rozanski b3e15bdef6 x86, NMI watchdog: setup before enabling NMI watchdog
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: Aristeu Rozanski <aris@redhat.com>
Acked-by: Don Zickus <dzickus@redhat.com>
Acked-by: Prarit Bhargava <prarit@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-09-22 19:48:19 +02:00
..
mach-bigsmp x86: APIC: remove apic_write_around(); use alternatives 2008-07-18 12:51:21 +02:00
mach-default x86: convert Dprintk to pr_debug 2008-07-21 21:35:38 +02:00
mach-es7000 x86: APIC: remove apic_write_around(); use alternatives 2008-07-18 12:51:21 +02:00
mach-generic x86: extend and use x86_quirks to clean up NUMAQ code 2008-07-20 09:25:52 +02:00
mach-numaq x86: remove unused file after numaq etc depends on genericarch 2008-07-08 10:38:54 +02:00
mach-rdc321x
mach-summit x86: fix IBM Summit based systems' phys_cpu_present_map on 32-bit kernels 2008-07-26 14:58:39 +02:00
mach-voyager Merge branch 'generic-ipi' into generic-ipi-for-linus 2008-07-15 21:55:59 +02:00
uv x86, SGI UV: hardcode the TLB flush interrupt system vector 2008-08-20 12:36:03 +02:00
visws x86, VisWS: turn into generic arch, move definitions 2008-07-10 18:55:40 +02:00
xen removed unused #include <linux/version.h>'s 2008-08-23 12:14:12 -07:00
a.out-core.h
a.out.h
acpi.h x86: use acpi_numa_init to parse on 32-bit numa 2008-07-08 10:38:47 +02:00
agp.h
alternative-asm.h
alternative.h
amd_iommu_types.h x86m AMD IOMMU: cleanup: replace LOW_U32 macro with generic lower_32_bits 2008-08-15 13:56:56 +02:00
amd_iommu.h x86, AMD IOMMU: add amd_iommu.h to export functions to the generic x86 dma code 2008-06-27 10:12:21 +02:00
apic.h x86: convert Dprintk to pr_debug 2008-07-21 21:35:38 +02:00
apicdef.h
arch_hooks.h x86: add ->pre_time_init to x86_quirks 2008-07-20 09:25:52 +02:00
asm.h x86: use macros from asm.h. 2008-07-09 09:14:12 +02:00
atomic_32.h
atomic_64.h x86: correct register constraints for 64-bit atomic operations 2008-08-18 07:47:30 +02:00
atomic.h
auxvec.h
bios_ebda.h x86: extract common part of head32.c and head64.c into head.c 2008-06-05 15:10:02 +02:00
bitops.h x86, cleanup: fix description of __fls(): __fls(0) is undefined 2008-07-18 14:32:38 +02:00
boot.h
bootparam.h x86: move reserve_setup_data to setup.c 2008-07-08 13:16:14 +02:00
bug.h
bugs.h
byteorder.h
cache.h
cacheflush.h
calgary.h
calling.h x86 ptrace: unify syscall tracing 2008-07-16 12:15:17 -07:00
checksum_32.h
checksum_64.h
checksum.h
cmpxchg_32.h
cmpxchg_64.h x86, 64-bit: add sync_cmpxchg 2008-07-08 13:10:58 +02:00
cmpxchg.h
compat.h
cpu.h
cpufeature.h x86: add NOPL as a synthetic CPU feature bit 2008-09-05 16:13:52 -07:00
cputime.h
current.h
debugreg.h
delay.h x86: delay lib unification build fix 2008-07-09 09:13:59 +02:00
desc_defs.h x86, 64-bit: add gate_offset() and gate_segment() macros 2008-07-08 13:10:28 +02:00
desc.h Merge commit 'v2.6.26' into x86/core 2008-07-14 11:37:46 +02:00
device.h dma-mapping: add the device argument to dma_mapping_error() 2008-07-26 12:00:03 -07:00
div64.h
dma-mapping.h Merge branch 'linus' into core/generic-dma-coherent 2008-07-29 00:07:55 +02:00
dma.h
dmi.h x86: use acpi_numa_init to parse on 32-bit numa 2008-07-08 10:38:47 +02:00
ds.h
dwarf2.h x86: Fix compile error with CONFIG_AS_CFI=n 2008-07-15 15:30:29 +02:00
e820.h x86: seperate memtest from init_64.c 2008-07-18 14:10:27 +02:00
edac.h
efi.h EFI, x86: fix function prototype 2008-08-11 18:50:19 +02:00
elf.h x86/paravirt, 64-bit: make load_gs_index() a paravirt operation 2008-07-08 13:15:58 +02:00
emergency-restart.h
errno.h
fb.h
fcntl.h
fixmap_32.h x86: i386: reduce boot fixmap space 2008-07-18 16:17:52 -07:00
fixmap_64.h x86: make 64bit hpet_set_mapping to use ioremap too, v2 2008-07-14 09:24:17 +02:00
fixmap.h x86/paravirt/xen: add set_fixmap pv_mmu_ops 2008-06-20 15:09:56 +02:00
floppy.h
frame.h
ftrace.h ftrace: copy + paste typo in asm/ftrace.h 2008-07-18 13:14:08 +02:00
futex.h
gart.h x86: make only GART code include gart.h 2008-07-11 11:00:54 +02:00
genapic_32.h x86: fix section mismatch warning - uv_cpu_init 2008-08-22 14:12:20 +02:00
genapic_64.h x86: fix section mismatch warning - uv_cpu_init 2008-08-22 14:12:20 +02:00
genapic.h
geode.h x86, geode-mfgpt: check IRQ before using MFGPT as clocksource 2008-08-15 17:12:32 +02:00
gpio.h x86, RDC321x: remove gpio.h complications 2008-07-26 14:50:51 +02:00
hardirq_32.h
hardirq_64.h
hardirq.h
highmem.h x86: kill bad_ppro 2008-07-08 10:38:19 +02:00
hpet.h x86: merge tsc calibration 2008-07-09 07:43:25 +02:00
hugetlb.h hugetlb: modular state for hugetlb page size 2008-07-24 10:47:17 -07:00
hw_irq.h x86: Restore proper vector locking during cpu hotplug 2008-08-11 10:37:34 +02:00
hypertransport.h
i387.h Merge branch 'x86/amd-iommu' into x86/urgent 2008-08-15 13:57:32 +02:00
i8253.h
i8259.h
ia32_unistd.h
ia32.h
idle.h
intel_arch_perfmon.h
io_32.h access_process_vm device memory infrastructure 2008-07-24 10:47:15 -07:00
io_64.h access_process_vm device memory infrastructure 2008-07-24 10:47:15 -07:00
io_apic.h x86: let setup_arch call init_apic_mappings for 32bit 2008-07-08 13:16:04 +02:00
io.h x86: fix readb() et al compile error with gcc-3.2.3 2008-08-15 14:30:32 +02:00
ioctl.h
ioctls.h
iommu.h generic, x86: fix add iommu_num_pages helper function 2008-07-29 12:12:48 +02:00
ipcbuf.h
ipi.h Merge branch 'linus' into cpus4096 2008-07-16 00:29:07 +02:00
irq_regs_32.h
irq_regs_64.h
irq_regs.h
irq_vectors.h x86, SGI UV: hardcode the TLB flush interrupt system vector 2008-08-20 12:36:03 +02:00
irq.h
irqflags.h Merge branch 'auto-ftrace-next' into tracing/for-linus 2008-07-14 16:11:52 +02:00
ist.h
k8.h
Kbuild Merge git://git.infradead.org/~dwmw2/random-2.6 2008-07-25 12:01:37 -07:00
kdebug.h
kexec.h kexec jump: check code size in control page 2008-08-15 08:35:42 -07:00
kgdb.h
kmap_types.h
kprobes.h
kvm_host.h KVM: Use .fixup instead of .text.fixup on __kvm_handle_fault_on_reboot 2008-08-25 17:22:57 +03:00
kvm_para.h x86: KVM guest: Add memory clobber to hypercalls 2008-07-06 11:05:18 +03:00
kvm_x86_emulate.h KVM: x86 emulator: lazily evaluate segment registers 2008-07-20 12:42:35 +03:00
kvm.h KVM: SVM: add tracing support for TDP page faults 2008-07-20 12:40:48 +03:00
ldt.h
lguest_hcall.h
lguest.h
linkage.h
local.h
math_emu.h
mc146818rtc.h
mca_dma.h
mca.h
mce.h x86 MCE: Fix CPU hotplug problem with multiple multicore AMD CPUs 2008-08-23 17:49:19 +02:00
mman.h x86: add MAP_STACK mmap flag 2008-08-15 11:45:19 -07:00
mmconfig.h x86: mmconf: fix section mismatch warning 2008-08-18 07:49:06 +02:00
mmu_context_32.h x86: unify mmu_context.h 2008-07-08 13:10:31 +02:00
mmu_context_64.h x86: unify mmu_context.h 2008-07-08 13:10:31 +02:00
mmu_context.h x86: unify mmu_context.h 2008-07-08 13:10:31 +02:00
mmu.h
mmx.h
mmzone_32.h x86: propagate new nonpanic bootmem macros to CONFIG_HAVE_ARCH_BOOTMEM_NODE 2008-08-13 11:57:18 +02:00
mmzone_64.h
mmzone.h
module.h
mpspec_def.h x86: increase MAX_APICS for very large x86-64 configs 2008-07-08 12:23:29 +02:00
mpspec.h Merge branch 'x86/uv' into x86/devel 2008-07-08 12:24:13 +02:00
msgbuf.h
msidef.h
msr-index.h x86: cleanup C1E enabled detection 2008-06-10 15:52:07 +02:00
msr.h x86: msr: fix bogus return values from rdmsr_safe/wrmsr_safe 2008-08-25 22:39:15 -07:00
mtrr.h
mutex_32.h
mutex_64.h
mutex.h
nmi.h x86, NMI watchdog: setup before enabling NMI watchdog 2008-09-22 19:48:19 +02:00
nops.h
numa_32.h x86: introduce init_memory_mapping for 32bit #3 2008-07-08 13:10:33 +02:00
numa_64.h x86: introduce initmem_init for 64 bit 2008-07-08 12:50:14 +02:00
numa.h
numaq.h x86: fix numaq_tsc_disable calling 2008-07-13 08:19:45 +02:00
olpc.h
page_32.h x86: merge zones_sizes_init for numa and non numa on 32-bit 2008-07-08 13:16:22 +02:00
page_64.h x86: map UV chipset space - pagetable 2008-07-09 07:43:23 +02:00
page.h PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures 2008-07-24 10:47:21 -07:00
param.h
paravirt.h x86: rename PTE_MASK to PTE_PFN_MASK 2008-07-22 10:43:44 +02:00
parport.h
pat.h x86: rename pat_wc_enabled to pat_enabled 2008-06-12 10:14:27 +02:00
pci_32.h x86: add compilation checks to pci_unmap_*() macros 2008-06-30 12:22:01 +02:00
pci_64.h
pci-direct.h PCI/x86: early dump pci conf space v2 2008-06-10 10:59:52 -07:00
pci.h x86: move pci_routirq declaration to pci.h 2008-07-08 09:13:08 +02:00
pda.h x86: remove static boot_cpu_pda array v2 2008-07-08 11:31:25 +02:00
percpu.h x86, percpu: silence section mismatch warnings related to EARLY_PER_CPU variables 2008-08-18 09:10:55 +02:00
pgalloc.h x86/paravirt: add a pgd_alloc/free hooks 2008-07-08 13:11:01 +02:00
pgtable_32.h x86: add PTE_FLAGS_MASK 2008-07-22 10:43:45 +02:00
pgtable_64.h x86-64: fix overlap of modules and fixmap areas 2008-08-15 17:31:50 +02:00
pgtable-2level-defs.h
pgtable-2level.h
pgtable-3level-defs.h
pgtable-3level.h x86: rename PTE_MASK to PTE_PFN_MASK 2008-07-22 10:43:44 +02:00
pgtable.h x86: implement pte_special 2008-07-26 12:00:05 -07:00
poll.h
posix_types_32.h
posix_types_64.h
posix_types.h
prctl.h
processor-cyrix.h
processor-flags.h x86: fix header export, asm-x86/processor-flags.h, CONFIG_* leaks 2008-07-24 12:49:53 +02:00
processor.h x86: invalidate caches before going into suspend 2008-08-15 14:04:30 +02:00
proto.h x86: add flags parameter to reserve_bootmem_generic() 2008-07-08 11:49:49 +02:00
ptrace-abi.h x86 ptrace: unify syscall tracing 2008-07-16 12:15:17 -07:00
ptrace.h x86: break mutual header inclusion 2008-06-02 12:48:23 +02:00
pvclock-abi.h x86: Add structs and functions for paravirt clocksource 2008-06-24 21:02:31 +03:00
pvclock.h x86: Add structs and functions for paravirt clocksource 2008-06-24 21:02:31 +03:00
reboot_fixups.h
reboot.h
required-features.h x86: add NOPL as a synthetic CPU feature bit 2008-09-05 16:13:52 -07:00
resource.h
resume-trace.h
rio.h
rtc.h
rwlock.h
rwsem.h
scatterlist.h
seccomp_32.h x86: fix incomplete include guard in include/asm-x86/seccomp_32.h 2008-06-02 12:45:28 +02:00
seccomp_64.h x86: more header fixes 2008-06-18 12:27:03 +02:00
seccomp.h
sections.h
segment.h x86: unify and correct the GDT_ENTRY() macro 2008-07-17 11:29:24 -07:00
sembuf.h
serial.h
setup.h Merge branches 'x86/urgent', 'x86/amd-iommu', 'x86/apic', 'x86/cleanups', 'x86/core', 'x86/cpu', 'x86/fixmap', 'x86/gart', 'x86/kprobes', 'x86/memtest', 'x86/modules', 'x86/nmi', 'x86/pat', 'x86/reboot', 'x86/setup', 'x86/step', 'x86/unify-pci', 'x86/uv', 'x86/xen' and 'xen-64bit' into x86/for-linus 2008-07-21 16:37:17 +02:00
shmbuf.h
shmparam.h
sigcontext32.h
sigcontext.h
siginfo.h
signal.h Fix typos from signal_32/64.h merge 2008-07-18 17:59:13 +02:00
smp.h x86_64: unstatic get_local_pda 2008-07-16 10:55:07 +02:00
socket.h
sockios.h
sparsemem.h
spinlock_types.h x86/paravirt: add hooks for spinlock operations 2008-07-16 11:15:52 +02:00
spinlock.h x86: fix spin_is_contended() 2008-08-15 16:26:51 +02:00
srat.h x86: remove acpi_srat config v2 2008-07-08 15:49:08 +02:00
stacktrace.h
stat.h
statfs.h
string_32.h
string_64.h
string.h
suspend_32.h x86: more header fixes 2008-06-18 12:27:03 +02:00
suspend_64.h
suspend.h
swiotlb.h dma-mapping: add the device argument to dma_mapping_error() 2008-07-26 12:00:03 -07:00
sync_bitops.h
system_64.h
system.h x86: fix savesegment() bug causing crashes on 64-bit 2008-07-11 19:51:47 +02:00
tce.h
termbits.h
termios.h
therm_throt.h
thread_info.h clean up duplicated alloc/free_thread_info 2008-07-25 10:53:28 -07:00
time.h x86: merge tsc_init and clocksource code 2008-07-09 07:43:27 +02:00
timer.h x86: rename paravirtualized TSC functions 2008-07-09 07:43:28 +02:00
timex.h
tlb.h
tlbflush.h
topology.h x86: change _node_to_cpumask_ptr to return const ptr 2008-07-13 19:11:58 +02:00
trampoline.h
traps.h x86: introducing asm-x86/traps.h 2008-07-18 18:51:57 +02:00
tsc.h x86: merge tsc_init and clocksource code 2008-07-09 07:43:27 +02:00
types.h
uaccess_32.h x86: define architectural characteristics in uaccess.h. 2008-07-09 09:14:29 +02:00
uaccess_64.h x86: introduce copy_user_handle_tail() routine 2008-07-09 15:51:03 +02:00
uaccess.h x86: lockless get_user_pages_fast() 2008-07-26 12:00:06 -07:00
ucontext.h
unaligned.h
unistd_32.h flag parameters add-on: remove epoll_create size param 2008-07-24 10:47:29 -07:00
unistd_64.h flag parameters add-on: remove epoll_create size param 2008-07-24 10:47:29 -07:00
unistd.h
unwind.h
user32.h
user_32.h
user_64.h
user.h
vdso.h x86_64: further cleanup of 32-bit compat syscall mechanisms 2008-07-16 11:08:27 +02:00
vga.h
vgtod.h
vic.h
vm86.h x86: break mutual header inclusion 2008-06-02 12:48:23 +02:00
vmi_time.h x86: rename paravirtualized TSC functions 2008-07-09 07:43:28 +02:00
vmi.h
voyager.h
vsyscall.h
xor_32.h x86: more header fixes 2008-06-18 12:27:03 +02:00
xor_64.h x86: more header fixes 2008-06-18 12:27:03 +02:00
xor.h