[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] x86 time: Ensure gettimeofday() is monotonically increasing.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1182263776 -3600
# Node ID 87bb8705768a66ceabb15a419c5f86580bffb6bf
# Parent  a413dd61e7e5e1bba11bab447184cf5e6b43513a
x86 time: Ensure gettimeofday() is monotonically increasing.
Signed-off-by: Atsushi SAKAI <sakaia@xxxxxxxxxxxxxx>
---
 arch/i386/kernel/time-xen.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+)

diff -r a413dd61e7e5 -r 87bb8705768a arch/i386/kernel/time-xen.c
--- a/arch/i386/kernel/time-xen.c       Fri Jun 15 13:33:47 2007 -0600
+++ b/arch/i386/kernel/time-xen.c       Tue Jun 19 15:36:16 2007 +0100
@@ -113,6 +113,9 @@ static struct timespec shadow_tv;
 static struct timespec shadow_tv;
 static u32 shadow_tv_version;
 
+static struct timeval monotonic_tv;
+static spinlock_t monotonic_lock = SPIN_LOCK_UNLOCKED;
+
 /* Keep track of last time we did processing/updating of jiffies and xtime. */
 static u64 processed_system_time;   /* System time (ns) at last processing. */
 static DEFINE_PER_CPU(u64, processed_system_time);
@@ -363,6 +366,7 @@ void do_gettimeofday(struct timeval *tv)
        unsigned long seq;
        unsigned long usec, sec;
        unsigned long max_ntp_tick;
+       unsigned long flags;
        s64 nsec;
        unsigned int cpu;
        struct shadow_time_info *shadow;
@@ -423,6 +427,18 @@ void do_gettimeofday(struct timeval *tv)
                sec++;
        }
 
+       spin_lock_irqsave(&monotonic_lock, flags);
+       if ((sec > monotonic_tv.tv_sec) ||
+           ((sec == monotonic_tv.tv_sec) && (usec > monotonic_tv.tv_usec)))
+       {
+               monotonic_tv.tv_sec = sec;
+               monotonic_tv.tv_usec = usec;
+       } else {
+               sec = monotonic_tv.tv_sec;
+               usec = monotonic_tv.tv_usec;
+       }
+       spin_unlock_irqrestore(&monotonic_lock, flags);
+
        tv->tv_sec = sec;
        tv->tv_usec = usec;
 }
@@ -471,6 +487,12 @@ int do_settimeofday(struct timespec *tv)
                __normalize_time(&sec, &nsec);
                __update_wallclock(sec, nsec);
        }
+
+       /* Reset monotonic gettimeofday() timeval. */
+       spin_lock(&monotonic_lock);
+       monotonic_tv.tv_sec = 0;
+       monotonic_tv.tv_usec = 0;
+       spin_unlock(&monotonic_lock);
 
        write_sequnlock_irq(&xtime_lock);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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