Commit 8542b200cbe5609edd7aae0c304c091a1c290452
Committed by
Andi Kleen
1 parent
8ecb895069
Exists in
master
and in
20 other branches
[PATCH] paravirt: Add option to allow skipping the timer check
Add a way to disable the timer IRQ routing check via a boot option. The VMI timer code uses this to avoid triggering the pester Mingo code, which probes for some very unusual and broken motherboard routings. It fires 100% of the time when using a paravirtual delay mechanism instead of using a realtime delay, since there is no elapsed real time, and the 4 timer IRQs have not yet been delivered. In addition, it is entirely possible, though improbable, that this bug could surface on real hardware which picks a particularly bad time to enter SMM mode, causing a long latency during one of the timer IRQs. While here, make check_timer be __init. Signed-off-by: Zachary Amsden <zach@vmware.com> Signed-off-by: Andi Kleen <ak@suse.de> [chrisw: use no_timer_check to bring inline with x86_64 as per Andi's request] Signed-off-by: Chris Wright <chrisw@sous-sol.org> Cc: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org>
Showing 2 changed files with 19 additions and 4 deletions Side-by-side Diff
Documentation/kernel-parameters.txt
... | ... | @@ -599,8 +599,6 @@ |
599 | 599 | |
600 | 600 | hugepages= [HW,IA-32,IA-64] Maximal number of HugeTLB pages. |
601 | 601 | |
602 | - noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing | |
603 | - | |
604 | 602 | i8042.direct [HW] Put keyboard port into non-translated mode |
605 | 603 | i8042.dumbkbd [HW] Pretend that controller can only read data from |
606 | 604 | keyboard and cannot control its state |
607 | 605 | |
... | ... | @@ -1052,8 +1050,13 @@ |
1052 | 1050 | in certain environments such as networked servers or |
1053 | 1051 | real-time systems. |
1054 | 1052 | |
1053 | + noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing | |
1054 | + | |
1055 | 1055 | noirqdebug [IA-32] Disables the code which attempts to detect and |
1056 | 1056 | disable unhandled interrupt sources. |
1057 | + | |
1058 | + no_timer_check [IA-32,X86_64,APIC] Disables the code which tests for | |
1059 | + broken timer IRQ sources. | |
1057 | 1060 | |
1058 | 1061 | noisapnp [ISAPNP] Disables ISA PnP code. |
1059 | 1062 |
arch/i386/kernel/io_apic.c
... | ... | @@ -1932,6 +1932,15 @@ |
1932 | 1932 | static void __init setup_ioapic_ids_from_mpc(void) { } |
1933 | 1933 | #endif |
1934 | 1934 | |
1935 | +static int no_timer_check __initdata; | |
1936 | + | |
1937 | +static int __init notimercheck(char *s) | |
1938 | +{ | |
1939 | + no_timer_check = 1; | |
1940 | + return 1; | |
1941 | +} | |
1942 | +__setup("no_timer_check", notimercheck); | |
1943 | + | |
1935 | 1944 | /* |
1936 | 1945 | * There is a nasty bug in some older SMP boards, their mptable lies |
1937 | 1946 | * about the timer IRQ. We do the following to work around the situation: |
1938 | 1947 | |
... | ... | @@ -1940,10 +1949,13 @@ |
1940 | 1949 | * - if this function detects that timer IRQs are defunct, then we fall |
1941 | 1950 | * back to ISA timer IRQs |
1942 | 1951 | */ |
1943 | -static int __init timer_irq_works(void) | |
1952 | +int __init timer_irq_works(void) | |
1944 | 1953 | { |
1945 | 1954 | unsigned long t1 = jiffies; |
1946 | 1955 | |
1956 | + if (no_timer_check) | |
1957 | + return 1; | |
1958 | + | |
1947 | 1959 | local_irq_enable(); |
1948 | 1960 | /* Let ten ticks pass... */ |
1949 | 1961 | mdelay((10 * 1000) / HZ); |
... | ... | @@ -2214,7 +2226,7 @@ |
2214 | 2226 | * is so screwy. Thanks to Brian Perkins for testing/hacking this beast |
2215 | 2227 | * fanatically on his truly buggy board. |
2216 | 2228 | */ |
2217 | -static inline void check_timer(void) | |
2229 | +static inline void __init check_timer(void) | |
2218 | 2230 | { |
2219 | 2231 | int apic1, pin1, apic2, pin2; |
2220 | 2232 | int vector; |