| SF_BUF(9) | Kernel Developer's Manual | SF_BUF(9) | 
sf_buf — manage
    temporary kernel address space mapping for memory pages
#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);
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_CATCHsf_buf_alloc() to abort and return
      NULL if a signal is received waiting for a
      struct sf_buf to become available.SFB_NOWAITsf_buf_alloc() to return
      NULL rather than sleeping if a
      struct sf_buf is not immediately available.SFB_CPUPRIVATEsf_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).
The struct sf_buf API was designed and implemented by Alan L. Cox. This manual page was written by Robert N. M. Watson.
| January 28, 2007 | Debian |