| From f23bf0c3c74afb3b24d8defad2234a8624d79376 Mon Sep 17 00:00:00 2001 |
| From: Carsten Emde <C.Emde@osadl.org> |
| Date: Fri, 2 Apr 2010 22:40:19 +0200 |
| Subject: [PATCH] hrtimers: Provide schedule_hrtimeout for CLOCK_REALTIME |
| |
| commit 3c3016f722b1d18ef73676f115cd1287e02f0b61 in tip. |
| |
| The current version of schedule_hrtimeout() always uses the |
| monotonic clock. Some system calls such as mq_timedsend() |
| and mq_timedreceive(), however, require the use of the wall |
| clock due to the definition of the system call. |
| |
| This patch provides the infrastructure to use schedule_hrtimeout() |
| with a CLOCK_REALTIME timer. |
| |
| Signed-off-by: Carsten Emde <C.Emde@osadl.org> |
| Tested-by: Pradyumna Sampath <pradysam@gmail.com> |
| Cc: Andrew Morton <akpm@linux-foundation.org> |
| Cc: Arjan van de Veen <arjan@infradead.org> |
| LKML-Reference: <20100402204331.167439615@osadl.org> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| |
| diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h |
| index 1cc4577..711ecf3 100644 |
| --- a/include/linux/hrtimer.h |
| +++ b/include/linux/hrtimer.h |
| @@ -435,6 +435,8 @@ extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, |
| |
| extern int schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, |
| const enum hrtimer_mode mode); |
| +extern int schedule_hrtimeout_range_clock(ktime_t *expires, |
| + unsigned long delta, const enum hrtimer_mode mode, int clock); |
| extern int schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode); |
| |
| /* Soft interrupt function to run the hrtimer queues: */ |
| diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c |
| index e018333..d03433b 100644 |
| --- a/kernel/hrtimer.c |
| +++ b/kernel/hrtimer.c |
| @@ -1955,35 +1955,15 @@ void __init hrtimers_init(void) |
| } |
| |
| /** |
| - * schedule_hrtimeout_range - sleep until timeout |
| + * schedule_hrtimeout_range_clock - sleep until timeout |
| * @expires: timeout value (ktime_t) |
| * @delta: slack in expires timeout (ktime_t) |
| * @mode: timer mode, HRTIMER_MODE_ABS or HRTIMER_MODE_REL |
| - * |
| - * Make the current task sleep until the given expiry time has |
| - * elapsed. The routine will return immediately unless |
| - * the current task state has been set (see set_current_state()). |
| - * |
| - * The @delta argument gives the kernel the freedom to schedule the |
| - * actual wakeup to a time that is both power and performance friendly. |
| - * The kernel give the normal best effort behavior for "@expires+@delta", |
| - * but may decide to fire the timer earlier, but no earlier than @expires. |
| - * |
| - * You can set the task state as follows - |
| - * |
| - * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to |
| - * pass before the routine returns. |
| - * |
| - * %TASK_INTERRUPTIBLE - the routine may return early if a signal is |
| - * delivered to the current task. |
| - * |
| - * The current task state is guaranteed to be TASK_RUNNING when this |
| - * routine returns. |
| - * |
| - * Returns 0 when the timer has expired otherwise -EINTR |
| + * @clock: timer clock, CLOCK_MONOTONIC or CLOCK_REALTIME |
| */ |
| -int __sched schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, |
| - const enum hrtimer_mode mode) |
| +int __sched |
| +schedule_hrtimeout_range_clock(ktime_t *expires, unsigned long delta, |
| + const enum hrtimer_mode mode, int clock) |
| { |
| struct hrtimer_sleeper t; |
| |
| @@ -2005,7 +1985,7 @@ int __sched schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, |
| return -EINTR; |
| } |
| |
| - hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, mode); |
| + hrtimer_init_on_stack(&t.timer, clock, mode); |
| hrtimer_set_expires_range_ns(&t.timer, *expires, delta); |
| |
| hrtimer_init_sleeper(&t, current); |
| @@ -2024,6 +2004,41 @@ int __sched schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, |
| |
| return !t.task ? 0 : -EINTR; |
| } |
| + |
| +/** |
| + * schedule_hrtimeout_range - sleep until timeout |
| + * @expires: timeout value (ktime_t) |
| + * @delta: slack in expires timeout (ktime_t) |
| + * @mode: timer mode, HRTIMER_MODE_ABS or HRTIMER_MODE_REL |
| + * |
| + * Make the current task sleep until the given expiry time has |
| + * elapsed. The routine will return immediately unless |
| + * the current task state has been set (see set_current_state()). |
| + * |
| + * The @delta argument gives the kernel the freedom to schedule the |
| + * actual wakeup to a time that is both power and performance friendly. |
| + * The kernel give the normal best effort behavior for "@expires+@delta", |
| + * but may decide to fire the timer earlier, but no earlier than @expires. |
| + * |
| + * You can set the task state as follows - |
| + * |
| + * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to |
| + * pass before the routine returns. |
| + * |
| + * %TASK_INTERRUPTIBLE - the routine may return early if a signal is |
| + * delivered to the current task. |
| + * |
| + * The current task state is guaranteed to be TASK_RUNNING when this |
| + * routine returns. |
| + * |
| + * Returns 0 when the timer has expired otherwise -EINTR |
| + */ |
| +int __sched schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, |
| + const enum hrtimer_mode mode) |
| +{ |
| + return schedule_hrtimeout_range_clock(expires, delta, mode, |
| + CLOCK_MONOTONIC); |
| +} |
| EXPORT_SYMBOL_GPL(schedule_hrtimeout_range); |
| |
| /** |
| -- |
| 1.7.1.1 |
| |