table of contents
PHYSIO(9) | Kernel Developer's Manual | PHYSIO(9) |
NAME¶
physio
— initiate
I/O on raw devices
SYNOPSIS¶
#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);
DESCRIPTION¶
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:
- dev
- The device number identifying the device to interact with.
- uio
- The description of the entire transfer as requested by the user process.
Currently, the results of passing a uio structure
with the uio_segflg set to anything other than
UIO_USERSPACE
are undefined. - ioflag
- The ioflag argument from the
read
() orwrite
() function callingphysio
().
RETURN VALUES¶
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.
SEE ALSO¶
HISTORY¶
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 |