diff options
author | Zachary Amsden <zach@vmware.com> | 2007-05-02 13:27:16 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:16 -0400 |
commit | e0bb8643974397a8d36670e06e6a54bb84f3289f (patch) | |
tree | 196c6929fb8ccfe839f044a73be2f9861a88f175 /arch/i386/kernel/vmi.c | |
parent | eeef9c68aae2f4f21ab810d0339e0f22d30b0cd8 (diff) |
[PATCH] i386: Convert VMI timer to use clock events
Convert VMI timer to use clock events, making it properly able to use the NO_HZ
infrastructure. On UP systems, with no local APIC, we just continue to route
these events through the PIT. On systems with a local APIC, or SMP, we provide
a single source interrupt chip which creates the local timer IRQ. It actually
gets delivered by the APIC hardware, but we don't want to use the same local
APIC clocksource processing, so we create our own handler here.
Signed-off-by: Zachary Amsden <zach@vmware.com>
Signed-off-by: Andi Kleen <ak@suse.de>
CC: Dan Hecht <dhecht@vmware.com>
CC: Ingo Molnar <mingo@elte.hu>
CC: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/i386/kernel/vmi.c')
-rw-r--r-- | arch/i386/kernel/vmi.c | 26 |
1 files changed, 6 insertions, 20 deletions
diff --git a/arch/i386/kernel/vmi.c b/arch/i386/kernel/vmi.c index 0df0b2cd3617..0fae15dee765 100644 --- a/arch/i386/kernel/vmi.c +++ b/arch/i386/kernel/vmi.c | |||
@@ -77,6 +77,9 @@ static struct { | |||
77 | extern struct paravirt_patch __start_parainstructions[], | 77 | extern struct paravirt_patch __start_parainstructions[], |
78 | __stop_parainstructions[]; | 78 | __stop_parainstructions[]; |
79 | 79 | ||
80 | /* Cached VMI operations */ | ||
81 | struct vmi_timer_ops vmi_timer_ops; | ||
82 | |||
80 | /* | 83 | /* |
81 | * VMI patching routines. | 84 | * VMI patching routines. |
82 | */ | 85 | */ |
@@ -235,18 +238,6 @@ static void vmi_nop(void) | |||
235 | { | 238 | { |
236 | } | 239 | } |
237 | 240 | ||
238 | /* For NO_IDLE_HZ, we stop the clock when halting the kernel */ | ||
239 | static fastcall void vmi_safe_halt(void) | ||
240 | { | ||
241 | int idle = vmi_stop_hz_timer(); | ||
242 | vmi_ops.halt(); | ||
243 | if (idle) { | ||
244 | local_irq_disable(); | ||
245 | vmi_account_time_restart_hz_timer(); | ||
246 | local_irq_enable(); | ||
247 | } | ||
248 | } | ||
249 | |||
250 | #ifdef CONFIG_DEBUG_PAGE_TYPE | 241 | #ifdef CONFIG_DEBUG_PAGE_TYPE |
251 | 242 | ||
252 | #ifdef CONFIG_X86_PAE | 243 | #ifdef CONFIG_X86_PAE |
@@ -722,7 +713,6 @@ do { \ | |||
722 | } \ | 713 | } \ |
723 | } while (0) | 714 | } while (0) |
724 | 715 | ||
725 | |||
726 | /* | 716 | /* |
727 | * Activate the VMI interface and switch into paravirtualized mode | 717 | * Activate the VMI interface and switch into paravirtualized mode |
728 | */ | 718 | */ |
@@ -901,8 +891,8 @@ static inline int __init activate_vmi(void) | |||
901 | paravirt_ops.get_wallclock = vmi_get_wallclock; | 891 | paravirt_ops.get_wallclock = vmi_get_wallclock; |
902 | paravirt_ops.set_wallclock = vmi_set_wallclock; | 892 | paravirt_ops.set_wallclock = vmi_set_wallclock; |
903 | #ifdef CONFIG_X86_LOCAL_APIC | 893 | #ifdef CONFIG_X86_LOCAL_APIC |
904 | paravirt_ops.setup_boot_clock = vmi_timer_setup_boot_alarm; | 894 | paravirt_ops.setup_boot_clock = vmi_time_bsp_init; |
905 | paravirt_ops.setup_secondary_clock = vmi_timer_setup_secondary_alarm; | 895 | paravirt_ops.setup_secondary_clock = vmi_time_ap_init; |
906 | #endif | 896 | #endif |
907 | paravirt_ops.get_scheduled_cycles = vmi_get_sched_cycles; | 897 | paravirt_ops.get_scheduled_cycles = vmi_get_sched_cycles; |
908 | paravirt_ops.get_cpu_khz = vmi_cpu_khz; | 898 | paravirt_ops.get_cpu_khz = vmi_cpu_khz; |
@@ -914,11 +904,7 @@ static inline int __init activate_vmi(void) | |||
914 | disable_vmi_timer = 1; | 904 | disable_vmi_timer = 1; |
915 | } | 905 | } |
916 | 906 | ||
917 | /* No idle HZ mode only works if VMI timer and no idle is enabled */ | 907 | para_fill(safe_halt, Halt); |
918 | if (disable_noidle || disable_vmi_timer) | ||
919 | para_fill(safe_halt, Halt); | ||
920 | else | ||
921 | para_wrap(safe_halt, vmi_safe_halt, halt, Halt); | ||
922 | 908 | ||
923 | /* | 909 | /* |
924 | * Alternative instruction rewriting doesn't happen soon enough | 910 | * Alternative instruction rewriting doesn't happen soon enough |