diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-18 12:24:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-18 12:24:49 -0400 |
commit | 9d2cd7048b1ec21309e2d1a32bf50732eb5d5de8 (patch) | |
tree | 0fd13d51002dc3d0991cb5bdd6e026970171d457 | |
parent | 7e28b2712e5ebd8d73d25561585bc2ae77da5c30 (diff) | |
parent | 7bd36014460f793c19e7d6c94dab67b0afcfcb7f (diff) |
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fix from Ingo Molnar:
"An NTP related lockup fix"
* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
timekeeping: Fix HRTICK related deadlock from ntp lock changes
-rw-r--r-- | include/linux/timex.h | 1 | ||||
-rw-r--r-- | kernel/time/ntp.c | 6 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 2 |
3 files changed, 5 insertions, 4 deletions
diff --git a/include/linux/timex.h b/include/linux/timex.h index b3726e61368e..dd3edd7dfc94 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
@@ -141,6 +141,7 @@ extern int do_adjtimex(struct timex *); | |||
141 | extern void hardpps(const struct timespec *, const struct timespec *); | 141 | extern void hardpps(const struct timespec *, const struct timespec *); |
142 | 142 | ||
143 | int read_current_timer(unsigned long *timer_val); | 143 | int read_current_timer(unsigned long *timer_val); |
144 | void ntp_notify_cmos_timer(void); | ||
144 | 145 | ||
145 | /* The clock frequency of the i8253/i8254 PIT */ | 146 | /* The clock frequency of the i8253/i8254 PIT */ |
146 | #define PIT_TICK_RATE 1193182ul | 147 | #define PIT_TICK_RATE 1193182ul |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 8f5b3b98577b..bb2215174f05 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -516,13 +516,13 @@ static void sync_cmos_clock(struct work_struct *work) | |||
516 | schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next)); | 516 | schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next)); |
517 | } | 517 | } |
518 | 518 | ||
519 | static void notify_cmos_timer(void) | 519 | void ntp_notify_cmos_timer(void) |
520 | { | 520 | { |
521 | schedule_delayed_work(&sync_cmos_work, 0); | 521 | schedule_delayed_work(&sync_cmos_work, 0); |
522 | } | 522 | } |
523 | 523 | ||
524 | #else | 524 | #else |
525 | static inline void notify_cmos_timer(void) { } | 525 | void ntp_notify_cmos_timer(void) { } |
526 | #endif | 526 | #endif |
527 | 527 | ||
528 | 528 | ||
@@ -687,8 +687,6 @@ int __do_adjtimex(struct timex *txc, struct timespec *ts, s32 *time_tai) | |||
687 | if (!(time_status & STA_NANO)) | 687 | if (!(time_status & STA_NANO)) |
688 | txc->time.tv_usec /= NSEC_PER_USEC; | 688 | txc->time.tv_usec /= NSEC_PER_USEC; |
689 | 689 | ||
690 | notify_cmos_timer(); | ||
691 | |||
692 | return result; | 690 | return result; |
693 | } | 691 | } |
694 | 692 | ||
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 48b9fffabdc2..947ba25a95a0 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -1703,6 +1703,8 @@ int do_adjtimex(struct timex *txc) | |||
1703 | write_seqcount_end(&timekeeper_seq); | 1703 | write_seqcount_end(&timekeeper_seq); |
1704 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); | 1704 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); |
1705 | 1705 | ||
1706 | ntp_notify_cmos_timer(); | ||
1707 | |||
1706 | return ret; | 1708 | return ret; |
1707 | } | 1709 | } |
1708 | 1710 | ||