time: Provide get_xtime_and_monotonic_offset()
Torben Hohn [Thu, 27 Jan 2011 14:59:05 +0000 (15:59 +0100)]
The hrtimer code accesses timekeeping variables under
xtime_lock. Provide a sensible accessor function and use it.

[ tglx: Removed the conditionals, unused variable, fixed codingstyle
   and massaged changelog ]

Signed-off-by: Torben Hohn <torbenh@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: johnstul@us.ibm.com
Cc: yong.zhang0@gmail.com
Cc: hch@infradead.org
LKML-Reference: <20110127145905.23248.30458.stgit@localhost>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

include/linux/time.h
kernel/hrtimer.c
kernel/time/timekeeping.c

index 86a9c48..4007a12 100644 (file)
@@ -127,6 +127,7 @@ struct timespec current_kernel_time(void);
 struct timespec __current_kernel_time(void); /* does not take xtime_lock */
 struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */
 struct timespec get_monotonic_coarse(void);
+void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom);
 
 #define CURRENT_TIME           (current_kernel_time())
 #define CURRENT_TIME_SEC       ((struct timespec) { get_seconds(), 0 })
index 0c8d7c0..57c4d33 100644 (file)
@@ -85,13 +85,8 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)
 {
        ktime_t xtim, tomono;
        struct timespec xts, tom;
-       unsigned long seq;
 
-       do {
-               seq = read_seqbegin(&xtime_lock);
-               xts = __current_kernel_time();
-               tom = __get_wall_to_monotonic();
-       } while (read_seqretry(&xtime_lock, seq));
+       get_xtime_and_monotonic_offset(&xts, &tom);
 
        xtim = timespec_to_ktime(xts);
        tomono = timespec_to_ktime(tom);
@@ -612,15 +607,11 @@ static void retrigger_next_event(void *arg)
 {
        struct hrtimer_cpu_base *base;
        struct timespec realtime_offset, wtm;
-       unsigned long seq;
 
        if (!hrtimer_hres_active())
                return;
 
-       do {
-               seq = read_seqbegin(&xtime_lock);
-               wtm = __get_wall_to_monotonic();
-       } while (read_seqretry(&xtime_lock, seq));
+       get_xtime_and_monotonic_offset(&realtime_offset, &wtm);
        set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec);
 
        base = &__get_cpu_var(hrtimer_bases);
index c1a178c..c50aaf6 100644 (file)
@@ -958,3 +958,19 @@ void do_timer(unsigned long ticks)
        update_wall_time();
        calc_global_load(ticks);
 }
+
+/**
+ * get_xtime_and_monotonic_offset() - get xtime and wall_to_monotonic
+ * @xtim:      pointer to timespec to be set with xtime
+ * @wtom:      pointer to timespec to be set with wall_to_monotonic
+ */
+void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom)
+{
+       unsigned long seq;
+
+       do {
+               seq = read_seqbegin(&xtime_lock);
+               *xtim = xtime;
+               *wtom = wall_to_monotonic;
+       } while (read_seqretry(&xtime_lock, seq));
+}