As previously suggested[1], the patch still works, but seemed to have needed some rebasing onto the new version. It is provided below. Makes my Xorg behave normal again in 2.6.31-(rc8)-rt. (It reading 2.6.30 is just a side artifact of the build environment.) [1] http://marc.info/?l=linux-kernel&m=124725068404348&w=2 --- kernel/hrtimer.c | 56 ++++++++++++++++++++ kernel/time/timekeeping.c | 123 ---------------------------------------------- 2 files changed, 56 insertions(+), 123 deletions(-) Index: linux-2.6.30/kernel/hrtimer.c =================================================================== --- linux-2.6.30.orig/kernel/hrtimer.c +++ linux-2.6.30/kernel/hrtimer.c @@ -48,6 +48,37 @@ #include <asm/uaccess.h> +/** + * ktime_get - get the monotonic time in ktime_t format + * + * returns the time in ktime_t format + */ +ktime_t ktime_get(void) +{ + struct timespec now; + + ktime_get_ts(&now); + + return timespec_to_ktime(now); +} +EXPORT_SYMBOL_GPL(ktime_get); + +/** + * ktime_get_real - get the real (wall-) time in ktime_t format + * + * returns the time in ktime_t format + */ +ktime_t ktime_get_real(void) +{ + struct timespec now; + + getnstimeofday(&now); + + return timespec_to_ktime(now); +} + +EXPORT_SYMBOL_GPL(ktime_get_real); + /* * The timer bases: * @@ -75,6 +106,31 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, } }; +/** + * ktime_get_ts - get the monotonic clock in timespec format + * @ts: pointer to timespec variable + * + * The function calculates the monotonic clock from the realtime + * clock and the wall_to_monotonic offset and stores the result + * in normalized timespec format in the variable pointed to by @ts. + */ +void ktime_get_ts(struct timespec *ts) +{ + struct timespec tomono; + unsigned long seq; + + do { + seq = read_atomic_seqbegin(&xtime_lock); + getnstimeofday(ts); + tomono = wall_to_monotonic; + + } while (read_atomic_seqretry(&xtime_lock, seq)); + + set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, + ts->tv_nsec + tomono.tv_nsec); +} +EXPORT_SYMBOL_GPL(ktime_get_ts); + /* * Get the coarse grained time at the softirq based on xtime and * wall_to_monotonic. Index: linux-2.6.30/kernel/time/timekeeping.c =================================================================== --- linux-2.6.30.orig/kernel/time/timekeeping.c +++ linux-2.6.30/kernel/time/timekeeping.c @@ -124,75 +124,6 @@ void getnstimeofday(struct timespec *ts) EXPORT_SYMBOL(getnstimeofday); -ktime_t ktime_get(void) -{ - cycle_t cycle_now, cycle_delta; - unsigned int seq; - s64 secs, nsecs; - - WARN_ON(timekeeping_suspended); - - do { - seq = read_atomic_seqbegin(&xtime_lock); - secs = xtime.tv_sec + wall_to_monotonic.tv_sec; - nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec; - - /* read clocksource: */ - cycle_now = clocksource_read(clock); - - /* calculate the delta since the last update_wall_time: */ - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; - - /* convert to nanoseconds: */ - nsecs += cyc2ns(clock, cycle_delta); - - } while (read_atomic_seqretry(&xtime_lock, seq)); - /* - * Use ktime_set/ktime_add_ns to create a proper ktime on - * 32-bit architectures without CONFIG_KTIME_SCALAR. - */ - return ktime_add_ns(ktime_set(secs, 0), nsecs); -} -EXPORT_SYMBOL_GPL(ktime_get); - -/** - * ktime_get_ts - get the monotonic clock in timespec format - * @ts: pointer to timespec variable - * - * The function calculates the monotonic clock from the realtime - * clock and the wall_to_monotonic offset and stores the result - * in normalized timespec format in the variable pointed to by @ts. - */ -void ktime_get_ts(struct timespec *ts) -{ - cycle_t cycle_now, cycle_delta; - struct timespec tomono; - unsigned int seq; - s64 nsecs; - - WARN_ON(timekeeping_suspended); - - do { - seq = read_atomic_seqbegin(&xtime_lock); - *ts = xtime; - tomono = wall_to_monotonic; - - /* read clocksource: */ - cycle_now = clocksource_read(clock); - - /* calculate the delta since the last update_wall_time: */ - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; - - /* convert to nanoseconds: */ - nsecs = cyc2ns(clock, cycle_delta); - - } while (read_atomic_seqretry(&xtime_lock, seq)); - - set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, - ts->tv_nsec + tomono.tv_nsec + nsecs); -} -EXPORT_SYMBOL_GPL(ktime_get_ts); - /** * do_gettimeofday - Returns the time of day in a timeval * @tv: pointer to the timeval to be set @@ -293,63 +224,9 @@ static void change_clocksource(void) static inline void clocksource_forward_now(void) { } static inline void change_clocksource(void) { } -/** - * ktime_get - get the monotonic time in ktime_t format - * - * returns the time in ktime_t format - */ -ktime_t ktime_get(void) -{ - struct timespec now; - - ktime_get_ts(&now); - - return timespec_to_ktime(now); -} -EXPORT_SYMBOL_GPL(ktime_get); - -/** - * ktime_get_ts - get the monotonic clock in timespec format - * @ts: pointer to timespec variable - * - * The function calculates the monotonic clock from the realtime - * clock and the wall_to_monotonic offset and stores the result - * in normalized timespec format in the variable pointed to by @ts. - */ -void ktime_get_ts(struct timespec *ts) -{ - struct timespec tomono; - unsigned long seq; - - do { - seq = read_atomic_seqbegin(&xtime_lock); - getnstimeofday(ts); - tomono = wall_to_monotonic; - - } while (read_atomic_seqretry(&xtime_lock, seq)); - - set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, - ts->tv_nsec + tomono.tv_nsec); -} -EXPORT_SYMBOL_GPL(ktime_get_ts); #endif /* !GENERIC_TIME */ /** - * ktime_get_real - get the real (wall-) time in ktime_t format - * - * returns the time in ktime_t format - */ -ktime_t ktime_get_real(void) -{ - struct timespec now; - - getnstimeofday(&now); - - return timespec_to_ktime(now); -} -EXPORT_SYMBOL_GPL(ktime_get_real); - -/** * getrawmonotonic - Returns the raw monotonic time in a timespec * @ts: pointer to the timespec to be set * -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html