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

FreeBSD Manual Pages

  
 
  

home | help
MLOCK(2)		      System Calls Manual		      MLOCK(2)

NAME
       mlock, munlock -- lock (unlock) physical	pages in memory

LIBRARY
       Standard	C Library (libc, -lc)

SYNOPSIS
       #include	<sys/types.h>
       #include	<sys/mman.h>

       int
       mlock(const void	*addr, size_t len);

       int
       munlock(const void *addr, size_t	len);

DESCRIPTION
       The mlock() system call locks into memory the physical pages associated
       with  the  virtual  address  range starting at addr for len bytes.  The
       munlock() call unlocks pages previously locked by one or	 more  mlock()
       calls.  For both, the addr parameter should be aligned to a multiple of
       the  page  size.	  If  the  len parameter is not	a multiple of the page
       size, it	will be	rounded	up to be so.  The entire range must  be	 allo-
       cated.

       After  an  mlock()  call, the indicated pages will cause	neither	a non-
       resident	page nor address-translation fault until  they	are  unlocked.
       They  may still cause protection-violation faults or TLB-miss faults on
       architectures with software-managed TLBs.  The physical pages remain in
       memory until all	locked mappings	for the	pages are  removed.   Multiple
       processes may have the same physical pages locked via their own virtual
       address	mappings.   A single process may likewise have pages multiply-
       locked via different virtual mappings of	the same pages or  via	nested
       mlock()	calls  on  the same address range.  Unlocking is performed ex-
       plicitly	by munlock() or	implicitly by a	call to	munmap() which deallo-
       cates the unmapped address range.  Locked mappings are not inherited by
       the child process after a fork(2).

       Since physical memory is	a potentially scarce resource,	processes  are
       limited	in  how	much they can lock down.  A single process can mlock()
       the minimum of a	system-wide ``wired pages'' limit and the  per-process
       RLIMIT_MEMLOCK resource limit.

       These calls are only available to the super-user.

RETURN VALUES
       Upon  successful	 completion,  the  value  0 is returned; otherwise the
       value -1	is returned and	the global variable errno is set  to  indicate
       the error.

       If  the call succeeds, all pages	in the range become locked (unlocked);
       otherwise the locked status of all  pages  in  the  range  remains  un-
       changed.

ERRORS
       Mlock() will fail if:

       [EPERM]		  The caller is	not the	super-user.

       [EINVAL]		  The  address given is	not page aligned or the	length
			  is negative.

       [EAGAIN]		  Locking the indicated	range would exceed either  the
			  system or per-process	limit for locked memory.

       [ENOMEM]		  Some	portion	 of the	indicated address range	is not
			  allocated.  There was	an  error  faulting/mapping  a
			  page.
       Munlock() will fail if:

       [EPERM]		  The caller is	not the	super-user.

       [EINVAL]		  The  address given is	not page aligned or the	length
			  is negative.

       [ENOMEM]		  Some portion of the indicated	address	range  is  not
			  allocated.   Some  portion  of the indicated address
			  range	is not locked.

SEE ALSO
       fork(2),	mincore(2),  minherit(2),  mmap(2),  munmap(2),	 setrlimit(2),
       getpagesize(3)

BUGS
       Unlike  The  Sun	implementation,	multiple mlock() calls on the same ad-
       dress range require the corresponding number of munlock() calls to  ac-
       tually unlock the pages,	i.e. mlock() nests.  This should be considered
       a consequence of	the implementation and not a feature.

       The per-process resource	limit is a limit on the	amount of virtual mem-
       ory  locked,  while  the	 system-wide limit is for the number of	locked
       physical	pages.	Hence a	process	with two distinct locked  mappings  of
       the  same physical page counts as 2 pages against the per-process limit
       and as only a single page in the	system limit.

       The per-process resource	limit is not currently supported.

HISTORY
       The mlock() and munlock() functions first appeared in 4.4BSD.

FreeBSD	4.7			 June 2, 1993			      MLOCK(2)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=mlock&sektion=2&manpath=FreeBSD+4.7-RELEASE>

home | help