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