diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-19 22:05:45 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-19 22:05:45 -0500 |
commit | 266d7ad7f4fe2f44b91561f5b812115c1b3018ab (patch) | |
tree | 45acf12d5cb170205ccffe24b9f24672ff8bff2e /kernel/hrtimer.c | |
parent | bcbd818c069b9e1bf82517401225b152a33968e2 (diff) | |
parent | 36dfbbf136db0d645bacfd42ce7d9d6928ea532d (diff) |
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer changes from Ingo Molnar:
"Main changes:
- ntp: Add CONFIG_RTC_SYSTOHC: a generic RTC driver facility
complementing the existing CONFIG_RTC_HCTOSYS, which uses NTP to
keep the hardware clock updated.
- posix-timers: Fix clock_adjtime to always return timex data on
success. This is changing the ABI, but no breakage was expected
and found - caution is warranted nevertheless.
- platform persistent clock improvements/cleanups.
- clockevents: refactor timer broadcast handling to be more generic
and less duplicated with matching architecture code (mostly ARM
motivated.)
- various fixes and cleanups"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
timers/x86/hpet: Use HPET_COUNTER to specify the hpet counter in vread_hpet()
posix-cpu-timers: Fix nanosleep task_struct leak
clockevents: Fix generic broadcast for FEAT_C3STOP
time, Fix setting of hardware clock in NTP code
hrtimer: Prevent hrtimer_enqueue_reprogram race
clockevents: Add generic timer broadcast function
clockevents: Add generic timer broadcast receiver
timekeeping: Switch HAS_PERSISTENT_CLOCK to ALWAYS_USE_PERSISTENT_CLOCK
x86/time/rtc: Don't print extended CMOS year when reading RTC
x86: Select HAS_PERSISTENT_CLOCK on x86
timekeeping: Add CONFIG_HAS_PERSISTENT_CLOCK option
rtc: Skip the suspend/resume handling if persistent clock exist
timekeeping: Add persistent_clock_exist flag
posix-timers: Fix clock_adjtime to always return timex data on success
Round the calculated scale factor in set_cyc2ns_scale()
NTP: Add a CONFIG_RTC_SYSTOHC configuration
MAINTAINERS: Update John Stultz's email
time: create __getnstimeofday for WARNless calls
Diffstat (limited to 'kernel/hrtimer.c')
-rw-r--r-- | kernel/hrtimer.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index c5dde988c0ce..cc47812d3feb 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -642,21 +642,9 @@ static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base) | |||
642 | * and expiry check is done in the hrtimer_interrupt or in the softirq. | 642 | * and expiry check is done in the hrtimer_interrupt or in the softirq. |
643 | */ | 643 | */ |
644 | static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, | 644 | static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, |
645 | struct hrtimer_clock_base *base, | 645 | struct hrtimer_clock_base *base) |
646 | int wakeup) | ||
647 | { | 646 | { |
648 | if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) { | 647 | return base->cpu_base->hres_active && hrtimer_reprogram(timer, base); |
649 | if (wakeup) { | ||
650 | raw_spin_unlock(&base->cpu_base->lock); | ||
651 | raise_softirq_irqoff(HRTIMER_SOFTIRQ); | ||
652 | raw_spin_lock(&base->cpu_base->lock); | ||
653 | } else | ||
654 | __raise_softirq_irqoff(HRTIMER_SOFTIRQ); | ||
655 | |||
656 | return 1; | ||
657 | } | ||
658 | |||
659 | return 0; | ||
660 | } | 648 | } |
661 | 649 | ||
662 | static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) | 650 | static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) |
@@ -737,8 +725,7 @@ static inline int hrtimer_switch_to_hres(void) { return 0; } | |||
737 | static inline void | 725 | static inline void |
738 | hrtimer_force_reprogram(struct hrtimer_cpu_base *base, int skip_equal) { } | 726 | hrtimer_force_reprogram(struct hrtimer_cpu_base *base, int skip_equal) { } |
739 | static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, | 727 | static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, |
740 | struct hrtimer_clock_base *base, | 728 | struct hrtimer_clock_base *base) |
741 | int wakeup) | ||
742 | { | 729 | { |
743 | return 0; | 730 | return 0; |
744 | } | 731 | } |
@@ -997,8 +984,21 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, | |||
997 | * | 984 | * |
998 | * XXX send_remote_softirq() ? | 985 | * XXX send_remote_softirq() ? |
999 | */ | 986 | */ |
1000 | if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases)) | 987 | if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases) |
1001 | hrtimer_enqueue_reprogram(timer, new_base, wakeup); | 988 | && hrtimer_enqueue_reprogram(timer, new_base)) { |
989 | if (wakeup) { | ||
990 | /* | ||
991 | * We need to drop cpu_base->lock to avoid a | ||
992 | * lock ordering issue vs. rq->lock. | ||
993 | */ | ||
994 | raw_spin_unlock(&new_base->cpu_base->lock); | ||
995 | raise_softirq_irqoff(HRTIMER_SOFTIRQ); | ||
996 | local_irq_restore(flags); | ||
997 | return ret; | ||
998 | } else { | ||
999 | __raise_softirq_irqoff(HRTIMER_SOFTIRQ); | ||
1000 | } | ||
1001 | } | ||
1002 | 1002 | ||
1003 | unlock_hrtimer_base(timer, &flags); | 1003 | unlock_hrtimer_base(timer, &flags); |
1004 | 1004 | ||