[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Manual merge.
ChangeSet 1.1362, 2005/03/24 17:27:22+00:00, kaf24@xxxxxxxxxxxxxxxxxxxx Manual merge. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> time.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 76 insertions(+), 6 deletions(-) diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c --- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c 2005-03-24 13:02:55 -05:00 +++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c 2005-03-24 13:02:55 -05:00 @@ -47,6 +47,7 @@ #include <linux/efi.h> #include <linux/mca.h> #include <linux/sysctl.h> +#include <linux/percpu.h> #include <asm/io.h> #include <asm/smp.h> @@ -94,7 +95,6 @@ u64 shadow_system_time; static u32 shadow_time_version; static struct timeval shadow_tv; -extern u64 processed_system_time; /* * We use this to ensure that gettimeofday() is monotonically increasing. We @@ -112,6 +112,7 @@ /* Keep track of last time we did processing/updating of jiffies and xtime. */ u64 processed_system_time; /* System time (ns) at last processing. */ +DEFINE_PER_CPU(u64, processed_system_time); #define NS_PER_TICK (1000000000ULL/HZ) @@ -404,11 +405,9 @@ delta -= NS_PER_TICK; processed_system_time += NS_PER_TICK; do_timer(regs); -#ifndef CONFIG_SMP update_process_times(user_mode(regs)); -#endif if (regs) - profile_tick(CPU_PROFILING, regs); + profile_tick(CPU_PROFILING, regs); } /* @@ -674,18 +673,28 @@ u64 alarm = 0; int ret = 0; unsigned long j; +#ifdef CONFIG_SMP + unsigned long seq; +#endif /* * This is safe against long blocking (since calculations are * not based on TSC deltas). It is also safe against warped * system time since suspend-resume is cooperative and we - * would first get locked out. It is safe against normal - * updates of jiffies since interrupts are off. + * would first get locked out. */ +#ifdef CONFIG_SMP + do { + seq = read_seqbegin(&xtime_lock); + j = jiffies + 1; + alarm = __jiffies_to_st(j); + } while (read_seqretry(&xtime_lock, seq)); +#else j = next_timer_interrupt(); if (j < (jiffies + 1)) j = jiffies + 1; alarm = __jiffies_to_st(j); +#endif /* Failure is pretty bad, but we'd best soldier on. */ if ( HYPERVISOR_set_timer_op(alarm) != 0 ) @@ -717,6 +726,67 @@ /* Make sure we resync UTC time with Xen on next timer interrupt. */ last_update_from_xen = 0; } + +#ifdef CONFIG_SMP + +static irqreturn_t local_timer_interrupt(int irq, void *dev_id, + struct pt_regs *regs) +{ + s64 delta; + int cpu = smp_processor_id(); + + do { + __get_time_values_from_xen(); + + delta = (s64)(shadow_system_time + + ((s64)cur_timer->get_offset() * + (s64)NSEC_PER_USEC) - + per_cpu(processed_system_time, cpu)); + } + while (!TIME_VALUES_UP_TO_DATE); + + if (unlikely(delta < 0)) { + printk("Timer ISR/%d: Time went backwards: %lld %lld %lld %lld\n", + cpu, delta, shadow_system_time, + ((s64)cur_timer->get_offset() * (s64)NSEC_PER_USEC), + processed_system_time); + return IRQ_HANDLED; + } + + /* Process elapsed jiffies since last call. */ + while (delta >= NS_PER_TICK) { + delta -= NS_PER_TICK; + per_cpu(processed_system_time, cpu) += NS_PER_TICK; + if (regs) + update_process_times(user_mode(regs)); +#if 0 + if (regs) + profile_tick(CPU_PROFILING, regs); +#endif + } + + return IRQ_HANDLED; +} + +static struct irqaction local_irq_timer = { + local_timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "ltimer", + NULL, NULL +}; + +void local_setup_timer(void) +{ + int seq, time_irq; + int cpu = smp_processor_id(); + + do { + seq = read_seqbegin(&xtime_lock); + per_cpu(processed_system_time, cpu) = shadow_system_time; + } while (read_seqretry(&xtime_lock, seq)); + + time_irq = bind_virq_to_irq(VIRQ_TIMER); + (void)setup_irq(time_irq, &local_irq_timer); +} +#endif /* * /proc/sys/xen: This really belongs in another file. It can stay here for ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |