vnode-backed VM objects, such as file-backed objects, generally need to maintain their own clean/dirty info independent from the VM system's idea of clean/dirty. For example, when the VM system decides to synchronize a physical page to its backing store, the VM system needs to mark the page clean before the page is actually written to its backing store. Additionally, filesystems need to be able to map portions of a file or file metadata into KVM in order to operate on it.
The entities used to manage this are known as filesystem
buffers, struct buf
's, or
bp
's. When a filesystem needs to operate on
a portion of a VM object, it typically maps part of the object
into a struct buf and then maps the pages in the struct buf into
KVM. In the same manner, disk I/O is typically issued by
mapping portions of objects into buffer structures and then
issuing the I/O on the buffer structures. The underlying
vm_page_t's are typically busied for the duration of the I/O.
Filesystem buffers also have their own notion of being busy,
which is useful to filesystem driver code which would rather
operate on filesystem buffers instead of hard VM pages.
FreeBSD reserves a limited amount of KVM to hold mappings
from struct bufs, but it should be made clear that this KVM is
used solely to hold mappings and does not limit the ability to
cache data. Physical data caching is strictly a function of
vm_page_t
's, not filesystem buffers.
However, since filesystem buffers are used to placehold I/O,
they do inherently limit the amount of concurrent I/O possible.
However, as there are usually a few thousand filesystem buffers
available, this is not usually a problem.
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.