Deleted Added
sdiff udiff text old ( 283310 ) new ( 284665 )
full compact
1/*-
2 * Copyright (c) 1991 Regents of the University of California.
3 * All rights reserved.
4 * Copyright (c) 1994 John S. Dyson
5 * All rights reserved.
6 * Copyright (c) 1994 David Greenman
7 * All rights reserved.
8 * Copyright (c) 2005 Yahoo! Technologies Norway AS

--- 59 unchanged lines hidden (view full) ---

68 * rights to redistribute these changes.
69 */
70
71/*
72 * The proverbial page-out daemon.
73 */
74
75#include <sys/cdefs.h>
76__FBSDID("$FreeBSD: stable/10/sys/vm/vm_pageout.c 284665 2015-06-21 06:28:26Z trasz $");
77
78#include "opt_vm.h"
79#include "opt_kdtrace.h"
80#include <sys/param.h>
81#include <sys/systm.h>
82#include <sys/kernel.h>
83#include <sys/eventhandler.h>
84#include <sys/lock.h>

--- 1704 unchanged lines hidden (view full) ---

1789 struct vmspace *vm;
1790 int breakout, swapout_flags, tryagain, attempts;
1791#ifdef RACCT
1792 uint64_t rsize, ravailable;
1793#endif
1794
1795 while (TRUE) {
1796 mtx_lock(&vm_daemon_mtx);
1797 msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep",
1798#ifdef RACCT
1799 racct_enable ? hz : 0
1800#else
1801 0
1802#endif
1803 );
1804 swapout_flags = vm_pageout_req_swapout;
1805 vm_pageout_req_swapout = 0;
1806 mtx_unlock(&vm_daemon_mtx);
1807 if (swapout_flags)
1808 swapout_procs(swapout_flags);
1809
1810 /*
1811 * scan the processes for exceeding their rlimits or if

--- 58 unchanged lines hidden (view full) ---

1870 continue;
1871
1872 size = vmspace_resident_count(vm);
1873 if (size >= limit) {
1874 vm_pageout_map_deactivate_pages(
1875 &vm->vm_map, limit);
1876 }
1877#ifdef RACCT
1878 if (racct_enable) {
1879 rsize = IDX_TO_OFF(size);
1880 PROC_LOCK(p);
1881 racct_set(p, RACCT_RSS, rsize);
1882 ravailable = racct_get_available(p, RACCT_RSS);
1883 PROC_UNLOCK(p);
1884 if (rsize > ravailable) {
1885 /*
1886 * Don't be overly aggressive; this
1887 * might be an innocent process,
1888 * and the limit could've been exceeded
1889 * by some memory hog. Don't try
1890 * to deactivate more than 1/4th
1891 * of process' resident set size.
1892 */
1893 if (attempts <= 8) {
1894 if (ravailable < rsize -
1895 (rsize / 4)) {
1896 ravailable = rsize -
1897 (rsize / 4);
1898 }
1899 }
1900 vm_pageout_map_deactivate_pages(
1901 &vm->vm_map,
1902 OFF_TO_IDX(ravailable));
1903 /* Update RSS usage after paging out. */
1904 size = vmspace_resident_count(vm);
1905 rsize = IDX_TO_OFF(size);
1906 PROC_LOCK(p);
1907 racct_set(p, RACCT_RSS, rsize);
1908 PROC_UNLOCK(p);
1909 if (rsize > ravailable)
1910 tryagain = 1;
1911 }
1912 }
1913#endif
1914 vmspace_free(vm);
1915 }
1916 sx_sunlock(&allproc_lock);
1917 if (tryagain != 0 && attempts <= 10)
1918 goto again;
1919 }
1920}
1921#endif /* !defined(NO_SWAPPING) */