aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Amsden <zach@vmware.com>2007-03-05 03:30:38 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-05 10:57:52 -0500
commiteda08b1befaabcdfea1a9216ae13f9065e69baa7 (patch)
treed70d13c90e540357962ae5d15a7aecc5c8b0f3fa
parent9a1c13e91f100c12dcad3a1be1b12890bf32f6ff (diff)
[PATCH] vmi: paravirt drop udelay op
Not respecting udelay causes problems with any virtual hardware that is passed through to real hardware. This can be noticed by any device that interacts with the real world in real time - like AP startup, which takes real time. Or keyboard LEDs, which should blink in real-time. Or floppy drives, but only when passed through to a real floppy controller on OSes which can't sufficiently buffer the floppy commands to emulate a zero latency floppy. Or IDE drives, when connecting to a physical CDROM. This was mostly a hack to get the kernel to boot faster, but it introduced a number of misvirtualization bugs, and Alan and Pavel argued pretty strongly against it. We were the only client, and now want to clean up this cruft. Signed-off-by: Zachary Amsden <zach@vmware.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/i386/kernel/paravirt.c1
-rw-r--r--arch/i386/kernel/smpboot.c5
-rw-r--r--arch/i386/kernel/vmi.c8
-rw-r--r--include/asm-i386/delay.h8
-rw-r--r--include/asm-i386/paravirt.h1
5 files changed, 1 insertions, 22 deletions
diff --git a/arch/i386/kernel/paravirt.c b/arch/i386/kernel/paravirt.c
index 12e3bc49b83b..871448db1425 100644
--- a/arch/i386/kernel/paravirt.c
+++ b/arch/i386/kernel/paravirt.c
@@ -538,7 +538,6 @@ struct paravirt_ops paravirt_ops = {
538 538
539 .set_iopl_mask = native_set_iopl_mask, 539 .set_iopl_mask = native_set_iopl_mask,
540 .io_delay = native_io_delay, 540 .io_delay = native_io_delay,
541 .const_udelay = __const_udelay,
542 541
543#ifdef CONFIG_X86_LOCAL_APIC 542#ifdef CONFIG_X86_LOCAL_APIC
544 .apic_write = native_apic_write, 543 .apic_write = native_apic_write,
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
index 48bfcaa13ecc..9b0dd2744c82 100644
--- a/arch/i386/kernel/smpboot.c
+++ b/arch/i386/kernel/smpboot.c
@@ -33,11 +33,6 @@
33 * Dave Jones : Report invalid combinations of Athlon CPUs. 33 * Dave Jones : Report invalid combinations of Athlon CPUs.
34* Rusty Russell : Hacked into shape for new "hotplug" boot process. */ 34* Rusty Russell : Hacked into shape for new "hotplug" boot process. */
35 35
36
37/* SMP boot always wants to use real time delay to allow sufficient time for
38 * the APs to come online */
39#define USE_REAL_TIME_DELAY
40
41#include <linux/module.h> 36#include <linux/module.h>
42#include <linux/init.h> 37#include <linux/init.h>
43#include <linux/kernel.h> 38#include <linux/kernel.h>
diff --git a/arch/i386/kernel/vmi.c b/arch/i386/kernel/vmi.c
index bd1037bd124b..a8aa57e77029 100644
--- a/arch/i386/kernel/vmi.c
+++ b/arch/i386/kernel/vmi.c
@@ -48,7 +48,6 @@ typedef u64 __attribute__((regparm(2))) (VROMLONGFUNC)(int);
48 48
49static struct vrom_header *vmi_rom; 49static struct vrom_header *vmi_rom;
50static int license_gplok; 50static int license_gplok;
51static int disable_nodelay;
52static int disable_pge; 51static int disable_pge;
53static int disable_pse; 52static int disable_pse;
54static int disable_sep; 53static int disable_sep;
@@ -801,9 +800,6 @@ static inline int __init activate_vmi(void)
801 800
802 para_fill(set_iopl_mask, SetIOPLMask); 801 para_fill(set_iopl_mask, SetIOPLMask);
803 paravirt_ops.io_delay = (void *)vmi_nop; 802 paravirt_ops.io_delay = (void *)vmi_nop;
804 if (!disable_nodelay) {
805 paravirt_ops.const_udelay = (void *)vmi_nop;
806 }
807 803
808 para_fill(set_lazy_mode, SetLazyMode); 804 para_fill(set_lazy_mode, SetLazyMode);
809 805
@@ -947,9 +943,7 @@ static int __init parse_vmi(char *arg)
947 if (!arg) 943 if (!arg)
948 return -EINVAL; 944 return -EINVAL;
949 945
950 if (!strcmp(arg, "disable_nodelay")) 946 if (!strcmp(arg, "disable_pge")) {
951 disable_nodelay = 1;
952 else if (!strcmp(arg, "disable_pge")) {
953 clear_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability); 947 clear_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability);
954 disable_pge = 1; 948 disable_pge = 1;
955 } else if (!strcmp(arg, "disable_pse")) { 949 } else if (!strcmp(arg, "disable_pse")) {
diff --git a/include/asm-i386/delay.h b/include/asm-i386/delay.h
index 32d6678d0bbf..9ae5e3782ed8 100644
--- a/include/asm-i386/delay.h
+++ b/include/asm-i386/delay.h
@@ -16,13 +16,6 @@ extern void __ndelay(unsigned long nsecs);
16extern void __const_udelay(unsigned long usecs); 16extern void __const_udelay(unsigned long usecs);
17extern void __delay(unsigned long loops); 17extern void __delay(unsigned long loops);
18 18
19#if defined(CONFIG_PARAVIRT) && !defined(USE_REAL_TIME_DELAY)
20#define udelay(n) paravirt_ops.const_udelay((n) * 0x10c7ul)
21
22#define ndelay(n) paravirt_ops.const_udelay((n) * 5ul)
23
24#else /* !PARAVIRT || USE_REAL_TIME_DELAY */
25
26/* 0x10c7 is 2**32 / 1000000 (rounded up) */ 19/* 0x10c7 is 2**32 / 1000000 (rounded up) */
27#define udelay(n) (__builtin_constant_p(n) ? \ 20#define udelay(n) (__builtin_constant_p(n) ? \
28 ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \ 21 ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \
@@ -32,7 +25,6 @@ extern void __delay(unsigned long loops);
32#define ndelay(n) (__builtin_constant_p(n) ? \ 25#define ndelay(n) (__builtin_constant_p(n) ? \
33 ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ 26 ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \
34 __ndelay(n)) 27 __ndelay(n))
35#endif
36 28
37void use_tsc_delay(void); 29void use_tsc_delay(void);
38 30
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h
index e01d895d7379..1e4226a85263 100644
--- a/include/asm-i386/paravirt.h
+++ b/include/asm-i386/paravirt.h
@@ -117,7 +117,6 @@ struct paravirt_ops
117 void (*set_iopl_mask)(unsigned mask); 117 void (*set_iopl_mask)(unsigned mask);
118 118
119 void (*io_delay)(void); 119 void (*io_delay)(void);
120 void (*const_udelay)(unsigned long loops);
121 120
122#ifdef CONFIG_X86_LOCAL_APIC 121#ifdef CONFIG_X86_LOCAL_APIC
123 void (*apic_write)(unsigned long reg, unsigned long v); 122 void (*apic_write)(unsigned long reg, unsigned long v);