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