aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Amsden <zach@vmware.com>2006-12-06 20:14:09 -0500
committerAndi Kleen <andi@basil.nowhere.org>2006-12-06 20:14:09 -0500
commit8542b200cbe5609edd7aae0c304c091a1c290452 (patch)
tree7b8a51fa34639c0e7a73a12c9cc2360b8c6d2efc
parent8ecb8950695e907ed25acffec9e98c6806e311c8 (diff)
[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>
-rw-r--r--Documentation/kernel-parameters.txt7
-rw-r--r--arch/i386/kernel/io_apic.c16
2 files changed, 19 insertions, 4 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 2e1898e4e8fd..4e90aa427aea 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -599,8 +599,6 @@ and is between 256 and 4096 characters. It is defined in the file
599 599
600 hugepages= [HW,IA-32,IA-64] Maximal number of HugeTLB pages. 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 i8042.direct [HW] Put keyboard port into non-translated mode 602 i8042.direct [HW] Put keyboard port into non-translated mode
605 i8042.dumbkbd [HW] Pretend that controller can only read data from 603 i8042.dumbkbd [HW] Pretend that controller can only read data from
606 keyboard and cannot control its state 604 keyboard and cannot control its state
@@ -1052,9 +1050,14 @@ and is between 256 and 4096 characters. It is defined in the file
1052 in certain environments such as networked servers or 1050 in certain environments such as networked servers or
1053 real-time systems. 1051 real-time systems.
1054 1052
1053 noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing
1054
1055 noirqdebug [IA-32] Disables the code which attempts to detect and 1055 noirqdebug [IA-32] Disables the code which attempts to detect and
1056 disable unhandled interrupt sources. 1056 disable unhandled interrupt sources.
1057 1057
1058 no_timer_check [IA-32,X86_64,APIC] Disables the code which tests for
1059 broken timer IRQ sources.
1060
1058 noisapnp [ISAPNP] Disables ISA PnP code. 1061 noisapnp [ISAPNP] Disables ISA PnP code.
1059 1062
1060 noinitrd [RAM] Tells the kernel not to load any configured 1063 noinitrd [RAM] Tells the kernel not to load any configured
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
index e33b7a845299..993150f206ed 100644
--- a/arch/i386/kernel/io_apic.c
+++ b/arch/i386/kernel/io_apic.c
@@ -1932,6 +1932,15 @@ static void __init setup_ioapic_ids_from_mpc(void)
1932static void __init setup_ioapic_ids_from_mpc(void) { } 1932static void __init setup_ioapic_ids_from_mpc(void) { }
1933#endif 1933#endif
1934 1934
1935static int no_timer_check __initdata;
1936
1937static 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 * There is a nasty bug in some older SMP boards, their mptable lies 1945 * There is a nasty bug in some older SMP boards, their mptable lies
1937 * about the timer IRQ. We do the following to work around the situation: 1946 * about the timer IRQ. We do the following to work around the situation:
@@ -1940,10 +1949,13 @@ static void __init setup_ioapic_ids_from_mpc(void) { }
1940 * - if this function detects that timer IRQs are defunct, then we fall 1949 * - if this function detects that timer IRQs are defunct, then we fall
1941 * back to ISA timer IRQs 1950 * back to ISA timer IRQs
1942 */ 1951 */
1943static int __init timer_irq_works(void) 1952int __init timer_irq_works(void)
1944{ 1953{
1945 unsigned long t1 = jiffies; 1954 unsigned long t1 = jiffies;
1946 1955
1956 if (no_timer_check)
1957 return 1;
1958
1947 local_irq_enable(); 1959 local_irq_enable();
1948 /* Let ten ticks pass... */ 1960 /* Let ten ticks pass... */
1949 mdelay((10 * 1000) / HZ); 1961 mdelay((10 * 1000) / HZ);
@@ -2214,7 +2226,7 @@ int timer_uses_ioapic_pin_0;
2214 * is so screwy. Thanks to Brian Perkins for testing/hacking this beast 2226 * is so screwy. Thanks to Brian Perkins for testing/hacking this beast
2215 * fanatically on his truly buggy board. 2227 * fanatically on his truly buggy board.
2216 */ 2228 */
2217static inline void check_timer(void) 2229static inline void __init check_timer(void)
2218{ 2230{
2219 int apic1, pin1, apic2, pin2; 2231 int apic1, pin1, apic2, pin2;
2220 int vector; 2232 int vector;