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) */ |