[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.