xref: /linux/kernel/time/sleep_timeout.c (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
1da7bd0a9SAnna-Maria Behnsen // SPDX-License-Identifier: GPL-2.0
2da7bd0a9SAnna-Maria Behnsen /*
3da7bd0a9SAnna-Maria Behnsen  *  Kernel internal schedule timeout and sleeping functions
4da7bd0a9SAnna-Maria Behnsen  */
5da7bd0a9SAnna-Maria Behnsen 
6da7bd0a9SAnna-Maria Behnsen #include <linux/delay.h>
7da7bd0a9SAnna-Maria Behnsen #include <linux/jiffies.h>
8da7bd0a9SAnna-Maria Behnsen #include <linux/timer.h>
9da7bd0a9SAnna-Maria Behnsen #include <linux/sched/signal.h>
10da7bd0a9SAnna-Maria Behnsen #include <linux/sched/debug.h>
11da7bd0a9SAnna-Maria Behnsen 
12da7bd0a9SAnna-Maria Behnsen #include "tick-internal.h"
13da7bd0a9SAnna-Maria Behnsen 
14da7bd0a9SAnna-Maria Behnsen /*
15da7bd0a9SAnna-Maria Behnsen  * Since schedule_timeout()'s timer is defined on the stack, it must store
16da7bd0a9SAnna-Maria Behnsen  * the target task on the stack as well.
17da7bd0a9SAnna-Maria Behnsen  */
18da7bd0a9SAnna-Maria Behnsen struct process_timer {
19da7bd0a9SAnna-Maria Behnsen 	struct timer_list timer;
20da7bd0a9SAnna-Maria Behnsen 	struct task_struct *task;
21da7bd0a9SAnna-Maria Behnsen };
22da7bd0a9SAnna-Maria Behnsen 
23da7bd0a9SAnna-Maria Behnsen static void process_timeout(struct timer_list *t)
24da7bd0a9SAnna-Maria Behnsen {
25da7bd0a9SAnna-Maria Behnsen 	struct process_timer *timeout = from_timer(timeout, t, timer);
26da7bd0a9SAnna-Maria Behnsen 
27da7bd0a9SAnna-Maria Behnsen 	wake_up_process(timeout->task);
28da7bd0a9SAnna-Maria Behnsen }
29da7bd0a9SAnna-Maria Behnsen 
30da7bd0a9SAnna-Maria Behnsen /**
31da7bd0a9SAnna-Maria Behnsen  * schedule_timeout - sleep until timeout
32da7bd0a9SAnna-Maria Behnsen  * @timeout: timeout value in jiffies
33da7bd0a9SAnna-Maria Behnsen  *
34da7bd0a9SAnna-Maria Behnsen  * Make the current task sleep until @timeout jiffies have elapsed.
35da7bd0a9SAnna-Maria Behnsen  * The function behavior depends on the current task state
36da7bd0a9SAnna-Maria Behnsen  * (see also set_current_state() description):
37da7bd0a9SAnna-Maria Behnsen  *
38da7bd0a9SAnna-Maria Behnsen  * %TASK_RUNNING - the scheduler is called, but the task does not sleep
39da7bd0a9SAnna-Maria Behnsen  * at all. That happens because sched_submit_work() does nothing for
40da7bd0a9SAnna-Maria Behnsen  * tasks in %TASK_RUNNING state.
41da7bd0a9SAnna-Maria Behnsen  *
42da7bd0a9SAnna-Maria Behnsen  * %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to
43da7bd0a9SAnna-Maria Behnsen  * pass before the routine returns unless the current task is explicitly
44da7bd0a9SAnna-Maria Behnsen  * woken up, (e.g. by wake_up_process()).
45da7bd0a9SAnna-Maria Behnsen  *
46da7bd0a9SAnna-Maria Behnsen  * %TASK_INTERRUPTIBLE - the routine may return early if a signal is
47da7bd0a9SAnna-Maria Behnsen  * delivered to the current task or the current task is explicitly woken
48da7bd0a9SAnna-Maria Behnsen  * up.
49da7bd0a9SAnna-Maria Behnsen  *
50da7bd0a9SAnna-Maria Behnsen  * The current task state is guaranteed to be %TASK_RUNNING when this
51da7bd0a9SAnna-Maria Behnsen  * routine returns.
52da7bd0a9SAnna-Maria Behnsen  *
53da7bd0a9SAnna-Maria Behnsen  * Specifying a @timeout value of %MAX_SCHEDULE_TIMEOUT will schedule
54da7bd0a9SAnna-Maria Behnsen  * the CPU away without a bound on the timeout. In this case the return
55da7bd0a9SAnna-Maria Behnsen  * value will be %MAX_SCHEDULE_TIMEOUT.
56da7bd0a9SAnna-Maria Behnsen  *
57da7bd0a9SAnna-Maria Behnsen  * Returns: 0 when the timer has expired otherwise the remaining time in
58da7bd0a9SAnna-Maria Behnsen  * jiffies will be returned. In all cases the return value is guaranteed
59da7bd0a9SAnna-Maria Behnsen  * to be non-negative.
60da7bd0a9SAnna-Maria Behnsen  */
61da7bd0a9SAnna-Maria Behnsen signed long __sched schedule_timeout(signed long timeout)
62da7bd0a9SAnna-Maria Behnsen {
63da7bd0a9SAnna-Maria Behnsen 	struct process_timer timer;
64da7bd0a9SAnna-Maria Behnsen 	unsigned long expire;
65da7bd0a9SAnna-Maria Behnsen 
66da7bd0a9SAnna-Maria Behnsen 	switch (timeout) {
67da7bd0a9SAnna-Maria Behnsen 	case MAX_SCHEDULE_TIMEOUT:
68da7bd0a9SAnna-Maria Behnsen 		/*
69da7bd0a9SAnna-Maria Behnsen 		 * These two special cases are useful to be comfortable
70da7bd0a9SAnna-Maria Behnsen 		 * in the caller. Nothing more. We could take
71da7bd0a9SAnna-Maria Behnsen 		 * MAX_SCHEDULE_TIMEOUT from one of the negative value
72da7bd0a9SAnna-Maria Behnsen 		 * but I' d like to return a valid offset (>=0) to allow
73da7bd0a9SAnna-Maria Behnsen 		 * the caller to do everything it want with the retval.
74da7bd0a9SAnna-Maria Behnsen 		 */
75da7bd0a9SAnna-Maria Behnsen 		schedule();
76da7bd0a9SAnna-Maria Behnsen 		goto out;
77da7bd0a9SAnna-Maria Behnsen 	default:
78da7bd0a9SAnna-Maria Behnsen 		/*
79da7bd0a9SAnna-Maria Behnsen 		 * Another bit of PARANOID. Note that the retval will be
80da7bd0a9SAnna-Maria Behnsen 		 * 0 since no piece of kernel is supposed to do a check
81da7bd0a9SAnna-Maria Behnsen 		 * for a negative retval of schedule_timeout() (since it
82da7bd0a9SAnna-Maria Behnsen 		 * should never happens anyway). You just have the printk()
83da7bd0a9SAnna-Maria Behnsen 		 * that will tell you if something is gone wrong and where.
84da7bd0a9SAnna-Maria Behnsen 		 */
85da7bd0a9SAnna-Maria Behnsen 		if (timeout < 0) {
86da7bd0a9SAnna-Maria Behnsen 			pr_err("%s: wrong timeout value %lx\n", __func__, timeout);
87da7bd0a9SAnna-Maria Behnsen 			dump_stack();
88da7bd0a9SAnna-Maria Behnsen 			__set_current_state(TASK_RUNNING);
89da7bd0a9SAnna-Maria Behnsen 			goto out;
90da7bd0a9SAnna-Maria Behnsen 		}
91da7bd0a9SAnna-Maria Behnsen 	}
92da7bd0a9SAnna-Maria Behnsen 
93da7bd0a9SAnna-Maria Behnsen 	expire = timeout + jiffies;
94da7bd0a9SAnna-Maria Behnsen 
95da7bd0a9SAnna-Maria Behnsen 	timer.task = current;
96da7bd0a9SAnna-Maria Behnsen 	timer_setup_on_stack(&timer.timer, process_timeout, 0);
97da7bd0a9SAnna-Maria Behnsen 	timer.timer.expires = expire;
98da7bd0a9SAnna-Maria Behnsen 	add_timer(&timer.timer);
99da7bd0a9SAnna-Maria Behnsen 	schedule();
100da7bd0a9SAnna-Maria Behnsen 	del_timer_sync(&timer.timer);
101da7bd0a9SAnna-Maria Behnsen 
102da7bd0a9SAnna-Maria Behnsen 	/* Remove the timer from the object tracker */
103da7bd0a9SAnna-Maria Behnsen 	destroy_timer_on_stack(&timer.timer);
104da7bd0a9SAnna-Maria Behnsen 
105da7bd0a9SAnna-Maria Behnsen 	timeout = expire - jiffies;
106da7bd0a9SAnna-Maria Behnsen 
107da7bd0a9SAnna-Maria Behnsen  out:
108da7bd0a9SAnna-Maria Behnsen 	return timeout < 0 ? 0 : timeout;
109da7bd0a9SAnna-Maria Behnsen }
110da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(schedule_timeout);
111da7bd0a9SAnna-Maria Behnsen 
112da7bd0a9SAnna-Maria Behnsen /*
113cf5b6ef0SAnna-Maria Behnsen  * __set_current_state() can be used in schedule_timeout_*() functions, because
114cf5b6ef0SAnna-Maria Behnsen  * schedule_timeout() calls schedule() unconditionally.
115cf5b6ef0SAnna-Maria Behnsen  */
116cf5b6ef0SAnna-Maria Behnsen 
117cf5b6ef0SAnna-Maria Behnsen /**
118cf5b6ef0SAnna-Maria Behnsen  * schedule_timeout_interruptible - sleep until timeout (interruptible)
119cf5b6ef0SAnna-Maria Behnsen  * @timeout: timeout value in jiffies
120cf5b6ef0SAnna-Maria Behnsen  *
121cf5b6ef0SAnna-Maria Behnsen  * See schedule_timeout() for details.
122cf5b6ef0SAnna-Maria Behnsen  *
123cf5b6ef0SAnna-Maria Behnsen  * Task state is set to TASK_INTERRUPTIBLE before starting the timeout.
124da7bd0a9SAnna-Maria Behnsen  */
125da7bd0a9SAnna-Maria Behnsen signed long __sched schedule_timeout_interruptible(signed long timeout)
126da7bd0a9SAnna-Maria Behnsen {
127da7bd0a9SAnna-Maria Behnsen 	__set_current_state(TASK_INTERRUPTIBLE);
128da7bd0a9SAnna-Maria Behnsen 	return schedule_timeout(timeout);
129da7bd0a9SAnna-Maria Behnsen }
130da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(schedule_timeout_interruptible);
131da7bd0a9SAnna-Maria Behnsen 
132cf5b6ef0SAnna-Maria Behnsen /**
133cf5b6ef0SAnna-Maria Behnsen  * schedule_timeout_killable - sleep until timeout (killable)
134cf5b6ef0SAnna-Maria Behnsen  * @timeout: timeout value in jiffies
135cf5b6ef0SAnna-Maria Behnsen  *
136cf5b6ef0SAnna-Maria Behnsen  * See schedule_timeout() for details.
137cf5b6ef0SAnna-Maria Behnsen  *
138cf5b6ef0SAnna-Maria Behnsen  * Task state is set to TASK_KILLABLE before starting the timeout.
139cf5b6ef0SAnna-Maria Behnsen  */
140da7bd0a9SAnna-Maria Behnsen signed long __sched schedule_timeout_killable(signed long timeout)
141da7bd0a9SAnna-Maria Behnsen {
142da7bd0a9SAnna-Maria Behnsen 	__set_current_state(TASK_KILLABLE);
143da7bd0a9SAnna-Maria Behnsen 	return schedule_timeout(timeout);
144da7bd0a9SAnna-Maria Behnsen }
145da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(schedule_timeout_killable);
146da7bd0a9SAnna-Maria Behnsen 
147cf5b6ef0SAnna-Maria Behnsen /**
148cf5b6ef0SAnna-Maria Behnsen  * schedule_timeout_uninterruptible - sleep until timeout (uninterruptible)
149cf5b6ef0SAnna-Maria Behnsen  * @timeout: timeout value in jiffies
150cf5b6ef0SAnna-Maria Behnsen  *
151cf5b6ef0SAnna-Maria Behnsen  * See schedule_timeout() for details.
152cf5b6ef0SAnna-Maria Behnsen  *
153cf5b6ef0SAnna-Maria Behnsen  * Task state is set to TASK_UNINTERRUPTIBLE before starting the timeout.
154cf5b6ef0SAnna-Maria Behnsen  */
155da7bd0a9SAnna-Maria Behnsen signed long __sched schedule_timeout_uninterruptible(signed long timeout)
156da7bd0a9SAnna-Maria Behnsen {
157da7bd0a9SAnna-Maria Behnsen 	__set_current_state(TASK_UNINTERRUPTIBLE);
158da7bd0a9SAnna-Maria Behnsen 	return schedule_timeout(timeout);
159da7bd0a9SAnna-Maria Behnsen }
160da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(schedule_timeout_uninterruptible);
161da7bd0a9SAnna-Maria Behnsen 
162cf5b6ef0SAnna-Maria Behnsen /**
163cf5b6ef0SAnna-Maria Behnsen  * schedule_timeout_idle - sleep until timeout (idle)
164cf5b6ef0SAnna-Maria Behnsen  * @timeout: timeout value in jiffies
165cf5b6ef0SAnna-Maria Behnsen  *
166cf5b6ef0SAnna-Maria Behnsen  * See schedule_timeout() for details.
167cf5b6ef0SAnna-Maria Behnsen  *
168cf5b6ef0SAnna-Maria Behnsen  * Task state is set to TASK_IDLE before starting the timeout. It is similar to
169cf5b6ef0SAnna-Maria Behnsen  * schedule_timeout_uninterruptible(), except this task will not contribute to
170cf5b6ef0SAnna-Maria Behnsen  * load average.
171da7bd0a9SAnna-Maria Behnsen  */
172da7bd0a9SAnna-Maria Behnsen signed long __sched schedule_timeout_idle(signed long timeout)
173da7bd0a9SAnna-Maria Behnsen {
174da7bd0a9SAnna-Maria Behnsen 	__set_current_state(TASK_IDLE);
175da7bd0a9SAnna-Maria Behnsen 	return schedule_timeout(timeout);
176da7bd0a9SAnna-Maria Behnsen }
177da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(schedule_timeout_idle);
178da7bd0a9SAnna-Maria Behnsen 
179da7bd0a9SAnna-Maria Behnsen /**
180da7bd0a9SAnna-Maria Behnsen  * schedule_hrtimeout_range_clock - sleep until timeout
181da7bd0a9SAnna-Maria Behnsen  * @expires:	timeout value (ktime_t)
182da7bd0a9SAnna-Maria Behnsen  * @delta:	slack in expires timeout (ktime_t)
183da7bd0a9SAnna-Maria Behnsen  * @mode:	timer mode
184da7bd0a9SAnna-Maria Behnsen  * @clock_id:	timer clock to be used
185cf5b6ef0SAnna-Maria Behnsen  *
186cf5b6ef0SAnna-Maria Behnsen  * Details are explained in schedule_hrtimeout_range() function description as
187cf5b6ef0SAnna-Maria Behnsen  * this function is commonly used.
188da7bd0a9SAnna-Maria Behnsen  */
189da7bd0a9SAnna-Maria Behnsen int __sched schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
190da7bd0a9SAnna-Maria Behnsen 					   const enum hrtimer_mode mode, clockid_t clock_id)
191da7bd0a9SAnna-Maria Behnsen {
192da7bd0a9SAnna-Maria Behnsen 	struct hrtimer_sleeper t;
193da7bd0a9SAnna-Maria Behnsen 
194da7bd0a9SAnna-Maria Behnsen 	/*
195da7bd0a9SAnna-Maria Behnsen 	 * Optimize when a zero timeout value is given. It does not
196da7bd0a9SAnna-Maria Behnsen 	 * matter whether this is an absolute or a relative time.
197da7bd0a9SAnna-Maria Behnsen 	 */
198da7bd0a9SAnna-Maria Behnsen 	if (expires && *expires == 0) {
199da7bd0a9SAnna-Maria Behnsen 		__set_current_state(TASK_RUNNING);
200da7bd0a9SAnna-Maria Behnsen 		return 0;
201da7bd0a9SAnna-Maria Behnsen 	}
202da7bd0a9SAnna-Maria Behnsen 
203da7bd0a9SAnna-Maria Behnsen 	/*
204da7bd0a9SAnna-Maria Behnsen 	 * A NULL parameter means "infinite"
205da7bd0a9SAnna-Maria Behnsen 	 */
206da7bd0a9SAnna-Maria Behnsen 	if (!expires) {
207da7bd0a9SAnna-Maria Behnsen 		schedule();
208da7bd0a9SAnna-Maria Behnsen 		return -EINTR;
209da7bd0a9SAnna-Maria Behnsen 	}
210da7bd0a9SAnna-Maria Behnsen 
211*8fae1411SNam Cao 	hrtimer_setup_sleeper_on_stack(&t, clock_id, mode);
212da7bd0a9SAnna-Maria Behnsen 	hrtimer_set_expires_range_ns(&t.timer, *expires, delta);
213da7bd0a9SAnna-Maria Behnsen 	hrtimer_sleeper_start_expires(&t, mode);
214da7bd0a9SAnna-Maria Behnsen 
215da7bd0a9SAnna-Maria Behnsen 	if (likely(t.task))
216da7bd0a9SAnna-Maria Behnsen 		schedule();
217da7bd0a9SAnna-Maria Behnsen 
218da7bd0a9SAnna-Maria Behnsen 	hrtimer_cancel(&t.timer);
219da7bd0a9SAnna-Maria Behnsen 	destroy_hrtimer_on_stack(&t.timer);
220da7bd0a9SAnna-Maria Behnsen 
221da7bd0a9SAnna-Maria Behnsen 	__set_current_state(TASK_RUNNING);
222da7bd0a9SAnna-Maria Behnsen 
223da7bd0a9SAnna-Maria Behnsen 	return !t.task ? 0 : -EINTR;
224da7bd0a9SAnna-Maria Behnsen }
225da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock);
226da7bd0a9SAnna-Maria Behnsen 
227da7bd0a9SAnna-Maria Behnsen /**
228da7bd0a9SAnna-Maria Behnsen  * schedule_hrtimeout_range - sleep until timeout
229da7bd0a9SAnna-Maria Behnsen  * @expires:	timeout value (ktime_t)
230da7bd0a9SAnna-Maria Behnsen  * @delta:	slack in expires timeout (ktime_t)
231da7bd0a9SAnna-Maria Behnsen  * @mode:	timer mode
232da7bd0a9SAnna-Maria Behnsen  *
233da7bd0a9SAnna-Maria Behnsen  * Make the current task sleep until the given expiry time has
234da7bd0a9SAnna-Maria Behnsen  * elapsed. The routine will return immediately unless
235da7bd0a9SAnna-Maria Behnsen  * the current task state has been set (see set_current_state()).
236da7bd0a9SAnna-Maria Behnsen  *
237da7bd0a9SAnna-Maria Behnsen  * The @delta argument gives the kernel the freedom to schedule the
238da7bd0a9SAnna-Maria Behnsen  * actual wakeup to a time that is both power and performance friendly
239da7bd0a9SAnna-Maria Behnsen  * for regular (non RT/DL) tasks.
240da7bd0a9SAnna-Maria Behnsen  * The kernel give the normal best effort behavior for "@expires+@delta",
241da7bd0a9SAnna-Maria Behnsen  * but may decide to fire the timer earlier, but no earlier than @expires.
242da7bd0a9SAnna-Maria Behnsen  *
243da7bd0a9SAnna-Maria Behnsen  * You can set the task state as follows -
244da7bd0a9SAnna-Maria Behnsen  *
245da7bd0a9SAnna-Maria Behnsen  * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to
246da7bd0a9SAnna-Maria Behnsen  * pass before the routine returns unless the current task is explicitly
247da7bd0a9SAnna-Maria Behnsen  * woken up, (e.g. by wake_up_process()).
248da7bd0a9SAnna-Maria Behnsen  *
249da7bd0a9SAnna-Maria Behnsen  * %TASK_INTERRUPTIBLE - the routine may return early if a signal is
250da7bd0a9SAnna-Maria Behnsen  * delivered to the current task or the current task is explicitly woken
251da7bd0a9SAnna-Maria Behnsen  * up.
252da7bd0a9SAnna-Maria Behnsen  *
253da7bd0a9SAnna-Maria Behnsen  * The current task state is guaranteed to be TASK_RUNNING when this
254da7bd0a9SAnna-Maria Behnsen  * routine returns.
255da7bd0a9SAnna-Maria Behnsen  *
256da7bd0a9SAnna-Maria Behnsen  * Returns: 0 when the timer has expired. If the task was woken before the
257da7bd0a9SAnna-Maria Behnsen  * timer expired by a signal (only possible in state TASK_INTERRUPTIBLE) or
258da7bd0a9SAnna-Maria Behnsen  * by an explicit wakeup, it returns -EINTR.
259da7bd0a9SAnna-Maria Behnsen  */
260da7bd0a9SAnna-Maria Behnsen int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta,
261da7bd0a9SAnna-Maria Behnsen 				     const enum hrtimer_mode mode)
262da7bd0a9SAnna-Maria Behnsen {
263da7bd0a9SAnna-Maria Behnsen 	return schedule_hrtimeout_range_clock(expires, delta, mode,
264da7bd0a9SAnna-Maria Behnsen 					      CLOCK_MONOTONIC);
265da7bd0a9SAnna-Maria Behnsen }
266da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL_GPL(schedule_hrtimeout_range);
267da7bd0a9SAnna-Maria Behnsen 
268da7bd0a9SAnna-Maria Behnsen /**
269da7bd0a9SAnna-Maria Behnsen  * schedule_hrtimeout - sleep until timeout
270da7bd0a9SAnna-Maria Behnsen  * @expires:	timeout value (ktime_t)
271da7bd0a9SAnna-Maria Behnsen  * @mode:	timer mode
272da7bd0a9SAnna-Maria Behnsen  *
273cf5b6ef0SAnna-Maria Behnsen  * See schedule_hrtimeout_range() for details. @delta argument of
274cf5b6ef0SAnna-Maria Behnsen  * schedule_hrtimeout_range() is set to 0 and has therefore no impact.
275da7bd0a9SAnna-Maria Behnsen  */
276da7bd0a9SAnna-Maria Behnsen int __sched schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode)
277da7bd0a9SAnna-Maria Behnsen {
278da7bd0a9SAnna-Maria Behnsen 	return schedule_hrtimeout_range(expires, 0, mode);
279da7bd0a9SAnna-Maria Behnsen }
280da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL_GPL(schedule_hrtimeout);
281da7bd0a9SAnna-Maria Behnsen 
282da7bd0a9SAnna-Maria Behnsen /**
283da7bd0a9SAnna-Maria Behnsen  * msleep - sleep safely even with waitqueue interruptions
284f36eb171SAnna-Maria Behnsen  * @msecs:	Requested sleep duration in milliseconds
285f36eb171SAnna-Maria Behnsen  *
286f36eb171SAnna-Maria Behnsen  * msleep() uses jiffy based timeouts for the sleep duration. Because of the
287f36eb171SAnna-Maria Behnsen  * design of the timer wheel, the maximum additional percentage delay (slack) is
288f36eb171SAnna-Maria Behnsen  * 12.5%. This is only valid for timers which will end up in level 1 or a higher
289f36eb171SAnna-Maria Behnsen  * level of the timer wheel. For explanation of those 12.5% please check the
290f36eb171SAnna-Maria Behnsen  * detailed description about the basics of the timer wheel.
291f36eb171SAnna-Maria Behnsen  *
292f36eb171SAnna-Maria Behnsen  * The slack of timers which will end up in level 0 depends on sleep duration
293f36eb171SAnna-Maria Behnsen  * (msecs) and HZ configuration and can be calculated in the following way (with
294f36eb171SAnna-Maria Behnsen  * the timer wheel design restriction that the slack is not less than 12.5%):
295f36eb171SAnna-Maria Behnsen  *
296f36eb171SAnna-Maria Behnsen  *   ``slack = MSECS_PER_TICK / msecs``
297f36eb171SAnna-Maria Behnsen  *
298f36eb171SAnna-Maria Behnsen  * When the allowed slack of the callsite is known, the calculation could be
299f36eb171SAnna-Maria Behnsen  * turned around to find the minimal allowed sleep duration to meet the
300f36eb171SAnna-Maria Behnsen  * constraints. For example:
301f36eb171SAnna-Maria Behnsen  *
302f36eb171SAnna-Maria Behnsen  * * ``HZ=1000`` with ``slack=25%``: ``MSECS_PER_TICK / slack = 1 / (1/4) = 4``:
303f36eb171SAnna-Maria Behnsen  *   all sleep durations greater or equal 4ms will meet the constraints.
304f36eb171SAnna-Maria Behnsen  * * ``HZ=1000`` with ``slack=12.5%``: ``MSECS_PER_TICK / slack = 1 / (1/8) = 8``:
305f36eb171SAnna-Maria Behnsen  *   all sleep durations greater or equal 8ms will meet the constraints.
306f36eb171SAnna-Maria Behnsen  * * ``HZ=250`` with ``slack=25%``: ``MSECS_PER_TICK / slack = 4 / (1/4) = 16``:
307f36eb171SAnna-Maria Behnsen  *   all sleep durations greater or equal 16ms will meet the constraints.
308f36eb171SAnna-Maria Behnsen  * * ``HZ=250`` with ``slack=12.5%``: ``MSECS_PER_TICK / slack = 4 / (1/8) = 32``:
309f36eb171SAnna-Maria Behnsen  *   all sleep durations greater or equal 32ms will meet the constraints.
310f36eb171SAnna-Maria Behnsen  *
311f36eb171SAnna-Maria Behnsen  * See also the signal aware variant msleep_interruptible().
312da7bd0a9SAnna-Maria Behnsen  */
313da7bd0a9SAnna-Maria Behnsen void msleep(unsigned int msecs)
314da7bd0a9SAnna-Maria Behnsen {
315da7bd0a9SAnna-Maria Behnsen 	unsigned long timeout = msecs_to_jiffies(msecs);
316da7bd0a9SAnna-Maria Behnsen 
317da7bd0a9SAnna-Maria Behnsen 	while (timeout)
318da7bd0a9SAnna-Maria Behnsen 		timeout = schedule_timeout_uninterruptible(timeout);
319da7bd0a9SAnna-Maria Behnsen }
320da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(msleep);
321da7bd0a9SAnna-Maria Behnsen 
322da7bd0a9SAnna-Maria Behnsen /**
323da7bd0a9SAnna-Maria Behnsen  * msleep_interruptible - sleep waiting for signals
324f36eb171SAnna-Maria Behnsen  * @msecs:	Requested sleep duration in milliseconds
325f36eb171SAnna-Maria Behnsen  *
326f36eb171SAnna-Maria Behnsen  * See msleep() for some basic information.
327f36eb171SAnna-Maria Behnsen  *
328f36eb171SAnna-Maria Behnsen  * The difference between msleep() and msleep_interruptible() is that the sleep
329f36eb171SAnna-Maria Behnsen  * could be interrupted by a signal delivery and then returns early.
330f36eb171SAnna-Maria Behnsen  *
331f36eb171SAnna-Maria Behnsen  * Returns: The remaining time of the sleep duration transformed to msecs (see
332f36eb171SAnna-Maria Behnsen  * schedule_timeout() for details).
333da7bd0a9SAnna-Maria Behnsen  */
334da7bd0a9SAnna-Maria Behnsen unsigned long msleep_interruptible(unsigned int msecs)
335da7bd0a9SAnna-Maria Behnsen {
336da7bd0a9SAnna-Maria Behnsen 	unsigned long timeout = msecs_to_jiffies(msecs);
337da7bd0a9SAnna-Maria Behnsen 
338da7bd0a9SAnna-Maria Behnsen 	while (timeout && !signal_pending(current))
339da7bd0a9SAnna-Maria Behnsen 		timeout = schedule_timeout_interruptible(timeout);
340da7bd0a9SAnna-Maria Behnsen 	return jiffies_to_msecs(timeout);
341da7bd0a9SAnna-Maria Behnsen }
342da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(msleep_interruptible);
343da7bd0a9SAnna-Maria Behnsen 
344da7bd0a9SAnna-Maria Behnsen /**
345da7bd0a9SAnna-Maria Behnsen  * usleep_range_state - Sleep for an approximate time in a given state
346da7bd0a9SAnna-Maria Behnsen  * @min:	Minimum time in usecs to sleep
347da7bd0a9SAnna-Maria Behnsen  * @max:	Maximum time in usecs to sleep
348da7bd0a9SAnna-Maria Behnsen  * @state:	State of the current task that will be while sleeping
349da7bd0a9SAnna-Maria Behnsen  *
350f36eb171SAnna-Maria Behnsen  * usleep_range_state() sleeps at least for the minimum specified time but not
351f36eb171SAnna-Maria Behnsen  * longer than the maximum specified amount of time. The range might reduce
352f36eb171SAnna-Maria Behnsen  * power usage by allowing hrtimers to coalesce an already scheduled interrupt
353f36eb171SAnna-Maria Behnsen  * with this hrtimer. In the worst case, an interrupt is scheduled for the upper
354f36eb171SAnna-Maria Behnsen  * bound.
355f36eb171SAnna-Maria Behnsen  *
356f36eb171SAnna-Maria Behnsen  * The sleeping task is set to the specified state before starting the sleep.
357f36eb171SAnna-Maria Behnsen  *
358da7bd0a9SAnna-Maria Behnsen  * In non-atomic context where the exact wakeup time is flexible, use
359f36eb171SAnna-Maria Behnsen  * usleep_range() or its variants instead of udelay(). The sleep improves
360f36eb171SAnna-Maria Behnsen  * responsiveness by avoiding the CPU-hogging busy-wait of udelay().
361da7bd0a9SAnna-Maria Behnsen  */
362da7bd0a9SAnna-Maria Behnsen void __sched usleep_range_state(unsigned long min, unsigned long max, unsigned int state)
363da7bd0a9SAnna-Maria Behnsen {
364da7bd0a9SAnna-Maria Behnsen 	ktime_t exp = ktime_add_us(ktime_get(), min);
365da7bd0a9SAnna-Maria Behnsen 	u64 delta = (u64)(max - min) * NSEC_PER_USEC;
366da7bd0a9SAnna-Maria Behnsen 
3676279abf1SAnna-Maria Behnsen 	if (WARN_ON_ONCE(max < min))
3686279abf1SAnna-Maria Behnsen 		delta = 0;
3696279abf1SAnna-Maria Behnsen 
370da7bd0a9SAnna-Maria Behnsen 	for (;;) {
371da7bd0a9SAnna-Maria Behnsen 		__set_current_state(state);
372da7bd0a9SAnna-Maria Behnsen 		/* Do not return before the requested sleep time has elapsed */
373da7bd0a9SAnna-Maria Behnsen 		if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS))
374da7bd0a9SAnna-Maria Behnsen 			break;
375da7bd0a9SAnna-Maria Behnsen 	}
376da7bd0a9SAnna-Maria Behnsen }
377da7bd0a9SAnna-Maria Behnsen EXPORT_SYMBOL(usleep_range_state);
378