| From 5b0215a04f8042b9689c43b21c7a05c79b689680 Mon Sep 17 00:00:00 2001 |
| From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Date: Mon, 4 Sep 2017 18:31:50 +0200 |
| Subject: [PATCH] hrtimer: consolidate hrtimer_init() + hrtimer_init_sleeper() |
| calls |
| |
| hrtimer_init_sleeper() calls require a prior initialisation of the |
| hrtimer object with hrtimer_init(). Lets make the initialisation of the |
| hrtimer object part of hrtimer_init_sleeper(). |
| |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| |
| diff --git a/block/blk-mq.c b/block/blk-mq.c |
| index bf90684a007a..91b723317239 100644 |
| --- a/block/blk-mq.c |
| +++ b/block/blk-mq.c |
| @@ -2779,10 +2779,9 @@ static bool blk_mq_poll_hybrid_sleep(struct request_queue *q, |
| kt = nsecs; |
| |
| mode = HRTIMER_MODE_REL; |
| - hrtimer_init_on_stack(&hs.timer, CLOCK_MONOTONIC, mode); |
| + hrtimer_init_sleeper_on_stack(&hs, CLOCK_MONOTONIC, mode, current); |
| hrtimer_set_expires(&hs.timer, kt); |
| |
| - hrtimer_init_sleeper(&hs, current); |
| do { |
| if (test_bit(REQ_ATOM_COMPLETE, &rq->atomic_flags)) |
| break; |
| diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h |
| index 6b46bdcec2f0..3214d9ac2002 100644 |
| --- a/include/linux/hrtimer.h |
| +++ b/include/linux/hrtimer.h |
| @@ -358,10 +358,17 @@ DECLARE_PER_CPU(struct tick_device, tick_cpu_device); |
| /* Initialize timers: */ |
| extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock, |
| enum hrtimer_mode mode); |
| +extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, |
| + enum hrtimer_mode mode, |
| + struct task_struct *task); |
| |
| #ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
| extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock, |
| enum hrtimer_mode mode); |
| +extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, |
| + clockid_t clock_id, |
| + enum hrtimer_mode mode, |
| + struct task_struct *task); |
| |
| extern void destroy_hrtimer_on_stack(struct hrtimer *timer); |
| #else |
| @@ -371,6 +378,15 @@ static inline void hrtimer_init_on_stack(struct hrtimer *timer, |
| { |
| hrtimer_init(timer, which_clock, mode); |
| } |
| + |
| +static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, |
| + clockid_t clock_id, |
| + enum hrtimer_mode mode, |
| + struct task_struct *task) |
| +{ |
| + hrtimer_init_sleeper(sl, clock_id, mode, task); |
| +} |
| + |
| static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { } |
| #endif |
| |
| @@ -472,9 +488,6 @@ extern long hrtimer_nanosleep(struct timespec64 *rqtp, |
| const clockid_t clockid); |
| extern long hrtimer_nanosleep_restart(struct restart_block *restart_block); |
| |
| -extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, |
| - struct task_struct *tsk); |
| - |
| extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta, |
| const enum hrtimer_mode mode); |
| extern int schedule_hrtimeout_range_clock(ktime_t *expires, |
| diff --git a/include/linux/wait.h b/include/linux/wait.h |
| index db076ca7f11d..0c63fb99f8ff 100644 |
| --- a/include/linux/wait.h |
| +++ b/include/linux/wait.h |
| @@ -508,9 +508,8 @@ do { \ |
| int __ret = 0; \ |
| struct hrtimer_sleeper __t; \ |
| \ |
| - hrtimer_init_on_stack(&__t.timer, CLOCK_MONOTONIC, \ |
| - HRTIMER_MODE_REL); \ |
| - hrtimer_init_sleeper(&__t, current); \ |
| + hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, \ |
| + HRTIMER_MODE_REL, current); \ |
| if ((timeout) != KTIME_MAX) \ |
| hrtimer_start_range_ns(&__t.timer, timeout, \ |
| current->timer_slack_ns, \ |
| diff --git a/kernel/futex.c b/kernel/futex.c |
| index fd9c40f51866..824435d202c6 100644 |
| --- a/kernel/futex.c |
| +++ b/kernel/futex.c |
| @@ -2500,10 +2500,9 @@ static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val, |
| if (abs_time) { |
| to = &timeout; |
| |
| - hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? |
| - CLOCK_REALTIME : CLOCK_MONOTONIC, |
| - HRTIMER_MODE_ABS); |
| - hrtimer_init_sleeper(to, current); |
| + hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? |
| + CLOCK_REALTIME : CLOCK_MONOTONIC, |
| + HRTIMER_MODE_ABS, current); |
| hrtimer_set_expires_range_ns(&to->timer, *abs_time, |
| current->timer_slack_ns); |
| } |
| @@ -2599,9 +2598,8 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, |
| |
| if (time) { |
| to = &timeout; |
| - hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME, |
| - HRTIMER_MODE_ABS); |
| - hrtimer_init_sleeper(to, current); |
| + hrtimer_init_sleeper_on_stack(to, CLOCK_REALTIME, |
| + HRTIMER_MODE_ABS, current); |
| hrtimer_set_expires(&to->timer, *time); |
| } |
| |
| @@ -3011,10 +3009,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, |
| |
| if (abs_time) { |
| to = &timeout; |
| - hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? |
| - CLOCK_REALTIME : CLOCK_MONOTONIC, |
| - HRTIMER_MODE_ABS); |
| - hrtimer_init_sleeper(to, current); |
| + hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? |
| + CLOCK_REALTIME : CLOCK_MONOTONIC, |
| + HRTIMER_MODE_ABS, current); |
| hrtimer_set_expires_range_ns(&to->timer, *abs_time, |
| current->timer_slack_ns); |
| } |
| diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c |
| index 863c0f133d48..f2815da015d8 100644 |
| --- a/kernel/time/hrtimer.c |
| +++ b/kernel/time/hrtimer.c |
| @@ -1554,17 +1554,46 @@ static enum hrtimer_restart hrtimer_wakeup(struct hrtimer *timer) |
| return HRTIMER_NORESTART; |
| } |
| |
| -void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) |
| +static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, |
| + clockid_t clock_id, |
| + enum hrtimer_mode mode, |
| + struct task_struct *task) |
| { |
| + __hrtimer_init(&sl->timer, clock_id, mode); |
| sl->timer.function = hrtimer_wakeup; |
| sl->task = task; |
| } |
| + |
| +/** |
| + * hrtimer_init - initialize a timer to the given clock |
| + * @timer: the timer to be initialized |
| + * @clock_id: the clock to be used |
| + * @mode: timer mode abs/rel |
| + */ |
| +void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, |
| + enum hrtimer_mode mode, struct task_struct *task) |
| +{ |
| + debug_init(&sl->timer, clock_id, mode); |
| + __hrtimer_init_sleeper(sl, clock_id, mode, task); |
| + |
| +} |
| EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); |
| |
| -static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) |
| +#ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
| +void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, |
| + clockid_t clock_id, |
| + enum hrtimer_mode mode, |
| + struct task_struct *task) |
| { |
| - hrtimer_init_sleeper(t, current); |
| + debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr); |
| + __hrtimer_init_sleeper(sl, clock_id, mode, task); |
| +} |
| +EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack); |
| +#endif |
| + |
| |
| +static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) |
| +{ |
| do { |
| set_current_state(TASK_INTERRUPTIBLE); |
| hrtimer_start_expires(&t->timer, mode); |
| @@ -1604,8 +1633,8 @@ long __sched hrtimer_nanosleep_restart(struct restart_block *restart) |
| struct timespec __user *rmtp; |
| int ret = 0; |
| |
| - hrtimer_init_on_stack(&t.timer, restart->nanosleep.clockid, |
| - HRTIMER_MODE_ABS); |
| + hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid, |
| + HRTIMER_MODE_ABS, current); |
| hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); |
| |
| if (do_nanosleep(&t, HRTIMER_MODE_ABS)) |
| @@ -1637,8 +1666,9 @@ long hrtimer_nanosleep(struct timespec64 *rqtp, struct timespec __user *rmtp, |
| if (dl_task(current) || rt_task(current)) |
| slack = 0; |
| |
| - hrtimer_init_on_stack(&t.timer, clockid, mode); |
| + hrtimer_init_sleeper_on_stack(&t, clockid, mode, current); |
| hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack); |
| + |
| if (do_nanosleep(&t, mode)) |
| goto out; |
| |
| @@ -1818,10 +1848,9 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta, |
| return -EINTR; |
| } |
| |
| - hrtimer_init_on_stack(&t.timer, clock_id, mode); |
| - hrtimer_set_expires_range_ns(&t.timer, *expires, delta); |
| + hrtimer_init_sleeper_on_stack(&t, clock_id, mode, current); |
| |
| - hrtimer_init_sleeper(&t, current); |
| + hrtimer_set_expires_range_ns(&t.timer, *expires, delta); |
| |
| hrtimer_start_expires(&t.timer, mode); |
| |
| diff --git a/net/core/pktgen.c b/net/core/pktgen.c |
| index 96947f5d41e4..0f8b1020e307 100644 |
| --- a/net/core/pktgen.c |
| +++ b/net/core/pktgen.c |
| @@ -2252,7 +2252,8 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) |
| s64 remaining; |
| struct hrtimer_sleeper t; |
| |
| - hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); |
| + hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS, |
| + current); |
| hrtimer_set_expires(&t.timer, spin_until); |
| |
| remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer)); |
| @@ -2267,7 +2268,6 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) |
| } while (ktime_compare(end_time, spin_until) < 0); |
| } else { |
| /* see do_nanosleep */ |
| - hrtimer_init_sleeper(&t, current); |
| do { |
| set_current_state(TASK_INTERRUPTIBLE); |
| hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS); |
| -- |
| 2.1.4 |
| |