Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
SF_BUF(9)		   Kernel Developer's Manual		     SF_BUF(9)

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 map-
       pings 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 sig-
		       nal is received waiting for a struct sf_buf  to	become
		       available.

       SFB_NOWAIT      Cause  sf_buf_alloc() to	return NULL rather than	sleep-
		       ing 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  unneces-
		       sary  TLB shootdowns for	mappings that will only	be ac-
		       cessed on a single CPU at a time.  The caller must  en-
		       sure 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.

FreeBSD	14.3		       January 28, 2007			     SF_BUF(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sf_buf&sektion=9&manpath=FreeBSD+14.3-RELEASE+and+Ports>

home | help