PHYSIO(9) | Kernel Developer's Manual | PHYSIO(9) |
physio
— initiate
I/O on raw devices
#include
<sys/param.h>
#include <sys/systm.h>
#include <sys/bio.h>
#include <sys/buf.h>
int
physio
(struct
cdev *dev, struct uio
*uio, int
ioflag);
The
physio
()
is a helper function typically called from character device
read
() and write
() routines
to start I/O on a user process buffer. The maximum amount of data to
transfer with each call is determined by
dev->si_iosize_max. The
physio
() call converts the I/O request into a
strategy
()
request and passes the new request to the driver's
strategy
() routine for processing.
Since uio normally describes
user space addresses,
physio
()
needs to lock those pages into memory. This is done by calling
vmapbuf
()
for the appropriate pages. physio
() always awaits
the completion of the entire requested transfer before returning, unless an
error condition is detected earlier.
A break-down of the arguments follows:
UIO_USERSPACE
are undefined.read
() or
write
()
function calling physio
().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 strategy 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.
The physio
manual page is originally from
NetBSD with minor changes for applicability with
FreeBSD.
The physio
call has been completely
re-written for providing higher I/O and paging performance.
January 19, 2012 | Debian |