Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

timer: Added usleep[_range] timer

usleep[_range] are finer precision implementations of msleep
and are designed to be drop-in replacements for udelay where
a precise sleep / busy-wait is unnecessary. They also allow
an easy interface to specify slack when a precise (ish)
wakeup is unnecessary to help minimize wakeups

Signed-off-by: Patrick Pannuto <ppannuto@codeaurora.org>
Cc: akinobu.mita@gmail.com
Cc: sboyd@codeaurora.org
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
LKML-Reference: <4C44CDD2.1070708@codeaurora.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by

Patrick Pannuto and committed by
Thomas Gleixner
22b8f15c 866e2611

+28
+6
include/linux/delay.h
··· 45 45 void calibrate_delay(void); 46 46 void msleep(unsigned int msecs); 47 47 unsigned long msleep_interruptible(unsigned int msecs); 48 + void usleep_range(unsigned long min, unsigned long max); 49 + 50 + static inline void usleep(unsigned long usecs) 51 + { 52 + usleep_range(usecs, usecs); 53 + } 48 54 49 55 static inline void ssleep(unsigned int seconds) 50 56 {
+22
kernel/timer.c
··· 1755 1755 } 1756 1756 1757 1757 EXPORT_SYMBOL(msleep_interruptible); 1758 + 1759 + static int __sched do_usleep_range(unsigned long min, unsigned long max) 1760 + { 1761 + ktime_t kmin; 1762 + unsigned long delta; 1763 + 1764 + kmin = ktime_set(0, min * NSEC_PER_USEC); 1765 + delta = max - min; 1766 + return schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL); 1767 + } 1768 + 1769 + /** 1770 + * usleep_range - Drop in replacement for udelay where wakeup is flexible 1771 + * @min: Minimum time in usecs to sleep 1772 + * @max: Maximum time in usecs to sleep 1773 + */ 1774 + void usleep_range(unsigned long min, unsigned long max) 1775 + { 1776 + __set_current_state(TASK_UNINTERRUPTIBLE); 1777 + do_usleep_range(min, max); 1778 + } 1779 + EXPORT_SYMBOL(usleep_range);