Merge branch 'timers-timekeeping-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'timers-timekeeping-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
um: Fix read_persistent_clock fallout
kgdb: Do not access xtime directly
powerpc: Clean up obsolete code relating to decrementer and timebase
powerpc: Rework VDSO gettimeofday to prevent time going backwards
clocksource: Add __clocksource_updatefreq_hz/khz methods
x86: Convert common clocksources to use clocksource_register_hz/khz
timekeeping: Make xtime and wall_to_monotonic static
hrtimer: Cleanup direct access to wall_to_monotonic
um: Convert to use read_persistent_clock
timkeeping: Fix update_vsyscall to provide wall_to_monotonic offset
powerpc: Cleanup xtime usage
powerpc: Simplify update_vsyscall
time: Kill off CONFIG_GENERIC_TIME
time: Implement timespec_add
x86: Fix vtime/file timestamp inconsistencies
Trivial conflicts in Documentation/feature-removal-schedule.txt
Much less trivial conflicts in arch/powerpc/kernel/time.c resolved as
per Thomas' earlier merge commit 47916be4e2 ("Merge branch
'powerpc.cherry-picks' into timers/clocksource")
This commit is contained in:
@@ -2548,6 +2548,7 @@ static void kdb_sysinfo(struct sysinfo *val)
|
||||
*/
|
||||
static int kdb_summary(int argc, const char **argv)
|
||||
{
|
||||
struct timespec now;
|
||||
struct kdb_tm tm;
|
||||
struct sysinfo val;
|
||||
|
||||
@@ -2562,7 +2563,8 @@ static int kdb_summary(int argc, const char **argv)
|
||||
kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
|
||||
kdb_printf("ccversion %s\n", __stringify(CCVERSION));
|
||||
|
||||
kdb_gmtime(&xtime, &tm);
|
||||
now = __current_kernel_time();
|
||||
kdb_gmtime(&now, &tm);
|
||||
kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d "
|
||||
"tz_minuteswest %d\n",
|
||||
1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
|
||||
|
||||
+4
-5
@@ -90,7 +90,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)
|
||||
do {
|
||||
seq = read_seqbegin(&xtime_lock);
|
||||
xts = __current_kernel_time();
|
||||
tom = wall_to_monotonic;
|
||||
tom = __get_wall_to_monotonic();
|
||||
} while (read_seqretry(&xtime_lock, seq));
|
||||
|
||||
xtim = timespec_to_ktime(xts);
|
||||
@@ -608,7 +608,7 @@ static int hrtimer_reprogram(struct hrtimer *timer,
|
||||
static void retrigger_next_event(void *arg)
|
||||
{
|
||||
struct hrtimer_cpu_base *base;
|
||||
struct timespec realtime_offset;
|
||||
struct timespec realtime_offset, wtm;
|
||||
unsigned long seq;
|
||||
|
||||
if (!hrtimer_hres_active())
|
||||
@@ -616,10 +616,9 @@ static void retrigger_next_event(void *arg)
|
||||
|
||||
do {
|
||||
seq = read_seqbegin(&xtime_lock);
|
||||
set_normalized_timespec(&realtime_offset,
|
||||
-wall_to_monotonic.tv_sec,
|
||||
-wall_to_monotonic.tv_nsec);
|
||||
wtm = __get_wall_to_monotonic();
|
||||
} while (read_seqretry(&xtime_lock, seq));
|
||||
set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec);
|
||||
|
||||
base = &__get_cpu_var(hrtimer_bases);
|
||||
|
||||
|
||||
@@ -300,22 +300,6 @@ struct timespec timespec_trunc(struct timespec t, unsigned gran)
|
||||
}
|
||||
EXPORT_SYMBOL(timespec_trunc);
|
||||
|
||||
#ifndef CONFIG_GENERIC_TIME
|
||||
/*
|
||||
* Simulate gettimeofday using do_gettimeofday which only allows a timeval
|
||||
* and therefore only yields usec accuracy
|
||||
*/
|
||||
void getnstimeofday(struct timespec *tv)
|
||||
{
|
||||
struct timeval x;
|
||||
|
||||
do_gettimeofday(&x);
|
||||
tv->tv_sec = x.tv_sec;
|
||||
tv->tv_nsec = x.tv_usec * NSEC_PER_USEC;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(getnstimeofday);
|
||||
#endif
|
||||
|
||||
/* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
|
||||
* Assumes input in normal date format, i.e. 1980-12-31 23:59:59
|
||||
* => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@ config TICK_ONESHOT
|
||||
|
||||
config NO_HZ
|
||||
bool "Tickless System (Dynamic Ticks)"
|
||||
depends on GENERIC_TIME && GENERIC_CLOCKEVENTS
|
||||
depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
|
||||
select TICK_ONESHOT
|
||||
help
|
||||
This option enables a tickless system: timer interrupts will
|
||||
@@ -15,7 +15,7 @@ config NO_HZ
|
||||
|
||||
config HIGH_RES_TIMERS
|
||||
bool "High Resolution Timer Support"
|
||||
depends on GENERIC_TIME && GENERIC_CLOCKEVENTS
|
||||
depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
|
||||
select TICK_ONESHOT
|
||||
help
|
||||
This option enables high resolution timer support. If your
|
||||
|
||||
+31
-12
@@ -531,7 +531,7 @@ static u64 clocksource_max_deferment(struct clocksource *cs)
|
||||
return max_nsecs - (max_nsecs >> 5);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GENERIC_TIME
|
||||
#ifndef CONFIG_ARCH_USES_GETTIMEOFFSET
|
||||
|
||||
/**
|
||||
* clocksource_select - Select the best clocksource available
|
||||
@@ -577,7 +577,7 @@ static void clocksource_select(void)
|
||||
}
|
||||
}
|
||||
|
||||
#else /* CONFIG_GENERIC_TIME */
|
||||
#else /* !CONFIG_ARCH_USES_GETTIMEOFFSET */
|
||||
|
||||
static inline void clocksource_select(void) { }
|
||||
|
||||
@@ -638,6 +638,32 @@ static void clocksource_enqueue(struct clocksource *cs)
|
||||
*/
|
||||
#define MAX_UPDATE_LENGTH 5 /* Seconds */
|
||||
|
||||
/**
|
||||
* __clocksource_updatefreq_scale - Used update clocksource with new freq
|
||||
* @t: clocksource to be registered
|
||||
* @scale: Scale factor multiplied against freq to get clocksource hz
|
||||
* @freq: clocksource frequency (cycles per second) divided by scale
|
||||
*
|
||||
* This should only be called from the clocksource->enable() method.
|
||||
*
|
||||
* This *SHOULD NOT* be called directly! Please use the
|
||||
* clocksource_updatefreq_hz() or clocksource_updatefreq_khz helper functions.
|
||||
*/
|
||||
void __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq)
|
||||
{
|
||||
/*
|
||||
* Ideally we want to use some of the limits used in
|
||||
* clocksource_max_deferment, to provide a more informed
|
||||
* MAX_UPDATE_LENGTH. But for now this just gets the
|
||||
* register interface working properly.
|
||||
*/
|
||||
clocks_calc_mult_shift(&cs->mult, &cs->shift, freq,
|
||||
NSEC_PER_SEC/scale,
|
||||
MAX_UPDATE_LENGTH*scale);
|
||||
cs->max_idle_ns = clocksource_max_deferment(cs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale);
|
||||
|
||||
/**
|
||||
* __clocksource_register_scale - Used to install new clocksources
|
||||
* @t: clocksource to be registered
|
||||
@@ -652,17 +678,10 @@ static void clocksource_enqueue(struct clocksource *cs)
|
||||
int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq)
|
||||
{
|
||||
|
||||
/*
|
||||
* Ideally we want to use some of the limits used in
|
||||
* clocksource_max_deferment, to provide a more informed
|
||||
* MAX_UPDATE_LENGTH. But for now this just gets the
|
||||
* register interface working properly.
|
||||
*/
|
||||
clocks_calc_mult_shift(&cs->mult, &cs->shift, freq,
|
||||
NSEC_PER_SEC/scale,
|
||||
MAX_UPDATE_LENGTH*scale);
|
||||
cs->max_idle_ns = clocksource_max_deferment(cs);
|
||||
/* Intialize mult/shift and max_idle_ns */
|
||||
__clocksource_updatefreq_scale(cs, scale, freq);
|
||||
|
||||
/* Add clocksource to the clcoksource list */
|
||||
mutex_lock(&clocksource_mutex);
|
||||
clocksource_enqueue(cs);
|
||||
clocksource_select();
|
||||
|
||||
+20
-59
@@ -153,8 +153,8 @@ __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
|
||||
* - wall_to_monotonic is no longer the boot time, getboottime must be
|
||||
* used instead.
|
||||
*/
|
||||
struct timespec xtime __attribute__ ((aligned (16)));
|
||||
struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
|
||||
static struct timespec xtime __attribute__ ((aligned (16)));
|
||||
static struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
|
||||
static struct timespec total_sleep_time;
|
||||
|
||||
/*
|
||||
@@ -170,11 +170,10 @@ void timekeeping_leap_insert(int leapsecond)
|
||||
{
|
||||
xtime.tv_sec += leapsecond;
|
||||
wall_to_monotonic.tv_sec -= leapsecond;
|
||||
update_vsyscall(&xtime, timekeeper.clock, timekeeper.mult);
|
||||
update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
|
||||
timekeeper.mult);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GENERIC_TIME
|
||||
|
||||
/**
|
||||
* timekeeping_forward_now - update clock to the current time
|
||||
*
|
||||
@@ -328,7 +327,8 @@ int do_settimeofday(struct timespec *tv)
|
||||
timekeeper.ntp_error = 0;
|
||||
ntp_clear();
|
||||
|
||||
update_vsyscall(&xtime, timekeeper.clock, timekeeper.mult);
|
||||
update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
|
||||
timekeeper.mult);
|
||||
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
@@ -376,52 +376,6 @@ void timekeeping_notify(struct clocksource *clock)
|
||||
tick_clock_notify();
|
||||
}
|
||||
|
||||
#else /* GENERIC_TIME */
|
||||
|
||||
static inline void timekeeping_forward_now(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_seqbegin(&xtime_lock);
|
||||
getnstimeofday(ts);
|
||||
tomono = wall_to_monotonic;
|
||||
|
||||
} while (read_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
|
||||
*
|
||||
@@ -579,9 +533,9 @@ static int timekeeping_resume(struct sys_device *dev)
|
||||
|
||||
if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
|
||||
ts = timespec_sub(ts, timekeeping_suspend_time);
|
||||
xtime = timespec_add_safe(xtime, ts);
|
||||
xtime = timespec_add(xtime, ts);
|
||||
wall_to_monotonic = timespec_sub(wall_to_monotonic, ts);
|
||||
total_sleep_time = timespec_add_safe(total_sleep_time, ts);
|
||||
total_sleep_time = timespec_add(total_sleep_time, ts);
|
||||
}
|
||||
/* re-base the last cycle value */
|
||||
timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock);
|
||||
@@ -784,10 +738,11 @@ void update_wall_time(void)
|
||||
return;
|
||||
|
||||
clock = timekeeper.clock;
|
||||
#ifdef CONFIG_GENERIC_TIME
|
||||
offset = (clock->read(clock) - clock->cycle_last) & clock->mask;
|
||||
#else
|
||||
|
||||
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
|
||||
offset = timekeeper.cycle_interval;
|
||||
#else
|
||||
offset = (clock->read(clock) - clock->cycle_last) & clock->mask;
|
||||
#endif
|
||||
timekeeper.xtime_nsec = (s64)xtime.tv_nsec << timekeeper.shift;
|
||||
|
||||
@@ -856,7 +811,8 @@ void update_wall_time(void)
|
||||
}
|
||||
|
||||
/* check to see if there is a new clocksource to use */
|
||||
update_vsyscall(&xtime, timekeeper.clock, timekeeper.mult);
|
||||
update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
|
||||
timekeeper.mult);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -887,7 +843,7 @@ EXPORT_SYMBOL_GPL(getboottime);
|
||||
*/
|
||||
void monotonic_to_bootbased(struct timespec *ts)
|
||||
{
|
||||
*ts = timespec_add_safe(*ts, total_sleep_time);
|
||||
*ts = timespec_add(*ts, total_sleep_time);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(monotonic_to_bootbased);
|
||||
|
||||
@@ -902,6 +858,11 @@ struct timespec __current_kernel_time(void)
|
||||
return xtime;
|
||||
}
|
||||
|
||||
struct timespec __get_wall_to_monotonic(void)
|
||||
{
|
||||
return wall_to_monotonic;
|
||||
}
|
||||
|
||||
struct timespec current_kernel_time(void)
|
||||
{
|
||||
struct timespec now;
|
||||
|
||||
@@ -153,7 +153,7 @@ config IRQSOFF_TRACER
|
||||
bool "Interrupts-off Latency Tracer"
|
||||
default n
|
||||
depends on TRACE_IRQFLAGS_SUPPORT
|
||||
depends on GENERIC_TIME
|
||||
depends on !ARCH_USES_GETTIMEOFFSET
|
||||
select TRACE_IRQFLAGS
|
||||
select GENERIC_TRACER
|
||||
select TRACER_MAX_TRACE
|
||||
@@ -175,7 +175,7 @@ config IRQSOFF_TRACER
|
||||
config PREEMPT_TRACER
|
||||
bool "Preemption-off Latency Tracer"
|
||||
default n
|
||||
depends on GENERIC_TIME
|
||||
depends on !ARCH_USES_GETTIMEOFFSET
|
||||
depends on PREEMPT
|
||||
select GENERIC_TRACER
|
||||
select TRACER_MAX_TRACE
|
||||
|
||||
Reference in New Issue
Block a user