~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/iopoll.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*
  3  * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
  4  */
  5 
  6 #ifndef _LINUX_IOPOLL_H
  7 #define _LINUX_IOPOLL_H
  8 
  9 #include <linux/kernel.h>
 10 #include <linux/types.h>
 11 #include <linux/ktime.h>
 12 #include <linux/delay.h>
 13 #include <linux/errno.h>
 14 #include <linux/io.h>
 15 
 16 /**
 17  * read_poll_timeout - Periodically poll an address until a condition is
 18  *                      met or a timeout occurs
 19  * @op: accessor function (takes @args as its arguments)
 20  * @val: Variable to read the value into
 21  * @cond: Break condition (usually involving @val)
 22  * @sleep_us: Maximum time to sleep between reads in us (0
 23  *            tight-loops).  Should be less than ~20ms since usleep_range
 24  *            is used (see Documentation/timers/timers-howto.rst).
 25  * @timeout_us: Timeout in us, 0 means never timeout
 26  * @sleep_before_read: if it is true, sleep @sleep_us before read.
 27  * @args: arguments for @op poll
 28  *
 29  * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
 30  * case, the last read value at @args is stored in @val. Must not
 31  * be called from atomic context if sleep_us or timeout_us are used.
 32  *
 33  * When available, you'll probably want to use one of the specialized
 34  * macros defined below rather than this macro directly.
 35  */
 36 #define read_poll_timeout(op, val, cond, sleep_us, timeout_us, \
 37                                 sleep_before_read, args...) \
 38 ({ \
 39         u64 __timeout_us = (timeout_us); \
 40         unsigned long __sleep_us = (sleep_us); \
 41         ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \
 42         might_sleep_if((__sleep_us) != 0); \
 43         if (sleep_before_read && __sleep_us) \
 44                 usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
 45         for (;;) { \
 46                 (val) = op(args); \
 47                 if (cond) \
 48                         break; \
 49                 if (__timeout_us && \
 50                     ktime_compare(ktime_get(), __timeout) > 0) { \
 51                         (val) = op(args); \
 52                         break; \
 53                 } \
 54                 if (__sleep_us) \
 55                         usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
 56                 cpu_relax(); \
 57         } \
 58         (cond) ? 0 : -ETIMEDOUT; \
 59 })
 60 
 61 /**
 62  * read_poll_timeout_atomic - Periodically poll an address until a condition is
 63  *                              met or a timeout occurs
 64  * @op: accessor function (takes @args as its arguments)
 65  * @val: Variable to read the value into
 66  * @cond: Break condition (usually involving @val)
 67  * @delay_us: Time to udelay between reads in us (0 tight-loops).  Should
 68  *            be less than ~10us since udelay is used (see
 69  *            Documentation/timers/timers-howto.rst).
 70  * @timeout_us: Timeout in us, 0 means never timeout
 71  * @delay_before_read: if it is true, delay @delay_us before read.
 72  * @args: arguments for @op poll
 73  *
 74  * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
 75  * case, the last read value at @args is stored in @val.
 76  *
 77  * This macro does not rely on timekeeping.  Hence it is safe to call even when
 78  * timekeeping is suspended, at the expense of an underestimation of wall clock
 79  * time, which is rather minimal with a non-zero delay_us.
 80  *
 81  * When available, you'll probably want to use one of the specialized
 82  * macros defined below rather than this macro directly.
 83  */
 84 #define read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, \
 85                                         delay_before_read, args...) \
 86 ({ \
 87         u64 __timeout_us = (timeout_us); \
 88         s64 __left_ns = __timeout_us * NSEC_PER_USEC; \
 89         unsigned long __delay_us = (delay_us); \
 90         u64 __delay_ns = __delay_us * NSEC_PER_USEC; \
 91         if (delay_before_read && __delay_us) { \
 92                 udelay(__delay_us); \
 93                 if (__timeout_us) \
 94                         __left_ns -= __delay_ns; \
 95         } \
 96         for (;;) { \
 97                 (val) = op(args); \
 98                 if (cond) \
 99                         break; \
100                 if (__timeout_us && __left_ns < 0) { \
101                         (val) = op(args); \
102                         break; \
103                 } \
104                 if (__delay_us) { \
105                         udelay(__delay_us); \
106                         if (__timeout_us) \
107                                 __left_ns -= __delay_ns; \
108                 } \
109                 cpu_relax(); \
110                 if (__timeout_us) \
111                         __left_ns--; \
112         } \
113         (cond) ? 0 : -ETIMEDOUT; \
114 })
115 
116 /**
117  * readx_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs
118  * @op: accessor function (takes @addr as its only argument)
119  * @addr: Address to poll
120  * @val: Variable to read the value into
121  * @cond: Break condition (usually involving @val)
122  * @sleep_us: Maximum time to sleep between reads in us (0
123  *            tight-loops).  Should be less than ~20ms since usleep_range
124  *            is used (see Documentation/timers/timers-howto.rst).
125  * @timeout_us: Timeout in us, 0 means never timeout
126  *
127  * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
128  * case, the last read value at @addr is stored in @val. Must not
129  * be called from atomic context if sleep_us or timeout_us are used.
130  *
131  * When available, you'll probably want to use one of the specialized
132  * macros defined below rather than this macro directly.
133  */
134 #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us)   \
135         read_poll_timeout(op, val, cond, sleep_us, timeout_us, false, addr)
136 
137 /**
138  * readx_poll_timeout_atomic - Periodically poll an address until a condition is met or a timeout occurs
139  * @op: accessor function (takes @addr as its only argument)
140  * @addr: Address to poll
141  * @val: Variable to read the value into
142  * @cond: Break condition (usually involving @val)
143  * @delay_us: Time to udelay between reads in us (0 tight-loops).  Should
144  *            be less than ~10us since udelay is used (see
145  *            Documentation/timers/timers-howto.rst).
146  * @timeout_us: Timeout in us, 0 means never timeout
147  *
148  * Returns 0 on success and -ETIMEDOUT upon a timeout. In either
149  * case, the last read value at @addr is stored in @val.
150  *
151  * When available, you'll probably want to use one of the specialized
152  * macros defined below rather than this macro directly.
153  */
154 #define readx_poll_timeout_atomic(op, addr, val, cond, delay_us, timeout_us) \
155         read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, false, addr)
156 
157 #define readb_poll_timeout(addr, val, cond, delay_us, timeout_us) \
158         readx_poll_timeout(readb, addr, val, cond, delay_us, timeout_us)
159 
160 #define readb_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
161         readx_poll_timeout_atomic(readb, addr, val, cond, delay_us, timeout_us)
162 
163 #define readw_poll_timeout(addr, val, cond, delay_us, timeout_us) \
164         readx_poll_timeout(readw, addr, val, cond, delay_us, timeout_us)
165 
166 #define readw_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
167         readx_poll_timeout_atomic(readw, addr, val, cond, delay_us, timeout_us)
168 
169 #define readl_poll_timeout(addr, val, cond, delay_us, timeout_us) \
170         readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us)
171 
172 #define readl_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
173         readx_poll_timeout_atomic(readl, addr, val, cond, delay_us, timeout_us)
174 
175 #define readq_poll_timeout(addr, val, cond, delay_us, timeout_us) \
176         readx_poll_timeout(readq, addr, val, cond, delay_us, timeout_us)
177 
178 #define readq_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
179         readx_poll_timeout_atomic(readq, addr, val, cond, delay_us, timeout_us)
180 
181 #define readb_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
182         readx_poll_timeout(readb_relaxed, addr, val, cond, delay_us, timeout_us)
183 
184 #define readb_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
185         readx_poll_timeout_atomic(readb_relaxed, addr, val, cond, delay_us, timeout_us)
186 
187 #define readw_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
188         readx_poll_timeout(readw_relaxed, addr, val, cond, delay_us, timeout_us)
189 
190 #define readw_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
191         readx_poll_timeout_atomic(readw_relaxed, addr, val, cond, delay_us, timeout_us)
192 
193 #define readl_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
194         readx_poll_timeout(readl_relaxed, addr, val, cond, delay_us, timeout_us)
195 
196 #define readl_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
197         readx_poll_timeout_atomic(readl_relaxed, addr, val, cond, delay_us, timeout_us)
198 
199 #define readq_relaxed_poll_timeout(addr, val, cond, delay_us, timeout_us) \
200         readx_poll_timeout(readq_relaxed, addr, val, cond, delay_us, timeout_us)
201 
202 #define readq_relaxed_poll_timeout_atomic(addr, val, cond, delay_us, timeout_us) \
203         readx_poll_timeout_atomic(readq_relaxed, addr, val, cond, delay_us, timeout_us)
204 
205 #endif /* _LINUX_IOPOLL_H */
206 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php