Skip to content

Commit

Permalink
[PATCH] i386: Convert VMI timer to use clock events
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Zachary Amsden authored and Andi Kleen committed May 2, 2007
1 parent eeef9c6 commit e0bb864
Show file tree
Hide file tree
Showing 6 changed files with 327 additions and 524 deletions.
2 changes: 1 addition & 1 deletion arch/i386/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
obj-$(CONFIG_HPET_TIMER) += hpet.o
obj-$(CONFIG_K8_NB) += k8.o

obj-$(CONFIG_VMI) += vmi.o vmitime.o
obj-$(CONFIG_VMI) += vmi.o vmiclock.o
obj-$(CONFIG_PARAVIRT) += paravirt.o
obj-y += pcspeaker.o

Expand Down
5 changes: 0 additions & 5 deletions arch/i386/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -637,11 +637,6 @@ ENDPROC(name)
/* The include is where all of the SMP etc. interrupts come from */
#include "entry_arch.h"

/* This alternate entry is needed because we hijack the apic LVTT */
#if defined(CONFIG_VMI) && defined(CONFIG_X86_LOCAL_APIC)
BUILD_INTERRUPT(apic_vmi_timer_interrupt,LOCAL_TIMER_VECTOR)
#endif

KPROBE_ENTRY(page_fault)
RING0_EC_FRAME
pushl $do_page_fault
Expand Down
26 changes: 6 additions & 20 deletions arch/i386/kernel/vmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ static struct {
extern struct paravirt_patch __start_parainstructions[],
__stop_parainstructions[];

/* Cached VMI operations */
struct vmi_timer_ops vmi_timer_ops;

/*
* VMI patching routines.
*/
Expand Down Expand Up @@ -235,18 +238,6 @@ static void vmi_nop(void)
{
}

/* For NO_IDLE_HZ, we stop the clock when halting the kernel */
static fastcall void vmi_safe_halt(void)
{
int idle = vmi_stop_hz_timer();
vmi_ops.halt();
if (idle) {
local_irq_disable();
vmi_account_time_restart_hz_timer();
local_irq_enable();
}
}

#ifdef CONFIG_DEBUG_PAGE_TYPE

#ifdef CONFIG_X86_PAE
Expand Down Expand Up @@ -722,7 +713,6 @@ do { \
} \
} while (0)


/*
* Activate the VMI interface and switch into paravirtualized mode
*/
Expand Down Expand Up @@ -901,8 +891,8 @@ static inline int __init activate_vmi(void)
paravirt_ops.get_wallclock = vmi_get_wallclock;
paravirt_ops.set_wallclock = vmi_set_wallclock;
#ifdef CONFIG_X86_LOCAL_APIC
paravirt_ops.setup_boot_clock = vmi_timer_setup_boot_alarm;
paravirt_ops.setup_secondary_clock = vmi_timer_setup_secondary_alarm;
paravirt_ops.setup_boot_clock = vmi_time_bsp_init;
paravirt_ops.setup_secondary_clock = vmi_time_ap_init;
#endif
paravirt_ops.get_scheduled_cycles = vmi_get_sched_cycles;
paravirt_ops.get_cpu_khz = vmi_cpu_khz;
Expand All @@ -914,11 +904,7 @@ static inline int __init activate_vmi(void)
disable_vmi_timer = 1;
}

/* No idle HZ mode only works if VMI timer and no idle is enabled */
if (disable_noidle || disable_vmi_timer)
para_fill(safe_halt, Halt);
else
para_wrap(safe_halt, vmi_safe_halt, halt, Halt);
para_fill(safe_halt, Halt);

/*
* Alternative instruction rewriting doesn't happen soon enough
Expand Down
Loading

0 comments on commit e0bb864

Please sign in to comment.