diff options
author | George Anzinger <george@wildturkeyranch.net> | 2006-02-01 06:05:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-01 11:53:13 -0500 |
commit | 7978672c4d9a1e6a6081de3a9d9ba5e5b24904a0 (patch) | |
tree | a7deb3a6e339e691078c770d4b9cbc05d99a2243 /kernel/posix-timers.c | |
parent | ff60a5dc4fa584d47022d2533bc5c53b80096fb5 (diff) |
[PATCH] hrtimers: cleanups and simplifications
Clean up the interface to hrtimers by changing the init code to pass the mode
as well as the clock. This allow the init code to select the correct base and
eliminates extra timer re-init code in posix-timers. We also simplify the
restart interface nanosleep use.
Signed-off-by: George Anzinger <george@mvista.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/posix-timers.c')
-rw-r--r-- | kernel/posix-timers.c | 37 |
1 files changed, 9 insertions, 28 deletions
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index 3b606d361b52..28e72fd0029f 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c | |||
@@ -194,9 +194,7 @@ static inline int common_clock_set(const clockid_t which_clock, | |||
194 | 194 | ||
195 | static int common_timer_create(struct k_itimer *new_timer) | 195 | static int common_timer_create(struct k_itimer *new_timer) |
196 | { | 196 | { |
197 | hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock); | 197 | hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock, 0); |
198 | new_timer->it.real.timer.data = new_timer; | ||
199 | new_timer->it.real.timer.function = posix_timer_fn; | ||
200 | return 0; | 198 | return 0; |
201 | } | 199 | } |
202 | 200 | ||
@@ -693,6 +691,7 @@ common_timer_set(struct k_itimer *timr, int flags, | |||
693 | struct itimerspec *new_setting, struct itimerspec *old_setting) | 691 | struct itimerspec *new_setting, struct itimerspec *old_setting) |
694 | { | 692 | { |
695 | struct hrtimer *timer = &timr->it.real.timer; | 693 | struct hrtimer *timer = &timr->it.real.timer; |
694 | enum hrtimer_mode mode; | ||
696 | 695 | ||
697 | if (old_setting) | 696 | if (old_setting) |
698 | common_timer_get(timr, old_setting); | 697 | common_timer_get(timr, old_setting); |
@@ -714,14 +713,10 @@ common_timer_set(struct k_itimer *timr, int flags, | |||
714 | if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec) | 713 | if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec) |
715 | return 0; | 714 | return 0; |
716 | 715 | ||
717 | /* Posix madness. Only absolute CLOCK_REALTIME timers | 716 | mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL; |
718 | * are affected by clock sets. So we must reiniatilize | 717 | hrtimer_init(&timr->it.real.timer, timr->it_clock, mode); |
719 | * the timer. | 718 | timr->it.real.timer.data = timr; |
720 | */ | 719 | timr->it.real.timer.function = posix_timer_fn; |
721 | if (timr->it_clock == CLOCK_REALTIME && (flags & TIMER_ABSTIME)) | ||
722 | hrtimer_rebase(timer, CLOCK_REALTIME); | ||
723 | else | ||
724 | hrtimer_rebase(timer, CLOCK_MONOTONIC); | ||
725 | 720 | ||
726 | timer->expires = timespec_to_ktime(new_setting->it_value); | 721 | timer->expires = timespec_to_ktime(new_setting->it_value); |
727 | 722 | ||
@@ -732,8 +727,7 @@ common_timer_set(struct k_itimer *timr, int flags, | |||
732 | if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE)) | 727 | if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE)) |
733 | return 0; | 728 | return 0; |
734 | 729 | ||
735 | hrtimer_start(timer, timer->expires, (flags & TIMER_ABSTIME) ? | 730 | hrtimer_start(timer, timer->expires, mode); |
736 | HRTIMER_ABS : HRTIMER_REL); | ||
737 | return 0; | 731 | return 0; |
738 | } | 732 | } |
739 | 733 | ||
@@ -948,21 +942,8 @@ sys_clock_getres(const clockid_t which_clock, struct timespec __user *tp) | |||
948 | static int common_nsleep(const clockid_t which_clock, int flags, | 942 | static int common_nsleep(const clockid_t which_clock, int flags, |
949 | struct timespec *tsave, struct timespec __user *rmtp) | 943 | struct timespec *tsave, struct timespec __user *rmtp) |
950 | { | 944 | { |
951 | int mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL; | 945 | return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ? |
952 | int clockid = which_clock; | 946 | HRTIMER_ABS : HRTIMER_REL, which_clock); |
953 | |||
954 | switch (which_clock) { | ||
955 | case CLOCK_REALTIME: | ||
956 | /* Posix madness. Only absolute timers on clock realtime | ||
957 | are affected by clock set. */ | ||
958 | if (mode != HRTIMER_ABS) | ||
959 | clockid = CLOCK_MONOTONIC; | ||
960 | case CLOCK_MONOTONIC: | ||
961 | break; | ||
962 | default: | ||
963 | return -EINVAL; | ||
964 | } | ||
965 | return hrtimer_nanosleep(tsave, rmtp, mode, clockid); | ||
966 | } | 947 | } |
967 | 948 | ||
968 | asmlinkage long | 949 | asmlinkage long |