| Subject: timekeeping: Move lock out of timekeeper struct |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Fri, 15 Feb 2013 15:05:48 +0100 |
| |
| Make the lock a separate entity. Preparatory patch for shadow |
| timekeeper structure. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| include/linux/timekeeper_internal.h | 2 |
| kernel/time/timekeeping.c | 96 +++++++++++++++++------------------- |
| 2 files changed, 47 insertions(+), 51 deletions(-) |
| |
| --- a/include/linux/timekeeper_internal.h |
| +++ b/include/linux/timekeeper_internal.h |
| @@ -62,8 +62,6 @@ struct timekeeper { |
| ktime_t offs_boot; |
| /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ |
| struct timespec raw_time; |
| - /* Seqlock for all timekeeper values */ |
| - seqlock_t lock; |
| }; |
| |
| static inline struct timespec tk_xtime(struct timekeeper *tk) |
| --- a/kernel/time/timekeeping.c |
| +++ b/kernel/time/timekeeping.c |
| @@ -26,6 +26,7 @@ |
| #include "tick-internal.h" |
| |
| static struct timekeeper timekeeper; |
| +static DEFINE_SEQLOCK(timekeeper_lock); |
| |
| /* flag for if timekeeping is suspended */ |
| int __read_mostly timekeeping_suspended; |
| @@ -194,11 +195,11 @@ int pvclock_gtod_register_notifier(struc |
| unsigned long flags; |
| int ret; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| ret = raw_notifier_chain_register(&pvclock_gtod_chain, nb); |
| /* update timekeeping data */ |
| update_pvclock_gtod(tk); |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| return ret; |
| } |
| @@ -212,13 +213,12 @@ EXPORT_SYMBOL_GPL(pvclock_gtod_register_ |
| */ |
| int pvclock_gtod_unregister_notifier(struct notifier_block *nb) |
| { |
| - struct timekeeper *tk = &timekeeper; |
| unsigned long flags; |
| int ret; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| ret = raw_notifier_chain_unregister(&pvclock_gtod_chain, nb); |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| return ret; |
| } |
| @@ -279,12 +279,12 @@ void getnstimeofday(struct timespec *ts) |
| WARN_ON(timekeeping_suspended); |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| ts->tv_sec = tk->xtime_sec; |
| nsecs = timekeeping_get_ns(tk); |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| ts->tv_nsec = 0; |
| timespec_add_ns(ts, nsecs); |
| @@ -300,11 +300,11 @@ ktime_t ktime_get(void) |
| WARN_ON(timekeeping_suspended); |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| secs = tk->xtime_sec + tk->wall_to_monotonic.tv_sec; |
| nsecs = timekeeping_get_ns(tk) + tk->wall_to_monotonic.tv_nsec; |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| /* |
| * Use ktime_set/ktime_add_ns to create a proper ktime on |
| * 32-bit architectures without CONFIG_KTIME_SCALAR. |
| @@ -331,12 +331,12 @@ void ktime_get_ts(struct timespec *ts) |
| WARN_ON(timekeeping_suspended); |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| ts->tv_sec = tk->xtime_sec; |
| nsec = timekeeping_get_ns(tk); |
| tomono = tk->wall_to_monotonic; |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| ts->tv_sec += tomono.tv_sec; |
| ts->tv_nsec = 0; |
| @@ -364,7 +364,7 @@ void getnstime_raw_and_real(struct times |
| WARN_ON_ONCE(timekeeping_suspended); |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| *ts_raw = tk->raw_time; |
| ts_real->tv_sec = tk->xtime_sec; |
| @@ -373,7 +373,7 @@ void getnstime_raw_and_real(struct times |
| nsecs_raw = timekeeping_get_ns_raw(tk); |
| nsecs_real = timekeeping_get_ns(tk); |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| timespec_add_ns(ts_raw, nsecs_raw); |
| timespec_add_ns(ts_real, nsecs_real); |
| @@ -413,7 +413,7 @@ int do_settimeofday(const struct timespe |
| if (!timespec_valid_strict(tv)) |
| return -EINVAL; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| |
| timekeeping_forward_now(tk); |
| |
| @@ -427,7 +427,7 @@ int do_settimeofday(const struct timespe |
| |
| timekeeping_update(tk, true); |
| |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| /* signal hrtimers about time change */ |
| clock_was_set(); |
| @@ -452,7 +452,7 @@ int timekeeping_inject_offset(struct tim |
| if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) |
| return -EINVAL; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| |
| timekeeping_forward_now(tk); |
| |
| @@ -469,7 +469,7 @@ int timekeeping_inject_offset(struct tim |
| error: /* even if we error out, we forwarded the time, so call update */ |
| timekeeping_update(tk, true); |
| |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| /* signal hrtimers about time change */ |
| clock_was_set(); |
| @@ -491,7 +491,7 @@ static int change_clocksource(void *data |
| |
| new = (struct clocksource *) data; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| |
| timekeeping_forward_now(tk); |
| if (!new->enable || new->enable(new) == 0) { |
| @@ -502,7 +502,7 @@ static int change_clocksource(void *data |
| } |
| timekeeping_update(tk, true); |
| |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| return 0; |
| } |
| @@ -552,11 +552,11 @@ void getrawmonotonic(struct timespec *ts |
| s64 nsecs; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| nsecs = timekeeping_get_ns_raw(tk); |
| *ts = tk->raw_time; |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| timespec_add_ns(ts, nsecs); |
| } |
| @@ -572,11 +572,11 @@ int timekeeping_valid_for_hres(void) |
| int ret; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| ret = tk->clock->flags & CLOCK_SOURCE_VALID_FOR_HRES; |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| return ret; |
| } |
| @@ -591,11 +591,11 @@ u64 timekeeping_max_deferment(void) |
| u64 ret; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| ret = tk->clock->max_idle_ns; |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| return ret; |
| } |
| @@ -656,11 +656,9 @@ void __init timekeeping_init(void) |
| boot.tv_nsec = 0; |
| } |
| |
| - seqlock_init(&tk->lock); |
| - |
| ntp_init(); |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| clock = clocksource_default_clock(); |
| if (clock->enable) |
| clock->enable(clock); |
| @@ -679,7 +677,7 @@ void __init timekeeping_init(void) |
| tmp.tv_nsec = 0; |
| tk_set_sleep_time(tk, tmp); |
| |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| } |
| |
| /* time in seconds when suspend began */ |
| @@ -726,7 +724,7 @@ void timekeeping_inject_sleeptime(struct |
| if (!(ts.tv_sec == 0 && ts.tv_nsec == 0)) |
| return; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| |
| timekeeping_forward_now(tk); |
| |
| @@ -734,7 +732,7 @@ void timekeeping_inject_sleeptime(struct |
| |
| timekeeping_update(tk, true); |
| |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| /* signal hrtimers about time change */ |
| clock_was_set(); |
| @@ -758,7 +756,7 @@ static void timekeeping_resume(void) |
| clockevents_resume(); |
| clocksource_resume(); |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| |
| if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) { |
| ts = timespec_sub(ts, timekeeping_suspend_time); |
| @@ -769,7 +767,7 @@ static void timekeeping_resume(void) |
| tk->ntp_error = 0; |
| timekeeping_suspended = 0; |
| timekeeping_update(tk, false); |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| touch_softlockup_watchdog(); |
| |
| @@ -788,7 +786,7 @@ static int timekeeping_suspend(void) |
| |
| read_persistent_clock(&timekeeping_suspend_time); |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| timekeeping_forward_now(tk); |
| timekeeping_suspended = 1; |
| |
| @@ -811,7 +809,7 @@ static int timekeeping_suspend(void) |
| timekeeping_suspend_time = |
| timespec_add(timekeeping_suspend_time, delta_delta); |
| } |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); |
| clocksource_suspend(); |
| @@ -1149,7 +1147,7 @@ static void update_wall_time(void) |
| int shift = 0, maxshift; |
| unsigned long flags; |
| |
| - write_seqlock_irqsave(&tk->lock, flags); |
| + write_seqlock_irqsave(&timekeeper_lock, flags); |
| |
| /* Make sure we're fully resumed: */ |
| if (unlikely(timekeeping_suspended)) |
| @@ -1204,7 +1202,7 @@ static void update_wall_time(void) |
| timekeeping_update(tk, false); |
| |
| out: |
| - write_sequnlock_irqrestore(&tk->lock, flags); |
| + write_sequnlock_irqrestore(&timekeeper_lock, flags); |
| |
| } |
| |
| @@ -1252,13 +1250,13 @@ void get_monotonic_boottime(struct times |
| WARN_ON(timekeeping_suspended); |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| ts->tv_sec = tk->xtime_sec; |
| nsec = timekeeping_get_ns(tk); |
| tomono = tk->wall_to_monotonic; |
| sleep = tk->total_sleep_time; |
| |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| ts->tv_sec += tomono.tv_sec + sleep.tv_sec; |
| ts->tv_nsec = 0; |
| @@ -1317,10 +1315,10 @@ struct timespec current_kernel_time(void |
| unsigned long seq; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| now = tk_xtime(tk); |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| return now; |
| } |
| @@ -1333,11 +1331,11 @@ struct timespec get_monotonic_coarse(voi |
| unsigned long seq; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| now = tk_xtime(tk); |
| mono = tk->wall_to_monotonic; |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| set_normalized_timespec(&now, now.tv_sec + mono.tv_sec, |
| now.tv_nsec + mono.tv_nsec); |
| @@ -1368,11 +1366,11 @@ void get_xtime_and_monotonic_and_sleep_o |
| unsigned long seq; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| *xtim = tk_xtime(tk); |
| *wtom = tk->wall_to_monotonic; |
| *sleep = tk->total_sleep_time; |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| } |
| |
| #ifdef CONFIG_HIGH_RES_TIMERS |
| @@ -1392,14 +1390,14 @@ ktime_t ktime_get_update_offsets(ktime_t |
| u64 secs, nsecs; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| |
| secs = tk->xtime_sec; |
| nsecs = timekeeping_get_ns(tk); |
| |
| *offs_real = tk->offs_real; |
| *offs_boot = tk->offs_boot; |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| now = ktime_add_ns(ktime_set(secs, 0), nsecs); |
| now = ktime_sub(now, *offs_real); |
| @@ -1417,9 +1415,9 @@ ktime_t ktime_get_monotonic_offset(void) |
| struct timespec wtom; |
| |
| do { |
| - seq = read_seqbegin(&tk->lock); |
| + seq = read_seqbegin(&timekeeper_lock); |
| wtom = tk->wall_to_monotonic; |
| - } while (read_seqretry(&tk->lock, seq)); |
| + } while (read_seqretry(&timekeeper_lock, seq)); |
| |
| return timespec_to_ktime(wtom); |
| } |