WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[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

<Prev in Thread] Current Thread [Next in Thread>