|  | delays - Information on the various kernel delay / sleep mechanisms | 
|  | ------------------------------------------------------------------- | 
|  |  | 
|  | This document seeks to answer the common question: "What is the | 
|  | RightWay (TM) to insert a delay?" | 
|  |  | 
|  | This question is most often faced by driver writers who have to | 
|  | deal with hardware delays and who may not be the most intimately | 
|  | familiar with the inner workings of the Linux Kernel. | 
|  |  | 
|  |  | 
|  | Inserting Delays | 
|  | ---------------- | 
|  |  | 
|  | The first, and most important, question you need to ask is "Is my | 
|  | code in an atomic context?"  This should be followed closely by "Does | 
|  | it really need to delay in atomic context?" If so... | 
|  |  | 
|  | ATOMIC CONTEXT: | 
|  | You must use the *delay family of functions. These | 
|  | functions use the jiffie estimation of clock speed | 
|  | and will busy wait for enough loop cycles to achieve | 
|  | the desired delay: | 
|  |  | 
|  | ndelay(unsigned long nsecs) | 
|  | udelay(unsigned long usecs) | 
|  | mdelay(unsigned long msecs) | 
|  |  | 
|  | udelay is the generally preferred API; ndelay-level | 
|  | precision may not actually exist on many non-PC devices. | 
|  |  | 
|  | mdelay is macro wrapper around udelay, to account for | 
|  | possible overflow when passing large arguments to udelay. | 
|  | In general, use of mdelay is discouraged and code should | 
|  | be refactored to allow for the use of msleep. | 
|  |  | 
|  | NON-ATOMIC CONTEXT: | 
|  | You should use the *sleep[_range] family of functions. | 
|  | There are a few more options here, while any of them may | 
|  | work correctly, using the "right" sleep function will | 
|  | help the scheduler, power management, and just make your | 
|  | driver better :) | 
|  |  | 
|  | -- Backed by busy-wait loop: | 
|  | udelay(unsigned long usecs) | 
|  | -- Backed by hrtimers: | 
|  | usleep_range(unsigned long min, unsigned long max) | 
|  | -- Backed by jiffies / legacy_timers | 
|  | msleep(unsigned long msecs) | 
|  | msleep_interruptible(unsigned long msecs) | 
|  |  | 
|  | Unlike the *delay family, the underlying mechanism | 
|  | driving each of these calls varies, thus there are | 
|  | quirks you should be aware of. | 
|  |  | 
|  |  | 
|  | SLEEPING FOR "A FEW" USECS ( < ~10us? ): | 
|  | * Use udelay | 
|  |  | 
|  | - Why not usleep? | 
|  | On slower systems, (embedded, OR perhaps a speed- | 
|  | stepped PC!) the overhead of setting up the hrtimers | 
|  | for usleep *may* not be worth it. Such an evaluation | 
|  | will obviously depend on your specific situation, but | 
|  | it is something to be aware of. | 
|  |  | 
|  | SLEEPING FOR ~USECS OR SMALL MSECS ( 10us - 20ms): | 
|  | * Use usleep_range | 
|  |  | 
|  | - Why not msleep for (1ms - 20ms)? | 
|  | Explained originally here: | 
|  | http://lkml.org/lkml/2007/8/3/250 | 
|  | msleep(1~20) may not do what the caller intends, and | 
|  | will often sleep longer (~20 ms actual sleep for any | 
|  | value given in the 1~20ms range). In many cases this | 
|  | is not the desired behavior. | 
|  |  | 
|  | - Why is there no "usleep" / What is a good range? | 
|  | Since usleep_range is built on top of hrtimers, the | 
|  | wakeup will be very precise (ish), thus a simple | 
|  | usleep function would likely introduce a large number | 
|  | of undesired interrupts. | 
|  |  | 
|  | With the introduction of a range, the scheduler is | 
|  | free to coalesce your wakeup with any other wakeup | 
|  | that may have happened for other reasons, or at the | 
|  | worst case, fire an interrupt for your upper bound. | 
|  |  | 
|  | The larger a range you supply, the greater a chance | 
|  | that you will not trigger an interrupt; this should | 
|  | be balanced with what is an acceptable upper bound on | 
|  | delay / performance for your specific code path. Exact | 
|  | tolerances here are very situation specific, thus it | 
|  | is left to the caller to determine a reasonable range. | 
|  |  | 
|  | SLEEPING FOR LARGER MSECS ( 10ms+ ) | 
|  | * Use msleep or possibly msleep_interruptible | 
|  |  | 
|  | - What's the difference? | 
|  | msleep sets the current task to TASK_UNINTERRUPTIBLE | 
|  | whereas msleep_interruptible sets the current task to | 
|  | TASK_INTERRUPTIBLE before scheduling the sleep. In | 
|  | short, the difference is whether the sleep can be ended | 
|  | early by a signal. In general, just use msleep unless | 
|  | you know you have a need for the interruptible variant. |