- NetBSD Manual Pages
PHYSIO(9) NetBSD Kernel Developer's Manual PHYSIO(9)
Powered by man-cgi (2021-06-01).
Maintained for NetBSD
by Kimmo Suominen.
Based on man-cgi by Panagiotis Christias.
physio -- initiate I/O on raw devices
physio(void (*strategy)(buf_t *), buf_t *bp, dev_t dev, int flags,
void (*minphys)(buf_t *), struct uio *uio);
The physio() is a helper function typically called from character device
read and write routines to start I/O on a user process buffer. It calls
back on the provided strategy routine one or more times to complete the
transfer described by uio. The maximum amount of data to transfer with
each call to strategy is determined by the minphys routine.
Since uio normally describes user space addresses, physio() needs to lock
the appropriate data area into memory before each transaction with
strategy (see uvm_vslock(9) and uvm_vsunlock(9)). The physio() function
always awaits the completion of the entire requested transfer before
returning, unless an error condition is detected earlier. In all cases,
the buffer passed in bp is locked (marked as ``busy'') for the duration
of the entire transfer.
A break-down of the arguments follows:
strategy The device strategy routine to call for each chunk of data to
initiate device I/O.
bp The buffer to use with the strategy routine. The buffer flags
will have B_BUSY, B_PHYS, and B_RAW set when passed to the
strategy routine. If NULL, a buffer is allocated from a sys-
dev The device number identifying the device to interact with.
flags Direction of transfer; the only valid settings are B_READ or
minphys A device specific routine called to determine the maximum
transfer size that the device's strategy routine can handle.
uio The description of the entire transfer as requested by the
user process. Currently, the results of passing a uio struc-
ture with the `uio_segflg' set to anything other than
UIO_USERSPACE, are undefined.
If successful physio() returns 0. EFAULT is returned if the address
range described by uio is not accessible by the requesting process.
physio() will return any error resulting from calls to the device strat-
egy routine, by examining the B_ERROR buffer flag and the `b_error'
field. Note that the actual transfer size may be less than requested by
uio if the device signals an ``end of file'' condition.
NetBSD 10.99 September 12, 2019 NetBSD 10.99