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