Provided by: freebsd-manpages_12.2-1_all bug

NAME

     sf_buf — manage temporary kernel address space mapping for memory pages

SYNOPSIS

     #include <sys/sf_buf.h>

     struct sf_buf *
     sf_buf_alloc(struct vm_page *m, int flags);

     void
     sf_buf_free(struct sf_buf *sf);

     vm_offset_t
     sf_buf_kva(struct sf_buf *sf);

     struct vm_page *
     sf_buf_page(struct sf_buf *sf);

DESCRIPTION

     The sf_buf interface, historically the sendfile(2) buffer interface, allows kernel
     subsystems to manage temporary kernel address space mappings for physical memory pages.  On
     systems with a direct memory map region (allowing all physical pages to be visible in the
     kernel address space at all times), the struct sf_buf will point to an address in the direct
     map region; on systems without a direct memory map region, the struct sf_buf will manage a
     temporary kernel address space mapping valid for the lifetime of the struct sf_buf.

     Call sf_buf_alloc() to allocate a struct sf_buf for a physical memory page.  sf_buf_alloc()
     is not responsible for arranging for the page to be present in physical memory; the caller
     should already have arranged for the page to be wired, i.e., by calling vm_page_wire(9).
     Several flags may be passed to sf_buf_alloc():

     SFB_CATCH       Cause sf_buf_alloc() to abort and return NULL if a signal is received
                     waiting for a struct sf_buf to become available.

     SFB_NOWAIT      Cause sf_buf_alloc() to return NULL rather than sleeping if a struct sf_buf
                     is not immediately available.

     SFB_CPUPRIVATE  Cause sf_buf_alloc() to only arrange that the temporary mapping be valid on
                     the current CPU, avoiding unnecessary TLB shootdowns for mappings that will
                     only be accessed on a single CPU at a time.  The caller must ensure that
                     accesses to the virtual address occur only on the CPU from which
                     sf_buf_alloc() was invoked, perhaps by using sched_pin().

     Call sf_buf_kva() to return a kernel mapped address for the page.

     Call sf_buf_page() to return a pointer to the page originally passed into sf_buf_alloc().

     Call sf_buf_free() to release the struct sf_buf reference.  The caller is responsible for
     releasing any wiring they have previously acquired on the physical page; sf_buf_free()
     releases only the temporary kernel address space mapping, not the page itself.

     Uses of this interface include managing mappings of borrowed pages from user memory, such as
     in zero-copy socket I/O, or pages of memory from the buffer cache referenced by mbuf
     external storage for sendfile(2).

SEE ALSO

     sendfile(2), vm_page_wire(9)

AUTHORS

     The struct sf_buf API was designed and implemented by Alan L. Cox.  This manual page was
     written by Robert N. M. Watson.