kernel_optimize_test/arch/x86/kernel
Andi Kleen 52d168e28b x86, mce: switch machine check polling to per CPU timer
Impact: Higher priority bug fix

The machine check poller runs a single timer and then broadcasted an
IPI to all CPUs to check them. This leads to unnecessary
synchronization between CPUs. The original CPU running the timer has
to wait potentially a long time for all other CPUs answering. This is
also real time unfriendly and in general inefficient.

This was especially a problem on systems with a lot of events where
the poller run with a higher frequency after processing some events.
There could be more and more CPU time wasted with this, to
the point of significantly slowing down machines.

The machine check polling is actually fully independent per CPU, so
there's no reason to not just do this all with per CPU timers.  This
patch implements that.

Also switch the poller also to use standard timers instead of work
queues. It was using work queues to be able to execute a user program
on a event, but mce_notify_user() handles this case now with a
separate callback. So instead always run the poll code in in a
standard per CPU timer, which means that in the common case of not
having to execute a trigger there will be less overhead.

This allows to clean up the initialization significantly, because
standard timers are already up when machine checks get init'ed.  No
multiple initialization functions.

Thanks to Thomas Gleixner for some help.

Cc: thockin@google.com
v2: Use del_timer_sync() on cpu shutdown and don't try to handle
migrated timers.
v3: Add WARN_ON for timer running on unexpected CPU

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2009-02-17 15:32:44 -08:00
..
acpi x86: find nr_irqs_gsi with mp_ioapic_routing 2009-02-09 12:42:59 +01:00
cpu x86, mce: switch machine check polling to per CPU timer 2009-02-17 15:32:44 -08:00
.gitignore
alternative.c x86, mce: don't disable machine checks during code patching 2009-02-17 15:32:38 -08:00
amd_iommu_init.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu 2009-01-03 12:03:52 -08:00
amd_iommu.c AMD IOMMU: remove now unnecessary #ifdefs 2009-01-03 16:44:15 +01:00
aperture_64.c aperture_64.c: clarify that too small aperture is valid reason for this code 2008-11-28 15:24:39 +01:00
apic.c x86, mce: fix ifdef for 64bit thermal apic vector clear on shutdown 2009-02-17 15:24:34 -08:00
apm_32.c x86: update Alan Cox's email addresses 2009-01-05 15:19:16 +01:00
asm-offsets_32.c x86: signal: move sigframe.h to arch/x86/include/asm 2008-12-18 11:28:54 +01:00
asm-offsets_64.c x86: asm-offset_64: use rt_sigframe_ia32 2008-12-18 15:01:24 -08:00
asm-offsets.c
audit_64.c
bios_uv.c x86: bios_uv.c: uv_systab should be static 2008-12-29 22:08:28 -08:00
bootflag.c
check.c x86: corruption-check: some post-move cleanups 2008-10-27 18:09:45 +01:00
cpuid.c Merge branch 'cpus4096-for-linus-3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-03 12:04:39 -08:00
crash_dump_32.c kdump: make elfcorehdr_addr independent of CONFIG_PROC_VMCORE 2008-10-20 08:52:39 -07:00
crash_dump_64.c kdump: make elfcorehdr_addr independent of CONFIG_PROC_VMCORE 2008-10-20 08:52:39 -07:00
crash.c kdump: forcibly disable VMX and SVM on machine_crash_shutdown() 2008-12-31 16:52:30 +02:00
doublefault_32.c x86: fix virt_addr_valid() with CONFIG_DEBUG_VIRTUAL=y, v2 2008-10-13 10:33:15 +02:00
ds.c x86, ds, bts: cleanup/fix DS configuration 2009-01-22 14:35:00 +01:00
dumpstack_32.c ftrace: print real return in dumpstack for function graph 2008-12-03 08:56:25 +01:00
dumpstack_64.c ftrace: print real return in dumpstack for function graph 2008-12-03 08:56:25 +01:00
dumpstack.c ftrace: print real return in dumpstack for function graph 2008-12-03 08:56:25 +01:00
dumpstack.h ftrace: print real return in dumpstack for function graph 2008-12-03 08:56:25 +01:00
e820.c Merge branch 'linus' into release 2009-01-09 03:39:43 -05:00
early_printk.c x86: early_printk - use sizeof instead of hardcoded number 2009-01-02 10:27:46 +01:00
early-quirks.c x86: only scan the root bus in early PCI quirks 2009-01-09 12:46:22 -08:00
efi_32.c
efi_64.c
efi_stub_32.S
efi_stub_64.S
efi.c x86: Add UV EFI table entry v4 2008-10-16 16:53:13 +02:00
entry_32.S Revert "i386: add TRACE_IRQS_OFF for the nmi" 2009-01-12 19:36:59 +01:00
entry_64.S x86: push old stack address on irqstack for unwinder 2009-02-02 21:18:03 -08:00
es7000_32.c Merge branch 'linus' into x86/quirks 2008-12-08 15:07:49 +01:00
ftrace.c tracing/function-graph-tracer: append the tracing_graph_flag 2008-12-08 15:11:45 +01:00
genapic_64.c x86: fix wakeup_cpu with numaq/es7000, v2, fix 2008-11-18 00:27:24 +01:00
genapic_flat_64.c x86: fix cpu_mask_to_apicid_and to include cpu_online_mask 2008-12-18 11:59:24 +01:00
genx2apic_cluster.c x86: use logical apicid in x2apic_cluster's x2apic_cpu_mask_to_apicid_and() 2008-12-23 22:37:30 +01:00
genx2apic_phys.c Merge branch 'linus' into x86/cleanups 2009-01-02 22:41:36 +01:00
genx2apic_uv_x.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpumask into merge-rr-cpumask 2009-01-03 18:53:31 +01:00
geode_32.c
head32.c x86: change static allocation of trampoline area 2008-12-08 13:49:45 +01:00
head64.c x86: fix incorrect __read_mostly on _boot_cpu_pda 2009-01-02 17:16:29 +01:00
head_32.S x86, cpa: rename PTE attribute macros for kernel direct mapping in early boot 2008-10-10 19:29:11 +02:00
head_64.S x86: fix RIP printout in early_idt_handler 2009-01-04 10:20:29 +01:00
head.c x86, debug: remove EBDA debug printk 2008-12-12 11:08:42 +01:00
hpet.c x86, hpet: fix for LS21 + HPET = boot hang 2009-02-13 09:15:46 +01:00
i386_ksyms_32.c ftrace: rename FTRACE to FUNCTION_TRACER 2008-10-20 18:27:03 +02:00
i387.c x86: fix __cpuinit/__init tangle in init_thread_xstate() 2008-11-20 16:43:41 +01:00
i8237.c i8327: fix outb() parameter order 2009-02-10 13:13:23 +01:00
i8253.c cpumask: convert struct clock_event_device to cpumask pointers. 2008-12-13 21:20:26 +10:30
i8259.c x86: i8259.c fix style problems 2009-01-04 18:19:37 +01:00
init_task.c take init_fs to saner place 2008-12-31 18:07:42 -05:00
io_apic.c x86: find nr_irqs_gsi with mp_ioapic_routing 2009-02-09 12:42:59 +01:00
io_delay.c x86: add io delay quirk for Presario F700 2008-09-03 16:42:51 -07:00
ioport.c x86: ioport.c fix style problems 2009-01-04 13:23:07 +01:00
ipi.c x86: cosmetic changes apic-related files. 2008-12-16 17:40:57 -08:00
irq_32.c x86: irq_32.c fix style problems 2009-01-04 18:19:37 +01:00
irq_64.c x86: irq_64.c fix style problems 2009-01-04 13:23:04 +01:00
irq.c x86: irq.c fix style problems 2009-01-04 13:23:04 +01:00
irqinit_32.c x86/Voyager: make it build and boot 2009-01-31 18:26:07 +01:00
irqinit_64.c x86: irqinit_64.c init_ISA_irqs should be static 2009-01-04 18:19:41 +01:00
k8.c x86, gart: fix gart detection for Fam11h CPUs 2008-10-28 17:10:27 +01:00
kdebugfs.c arch/x86/kernel/kdebugfs.c: introduce missing kfree 2008-09-10 14:03:49 +02:00
kgdb.c kgdb, x86: Avoid invoking kgdb_nmicallback twice per NMI 2008-10-06 13:50:59 -05:00
kprobes.c kprobes: check CONFIG_FREEZER instead of CONFIG_PM 2009-01-16 14:32:17 -05:00
kvm.c
kvmclock.c x86: KVM guest: kvm_get_tsc_khz: return khz, not lpj 2008-12-31 16:55:44 +02:00
ldt.c x86: ldt.c fix style problems 2009-01-02 17:46:24 +01:00
machine_kexec_32.c kexec/i386: setup kexec page table in C 2008-10-31 10:01:57 +01:00
machine_kexec_64.c
Makefile Merge branch 'core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-30 16:10:19 -08:00
mca_32.c
mfgpt_32.c trivial: fix then -> than typos in comments and documentation 2009-01-06 11:28:06 +01:00
microcode_amd.c x86: fix warning in arch/x86/kernel/microcode_amd.c 2008-12-19 01:31:54 +01:00
microcode_core.c Merge branches 'x86/apic', 'x86/cleanups', 'x86/cpufeature', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/detect-hyper', 'x86/doc', 'x86/dumpstack', 'x86/early-printk', 'x86/fpu', 'x86/idle', 'x86/io', 'x86/memory-corruption-check', 'x86/microcode', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/pat2', 'x86/pci-ioapic-boot-irq-quirks', 'x86/ptrace', 'x86/quirks', 'x86/reboot', 'x86/setup-memory', 'x86/signal', 'x86/sparse-fixes', 'x86/time', 'x86/uv' and 'x86/xen' into x86/core 2008-12-23 16:27:23 +01:00
microcode_intel.c Merge branches 'x86/apic', 'x86/cleanups', 'x86/cpufeature', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/detect-hyper', 'x86/doc', 'x86/dumpstack', 'x86/early-printk', 'x86/fpu', 'x86/idle', 'x86/io', 'x86/memory-corruption-check', 'x86/microcode', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/pat2', 'x86/pci-ioapic-boot-irq-quirks', 'x86/ptrace', 'x86/quirks', 'x86/reboot', 'x86/setup-memory', 'x86/signal', 'x86/sparse-fixes', 'x86/time', 'x86/uv' and 'x86/xen' into x86/core 2008-12-23 16:27:23 +01:00
mmconf-fam10h_64.c x86, pci: move arch/x86/pci/pci.h to arch/x86/include/asm/pci_x86.h 2008-12-29 18:17:36 +01:00
module_32.c
module_64.c
mpparse.c x86: fix mpparse.c build error on latest git 2009-01-12 19:24:22 +01:00
msr.c x86: cleanup some remaining usages of NR_CPUS where s/b nr_cpu_ids 2009-01-03 19:00:55 +01:00
nmi.c x86: remove duplicated #include's 2009-01-06 13:34:03 +01:00
numaq_32.c x86: rename all fields of mpc_oemtable oem_X to X 2009-01-05 14:08:34 +01:00
olpc.c x86, olpc: fix model detection without OFW 2009-02-14 23:05:25 +01:00
paravirt_patch_32.c
paravirt_patch_64.c
paravirt-spinlocks.c x86: fix default_spin_lock_flags() prototype 2008-12-08 16:08:29 +01:00
paravirt.c x86: warn if arch_flush_lazy_mmu_cpu is called in preemptible context 2009-02-12 23:11:58 +01:00
pci-calgary_64.c arch/x86/kernel/pci-calgary_64.c: change simple_strtol to simple_strtoul 2008-11-25 15:56:03 +01:00
pci-dma.c PCI: struct device - replace bus_id with dev_name(), dev_set_name() 2009-01-07 11:12:23 -08:00
pci-gart_64.c Documentation: move DMA-mapping.txt to Doc/PCI/ 2009-01-29 18:19:29 -08:00
pci-nommu.c x86: export pci-nommu's alloc_coherent 2008-09-25 11:02:25 +02:00
pci-swiotlb_64.c Merge branch 'core/iommu' into core/urgent 2009-01-05 14:17:24 +01:00
pcspeaker.c x86: use platform_device_register_simple() 2008-09-22 12:58:36 +02:00
pmtimer_64.c
probe_roms_32.c
process_32.c x86, rcu: fix strange load average and ksoftirqd behavior 2009-02-17 22:47:45 +01:00
process_64.c x86, 64-bit: print DMI info in the oops trace 2009-02-04 22:10:12 +01:00
process.c x86: add clflush before monitor for Intel 7400 series 2009-02-09 11:15:15 +01:00
ptrace.c x86, ptrace, mm: fix double-free on race 2009-02-11 15:44:20 +01:00
pvclock.c x86: pvclock: fix shadowed variable warning 2008-10-15 14:25:14 +02:00
quirks.c x86: enable HPET on Fujitsu u9200 2008-12-16 20:36:44 +01:00
reboot_fixups_32.c
reboot.c Merge branch 'cpus4096-for-linus-3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-03 12:04:39 -08:00
relocate_kernel_32.S kexec/i386: setup kexec page table in C 2008-10-31 10:01:57 +01:00
relocate_kernel_64.S
rtc.c rtc: use bcd2bin/bin2bcd 2008-10-20 08:52:41 -07:00
scx200_32.c
setup_percpu.c x86: fix section mismatch warnings in kernel/setup_percpu.c 2009-01-18 23:59:22 +01:00
setup.c x86: fix grammar in user-visible BIOS warning 2009-02-05 01:14:38 +01:00
signal.c Revert "x86: signal: change type of paramter for sys_rt_sigreturn()" 2009-01-21 09:43:18 +01:00
smp.c Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-10 06:13:09 -08:00
smpboot.c Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-10 06:13:09 -08:00
smpcommon.c
stacktrace.c tracing/stack-tracer: fix style issues 2008-11-23 11:53:48 +01:00
step.c
summit_32.c
sys_i386_32.c
sys_x86_64.c Merge branches 'x86/alternatives', 'x86/cleanups', 'x86/commandline', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/doc', 'x86/exports', 'x86/fpu', 'x86/gart', 'x86/idle', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/oprofile', 'x86/paravirt', 'x86/reboot', 'x86/sparse-fixes', 'x86/tsc', 'x86/urgent' and 'x86/vmalloc' into x86-v28-for-linus-phase1 2008-10-06 18:17:07 +02:00
syscall_64.c x86: Fix ASM_X86__ header guards 2008-10-22 22:55:23 -07:00
syscall_table_32.S [CVE-2009-0029] Rename old_readdir to sys_old_readdir 2009-01-14 14:15:15 +01:00
tce_64.c
test_nx.c
test_rodata.c
time_32.c x86: time_32.c fix style problems 2009-01-04 13:23:05 +01:00
time_64.c x86: time_64.c fix style problems 2009-01-04 13:23:05 +01:00
tlb_32.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpumask into merge-rr-cpumask 2009-01-03 18:53:31 +01:00
tlb_64.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpumask into merge-rr-cpumask 2009-01-03 18:53:31 +01:00
tlb_uv.c x86, UV: cpu_relax in uv_wait_completion 2009-01-15 23:48:20 +01:00
tls.c
tls.h
topology.c
trampoline_32.S
trampoline_64.S
trampoline.c x86: change static allocation of trampoline area 2008-12-08 13:49:45 +01:00
traps.c x86, vm86: fix preemption bug 2009-02-15 10:46:13 +01:00
tsc_sync.c Merge branches 'x86/apic', 'x86/cleanups', 'x86/cpufeature', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/detect-hyper', 'x86/doc', 'x86/dumpstack', 'x86/early-printk', 'x86/fpu', 'x86/idle', 'x86/io', 'x86/memory-corruption-check', 'x86/microcode', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/pat2', 'x86/pci-ioapic-boot-irq-quirks', 'x86/ptrace', 'x86/quirks', 'x86/reboot', 'x86/setup-memory', 'x86/signal', 'x86/sparse-fixes', 'x86/time', 'x86/uv' and 'x86/xen' into x86/core 2008-12-23 16:27:23 +01:00
tsc.c Merge branches 'x86/apic', 'x86/cleanups', 'x86/cpufeature', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/detect-hyper', 'x86/doc', 'x86/dumpstack', 'x86/early-printk', 'x86/fpu', 'x86/idle', 'x86/io', 'x86/memory-corruption-check', 'x86/microcode', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/pat2', 'x86/pci-ioapic-boot-irq-quirks', 'x86/ptrace', 'x86/quirks', 'x86/reboot', 'x86/setup-memory', 'x86/signal', 'x86/sparse-fixes', 'x86/time', 'x86/uv' and 'x86/xen' into x86/core 2008-12-23 16:27:23 +01:00
uv_irq.c x86, UV: add uv_setup_irq() and uv_teardown_irq() functions, v3, fix 2008-10-16 16:53:13 +02:00
uv_sysfs.c x86: Add sysfs entries for UV v4 2008-10-16 16:53:13 +02:00
verify_cpu_64.S
visws_quirks.c x86: rename all fields of mpc_cpu mpc_X to X 2009-01-05 14:08:33 +01:00
vm86_32.c
vmi_32.c x86, vmi: put a missing paravirt_release_pmd in pgd_dtor 2009-02-09 13:10:13 +01:00
vmiclock_32.c cpumask: convert struct clock_event_device to cpumask pointers. 2008-12-13 21:20:26 +10:30
vmlinux_32.lds.S tracing/function-graph-tracer: add a new .irqentry.text section, fix 2008-12-12 12:14:05 +01:00
vmlinux_64.lds.S tracing/function-graph-tracer: add a new .irqentry.text section 2008-12-12 11:14:07 +01:00
vmlinux.lds.S
vsmp_64.c x86: two trivial sparse annotations 2008-10-29 08:02:28 +01:00
vsyscall_64.c Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-12-28 12:21:10 -08:00
x8664_ksyms_64.c ftrace: rename FTRACE to FUNCTION_TRACER 2008-10-20 18:27:03 +02:00
xsave.c x86: xsave.c: restore_user_xstate should be static 2008-12-30 13:31:41 -08:00