1 #ifndef __LINUX_DELAY_WRAPPER_H
2 #define __LINUX_DELAY_WRAPPER_H 1
4 #include_next <linux/delay.h>
6 #include <linux/version.h>
7 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,29)
8 #include <linux/time.h>
9 #include <linux/sched.h>
10 #include <asm/param.h>
12 * We define MAX_MSEC_OFFSET as the maximal value that can be accepted by
13 * msecs_to_jiffies() without risking a multiply overflow. This function
14 * returns MAX_JIFFY_OFFSET for arguments above those values.
17 #if HZ <= 1000 && !(1000 % HZ)
18 # define MAX_MSEC_OFFSET \
19 (ULONG_MAX - (1000 / HZ) + 1)
20 #elif HZ > 1000 && !(HZ % 1000)
21 # define MAX_MSEC_OFFSET \
22 (ULONG_MAX / (HZ / 1000))
24 # define MAX_MSEC_OFFSET \
25 ((ULONG_MAX - 999) / HZ)
29 * Convert jiffies to milliseconds and back.
31 * Avoid unnecessary multiplications/divisions in the
32 * two most common HZ cases:
34 static inline unsigned int jiffies_to_msecs(const unsigned long j)
36 #if HZ <= 1000 && !(1000 % HZ)
37 return (1000 / HZ) * j;
38 #elif HZ > 1000 && !(HZ % 1000)
39 return (j + (HZ / 1000) - 1)/(HZ / 1000);
41 return (j * 1000) / HZ;
45 static inline unsigned long msecs_to_jiffies(const unsigned int m)
47 if (MAX_MSEC_OFFSET < UINT_MAX && m > (unsigned int)MAX_MSEC_OFFSET)
48 return MAX_JIFFY_OFFSET;
49 #if HZ <= 1000 && !(1000 % HZ)
50 return ((unsigned long)m + (1000 / HZ) - 1) / (1000 / HZ);
51 #elif HZ > 1000 && !(HZ % 1000)
52 return (unsigned long)m * (HZ / 1000);
54 return ((unsigned long)m * HZ + 999) / 1000;
58 #endif /* linux kernel < 2.4.29 */
61 * msleep_interruptible - sleep waiting for waitqueue interruptions
62 * @msecs: Time in milliseconds to sleep for
64 static inline unsigned long msleep_interruptible(unsigned int msecs)
66 unsigned long timeout = msecs_to_jiffies(msecs);
68 while (timeout && !signal_pending(current)) {
69 set_current_state(TASK_INTERRUPTIBLE);
70 timeout = schedule_timeout(timeout);
72 return jiffies_to_msecs(timeout);