include/linux/iopoll.h
Source file repositories/reference/linux-study-clean/include/linux/iopoll.h
File Facts
- System
- Linux kernel
- Corpus path
include/linux/iopoll.h- Extension
.h- Size
- 10396 bytes
- Lines
- 264
- Domain
- Core OS
- Bucket
- Core Kernel Interface
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
Dependency Surface
linux/kernel.hlinux/types.hlinux/ktime.hlinux/delay.hlinux/errno.hlinux/io.h
Detected Declarations
- No top-level syscall, struct, function, initcall, or export declaration detected by the generator.
Annotated Snippet
if (cond) { \
___ret = 0; \
break; \
} \
if (__expired) { \
___ret = -ETIMEDOUT; \
break; \
} \
if (__sleep_us) \
usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
cpu_relax(); \
} \
___ret; \
})
/**
* poll_timeout_us_atomic - Periodically poll and perform an operation until
* a condition is met or a timeout occurs
*
* @op: Operation
* @cond: Break condition
* @delay_us: Time to udelay between operations in us (0 tight-loops).
* Please read udelay() function description for details and
* limitations.
* @timeout_us: Timeout in us, 0 means never timeout
* @delay_before_op: if it is true, delay @delay_us before operation.
*
* This macro does not rely on timekeeping. Hence it is safe to call even when
* timekeeping is suspended, at the expense of an underestimation of wall clock
* time, which is rather minimal with a non-zero delay_us.
*
* When available, you'll probably want to use one of the specialized
* macros defined below rather than this macro directly.
*
* Returns: 0 on success and -ETIMEDOUT upon a timeout.
*/
#define poll_timeout_us_atomic(op, cond, delay_us, timeout_us, \
delay_before_op) \
({ \
u64 __timeout_us = (timeout_us); \
s64 __left_ns = __timeout_us * NSEC_PER_USEC; \
unsigned long __delay_us = (delay_us); \
u64 __delay_ns = __delay_us * NSEC_PER_USEC; \
int ___ret; \
if ((delay_before_op) && __delay_us) { \
udelay(__delay_us); \
if (__timeout_us) \
__left_ns -= __delay_ns; \
} \
for (;;) { \
bool __expired = __timeout_us && __left_ns < 0; \
/* guarantee 'op' and 'cond' are evaluated after timeout expired */ \
barrier(); \
op; \
if (cond) { \
___ret = 0; \
break; \
} \
if (__expired) { \
___ret = -ETIMEDOUT; \
break; \
} \
if (__delay_us) { \
udelay(__delay_us); \
if (__timeout_us) \
__left_ns -= __delay_ns; \
} \
cpu_relax(); \
if (__timeout_us) \
__left_ns--; \
} \
___ret; \
})
/**
* read_poll_timeout - Periodically poll an address until a condition is
* met or a timeout occurs
* @op: accessor function (takes @args as its arguments)
* @val: Variable to read the value into
* @cond: Break condition (usually involving @val)
* @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Please
* read usleep_range() function description for details and
* limitations.
* @timeout_us: Timeout in us, 0 means never timeout
* @sleep_before_read: if it is true, sleep @sleep_us before read.
* @args: arguments for @op poll
*
* When available, you'll probably want to use one of the specialized
* macros defined below rather than this macro directly.
*
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/types.h`, `linux/ktime.h`, `linux/delay.h`, `linux/errno.h`, `linux/io.h`.
- Atlas domain: Core OS / Core Kernel Interface.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.