Reviewed by:	alc
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D13678
This commit is contained in:
Konstantin Belousov 2017-12-29 19:05:07 +00:00
parent 3a8d2bd4a1
commit e258b4a0dc

View File

@ -556,16 +556,14 @@ vm_thread_swapin(struct thread *td)
{ {
vm_object_t ksobj; vm_object_t ksobj;
vm_page_t ma[KSTACK_MAX_PAGES]; vm_page_t ma[KSTACK_MAX_PAGES];
int pages; int a, count, i, j, pages, rv;
pages = td->td_kstack_pages; pages = td->td_kstack_pages;
ksobj = td->td_kstack_obj; ksobj = td->td_kstack_obj;
VM_OBJECT_WLOCK(ksobj); VM_OBJECT_WLOCK(ksobj);
(void)vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_WIRED, ma, (void)vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_WIRED, ma,
pages); pages);
for (int i = 0; i < pages;) { for (i = 0; i < pages;) {
int j, a, count, rv;
vm_page_assert_xbusied(ma[i]); vm_page_assert_xbusied(ma[i]);
if (ma[i]->valid == VM_PAGE_BITS_ALL) { if (ma[i]->valid == VM_PAGE_BITS_ALL) {
vm_page_xunbusy(ma[i]); vm_page_xunbusy(ma[i]);
@ -642,13 +640,9 @@ faultin(struct proc *p)
void void
swapper(void) swapper(void)
{ {
struct proc *p; struct proc *p, *pp;
struct thread *td; struct thread *td;
struct proc *pp; int ppri, pri, slptime, swtime;
int slptime;
int swtime;
int ppri;
int pri;
loop: loop:
if (vm_page_count_min()) { if (vm_page_count_min()) {
@ -735,15 +729,15 @@ swapout_procs(int action)
{ {
struct proc *p; struct proc *p;
struct thread *td; struct thread *td;
int didswap = 0; struct vmspace *vm;
int minslptime, slptime;
bool didswap;
minslptime = 100000;
didswap = false;
retry: retry:
sx_slock(&allproc_lock); sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) { FOREACH_PROC_IN_SYSTEM(p) {
struct vmspace *vm;
int minslptime = 100000;
int slptime;
PROC_LOCK(p); PROC_LOCK(p);
/* /*
* Watch out for a process in * Watch out for a process in
@ -793,17 +787,20 @@ retry:
goto nextproc; goto nextproc;
/* /*
* only aiod changes vmspace, however it will be * Only aiod changes vmspace. However, it will be
* skipped because of the if statement above checking * skipped because of the if statement above checking
* for P_SYSTEM * for P_SYSTEM.
*/ */
if ((p->p_flag & (P_INMEM|P_SWAPPINGOUT|P_SWAPPINGIN)) != P_INMEM) if ((p->p_flag & (P_INMEM | P_SWAPPINGOUT | P_SWAPPINGIN)) !=
P_INMEM)
goto nextproc; goto nextproc;
switch (p->p_state) { switch (p->p_state) {
default: default:
/* Don't swap out processes in any sort /*
* of 'special' state. */ * Don't swap out processes in any sort
* of 'special' state.
*/
break; break;
case PRS_NORMAL: case PRS_NORMAL:
@ -846,9 +843,9 @@ retry:
* idle processes >= swap_idle_threshold2, * idle processes >= swap_idle_threshold2,
* then swap the process out. * then swap the process out.
*/ */
if (((action & VM_SWAP_NORMAL) == 0) && if ((action & VM_SWAP_NORMAL) == 0 &&
(((action & VM_SWAP_IDLE) == 0) || ((action & VM_SWAP_IDLE) == 0 ||
(slptime < swap_idle_threshold2))) { slptime < swap_idle_threshold2)) {
thread_unlock(td); thread_unlock(td);
goto nextproc; goto nextproc;
} }
@ -863,12 +860,12 @@ retry:
* or if this process is idle and the system is * or if this process is idle and the system is
* configured to swap proactively, swap it out. * configured to swap proactively, swap it out.
*/ */
if ((action & VM_SWAP_NORMAL) || if ((action & VM_SWAP_NORMAL) != 0 ||
((action & VM_SWAP_IDLE) && ((action & VM_SWAP_IDLE) != 0 &&
(minslptime > swap_idle_threshold2))) { minslptime > swap_idle_threshold2)) {
_PRELE(p); _PRELE(p);
if (swapout(p) == 0) if (swapout(p) == 0)
didswap++; didswap = true;
PROC_UNLOCK(p); PROC_UNLOCK(p);
vm_map_unlock(&vm->vm_map); vm_map_unlock(&vm->vm_map);
vmspace_free(vm); vmspace_free(vm);
@ -938,9 +935,10 @@ swapout(struct proc *p)
P_INMEM, ("swapout: lost a swapout race?")); P_INMEM, ("swapout: lost a swapout race?"));
/* /*
* remember the process resident count * Remember the resident count.
*/ */
p->p_vmspace->vm_swrss = vmspace_resident_count(p->p_vmspace); p->p_vmspace->vm_swrss = vmspace_resident_count(p->p_vmspace);
/* /*
* Check and mark all threads before we proceed. * Check and mark all threads before we proceed.
*/ */