NAME
ubc —
unified buffer cache
SYNOPSIS
#include <uvm/uvm.h>
void *
ubc_alloc(
struct
uvm_object *uobj,
voff_t
offset,
vsize_t
*lenp,
int advice,
int flags);
void
ubc_release(
void
*va,
int flags);
int
ubc_uiomove(
struct
uvm_object *uobj,
struct
uio *uio,
vsize_t
todo,
int advice,
int flags);
void
ubc_zerorange(
struct
uvm_bject *uobj,
off_t
off,
size_t len,
int flags);
void
ubc_purge(
struct
uvm_object *uobj);
DESCRIPTION
ubc_alloc() creates a kernel mapping of
uobj starting at offset
offset.
The desired length of the mapping is pointed to by
lenp,
but the actual mapping may be smaller than this.
lenp is
updated to contain the actual length mapped.
advice is
the access pattern hint, which must be one of
- UVM_ADV_NORMAL
- No hint
- UVM_ADV_RANDOM
- Random access hint
- UVM_ADV_SEQUENTIAL
- Sequential access hint (from lower offset to higher
offset)
The possible
flags are
- UBC_READ
- Mapping will be accessed for read.
- UBC_WRITE
- Mapping will be accessed for write.
- UBC_FAULTBUSY
- Fault in window's pages already during mapping operation.
Makes sense only for write.
Once the mapping is created, it must be accessed only by methods that can handle
faults, such as
uiomove(9) or
kcopy(9). Page faults on the
mapping will result in the object's pager method being called to resolve the
fault.
ubc_release() frees the mapping at
va
for reuse. The mapping may be cached to speed future accesses to the same
region of the object. The flags can be any of
- UBC_UNMAP
- Do not cache mapping.
ubc_uiomove() allocates an UBC memory window, performs I/O on
it and unmaps the window. The
advice parameter takes the
same values as the respective parameter in
ubc_alloc() and
the
flags parameter takes the same arguments as
ubc_alloc() and
ubc_release().
Additionally, the flag
UBC_PARTIALOK
can be provided
to indicate that it is acceptable to return if an error occurs mid-transfer.
ubc_zerorange() sets a range of bytes in a UVM object to zero.
The
flags parameter takes the same arguments as
ubc_release().
ubc_purge() disassociates all UBC structures from an empty UVM
object, specified by
uobj.
CODE REFERENCES
The
ubc subsystem is implemented within the file
sys/uvm/uvm_bio.c.
SEE ALSO
kcopy(9),
pmap(9),
uiomove(9),
uvm(9),
vnode(9),
vnodeops(9)
Chuck Silvers, UBC:
An Efficient Unified I/O and Memory Caching Subsystem for NetBSD,
Proceedings of the FREENIX Track: 2000 USENIX Annual Technical
Conference, USENIX Association,
http://www.usenix.org/event/usenix2000/freenix/full_papers/silvers/silvers.pdf,
285-290, June 18-23,
2000.
HISTORY
UBC first appeared in
NetBSD 1.6.
AUTHORS
Chuck Silvers
<
chuq@chuq.com> designed
and implemented the UBC part of UVM, which uses UVM pages to cache vnode data
rather than the traditional buffer cache buffers.