git: 13a1129d700c - main - vm: Remove kernel stack swapping support, part 1
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 29 Jul 2024 01:49:52 UTC
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=13a1129d700cee67107c1a146f9c6e8bea372644 commit 13a1129d700cee67107c1a146f9c6e8bea372644 Author: Mark Johnston <markj@FreeBSD.org> AuthorDate: 2024-07-29 01:38:21 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2024-07-29 01:38:21 +0000 vm: Remove kernel stack swapping support, part 1 - Disconnect the swapout daemon from the page daemon. - Remove swapout() and swapout_procs(). Tested by: pho Reviewed by: alc, imp, kib Differential Revision: https://reviews.freebsd.org/D46112 --- sys/vm/vm_pageout.c | 12 --- sys/vm/vm_pageout.h | 3 - sys/vm/vm_swapout.c | 239 +--------------------------------------------- sys/vm/vm_swapout_dummy.c | 10 -- 4 files changed, 1 insertion(+), 263 deletions(-) diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 61f02eeb2f11..cdc97637bbef 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -1764,24 +1764,12 @@ vm_pageout_inactive(struct vm_domain *vmd, int shortage, int *addl_shortage) vm_pagequeue_unlock(pq); } - /* - * Wakeup the swapout daemon if we didn't free the targeted number of - * pages. - */ - if (page_shortage > 0) - vm_swapout_run(); - /* * If the inactive queue scan fails repeatedly to meet its * target, kill the largest process. */ vm_pageout_mightbe_oom(vmd, page_shortage, starting_page_shortage); - /* - * Reclaim pages by swapping out idle processes, if configured to do so. - */ - vm_swapout_run_idle(); - /* * See the description of addl_page_shortage above. */ diff --git a/sys/vm/vm_pageout.h b/sys/vm/vm_pageout.h index cc6c718affb1..a6cdfafe743b 100644 --- a/sys/vm/vm_pageout.h +++ b/sys/vm/vm_pageout.h @@ -103,8 +103,5 @@ void vm_wait_severe(void); int vm_pageout_flush(vm_page_t *, int, int, int, int *, boolean_t *); void vm_pageout_oom(int shortage); -void vm_swapout_run(void); -void vm_swapout_run_idle(void); - #endif /* _KERNEL */ #endif /* _VM_VM_PAGEOUT_H_ */ diff --git a/sys/vm/vm_swapout.c b/sys/vm/vm_swapout.c index 20b975f252e9..85708d61d849 100644 --- a/sys/vm/vm_swapout.c +++ b/sys/vm/vm_swapout.c @@ -154,7 +154,6 @@ SYSCTL_INT(_vm, OID_AUTO, vmdaemon_timeout, CTLFLAG_RW, &vm_daemon_timeout, 0, "Time between vmdaemon runs"); -static int vm_pageout_req_swapout; /* XXX */ static int vm_daemon_needed; static struct mtx vm_daemon_mtx; /* Allow for use by vm_pageout before vm_daemon is initialized. */ @@ -165,12 +164,8 @@ static int swap_inprogress; /* Pending swap-ins done outside swapper. */ static int last_swapin; static void swapclear(struct proc *); -static int swapout(struct proc *); static void vm_swapout_map_deactivate_pages(vm_map_t, long); static void vm_swapout_object_deactivate(pmap_t, vm_object_t, long); -static void swapout_procs(int action); -static void vm_req_vmdaemon(int req); -static void vm_thread_swapout(struct thread *td); static void vm_swapout_object_deactivate_page(pmap_t pmap, vm_page_t m, bool unmap) @@ -322,49 +317,6 @@ vm_swapout_map_deactivate_pages(vm_map_t map, long desired) vm_map_unlock_read(map); } -/* - * Swap out requests - */ -#define VM_SWAP_NORMAL 1 -#define VM_SWAP_IDLE 2 - -void -vm_swapout_run(void) -{ - - if (vm_swap_enabled) - vm_req_vmdaemon(VM_SWAP_NORMAL); -} - -/* - * Idle process swapout -- run once per second when pagedaemons are - * reclaiming pages. - */ -void -vm_swapout_run_idle(void) -{ - static long lsec; - - if (!vm_swap_idle_enabled || time_second == lsec) - return; - vm_req_vmdaemon(VM_SWAP_IDLE); - lsec = time_second; -} - -static void -vm_req_vmdaemon(int req) -{ - static int lastrun = 0; - - mtx_lock(&vm_daemon_mtx); - vm_pageout_req_swapout |= req; - if ((ticks > (lastrun + hz)) || (ticks < lastrun)) { - wakeup(&vm_daemon_needed); - lastrun = ticks; - } - mtx_unlock(&vm_daemon_mtx); -} - static void vm_daemon(void) { @@ -372,7 +324,7 @@ vm_daemon(void) struct proc *p; struct thread *td; struct vmspace *vm; - int breakout, swapout_flags, tryagain, attempts; + int breakout, tryagain, attempts; #ifdef RACCT uint64_t rsize, ravailable; @@ -384,18 +336,7 @@ vm_daemon(void) mtx_lock(&vm_daemon_mtx); msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", vm_daemon_timeout); - swapout_flags = vm_pageout_req_swapout; - vm_pageout_req_swapout = 0; mtx_unlock(&vm_daemon_mtx); - if (swapout_flags != 0) { - /* - * Drain the per-CPU page queue batches as a deadlock - * avoidance measure. - */ - if ((swapout_flags & VM_SWAP_NORMAL) != 0) - vm_page_pqbatch_drain(); - swapout_procs(swapout_flags); - } /* * scan the processes for exceeding their rlimits or if @@ -520,36 +461,6 @@ again: } } -/* - * Allow a thread's kernel stack to be paged out. - */ -static void -vm_thread_swapout(struct thread *td) -{ - vm_page_t m; - vm_offset_t kaddr; - vm_pindex_t pindex; - int i, pages; - vm_object_t obj; - - cpu_thread_swapout(td); - kaddr = td->td_kstack; - pages = td->td_kstack_pages; - obj = vm_thread_kstack_size_to_obj(pages); - pindex = vm_kstack_pindex(kaddr, pages); - pmap_qremove(kaddr, pages); - VM_OBJECT_WLOCK(obj); - for (i = 0; i < pages; i++) { - m = vm_page_lookup(obj, pindex + i); - if (m == NULL) - panic("vm_thread_swapout: kstack already missing?"); - vm_page_dirty(m); - vm_page_xunbusy_unchecked(m); - vm_page_unwire(m, PQ_LAUNDRY); - } - VM_OBJECT_WUNLOCK(obj); -} - /* * Bring the kernel stack for a specified thread back in. */ @@ -773,100 +684,6 @@ swapper(void) } } -/* - * First, if any processes have been sleeping or stopped for at least - * "swap_idle_threshold1" seconds, they are swapped out. If, however, - * no such processes exist, then the longest-sleeping or stopped - * process is swapped out. Finally, and only as a last resort, if - * there are no sleeping or stopped processes, the longest-resident - * process is swapped out. - */ -static void -swapout_procs(int action) -{ - struct proc *p; - struct thread *td; - int slptime; - bool didswap, doswap; - - MPASS((action & (VM_SWAP_NORMAL | VM_SWAP_IDLE)) != 0); - - didswap = false; - sx_slock(&allproc_lock); - FOREACH_PROC_IN_SYSTEM(p) { - /* - * Filter out not yet fully constructed processes. Do - * not swap out held processes. Avoid processes which - * are system, exiting, execing, traced, already swapped - * out or are in the process of being swapped in or out. - */ - PROC_LOCK(p); - if (p->p_state != PRS_NORMAL || p->p_lock != 0 || (p->p_flag & - (P_SYSTEM | P_WEXIT | P_INEXEC | P_STOPPED_SINGLE | - P_TRACED | P_SWAPPINGOUT | P_SWAPPINGIN | P_INMEM)) != - P_INMEM) { - PROC_UNLOCK(p); - continue; - } - - /* - * Further consideration of this process for swap out - * requires iterating over its threads. We release - * allproc_lock here so that process creation and - * destruction are not blocked while we iterate. - * - * To later reacquire allproc_lock and resume - * iteration over the allproc list, we will first have - * to release the lock on the process. We place a - * hold on the process so that it remains in the - * allproc list while it is unlocked. - */ - _PHOLD_LITE(p); - sx_sunlock(&allproc_lock); - - /* - * Do not swapout a realtime process. - * Guarantee swap_idle_threshold1 time in memory. - * If the system is under memory stress, or if we are - * swapping idle processes >= swap_idle_threshold2, - * then swap the process out. - */ - doswap = true; - FOREACH_THREAD_IN_PROC(p, td) { - thread_lock(td); - slptime = (ticks - td->td_slptick) / hz; - if (PRI_IS_REALTIME(td->td_pri_class) || - slptime < swap_idle_threshold1 || - !thread_safetoswapout(td) || - ((action & VM_SWAP_NORMAL) == 0 && - slptime < swap_idle_threshold2)) - doswap = false; - thread_unlock(td); - if (!doswap) - break; - } - if (doswap && swapout(p) == 0) - didswap = true; - - PROC_UNLOCK(p); - if (didswap) { - sx_xlock(&allproc_lock); - swapped_cnt++; - sx_downgrade(&allproc_lock); - } else - sx_slock(&allproc_lock); - PRELE(p); - } - sx_sunlock(&allproc_lock); - - /* - * If we swapped something out, and another process needed memory, - * then wakeup the sched process. - */ - if (didswap) - wakeup(&proc0); -} - static void swapclear(struct proc *p) { @@ -896,57 +713,3 @@ swapclear(struct proc *p) p->p_flag &= ~(P_SWAPPINGIN | P_SWAPPINGOUT); p->p_flag |= P_INMEM; } - -static int -swapout(struct proc *p) -{ - struct thread *td; - - PROC_LOCK_ASSERT(p, MA_OWNED); - - /* - * The states of this process and its threads may have changed - * by now. Assuming that there is only one pageout daemon thread, - * this process should still be in memory. - */ - KASSERT((p->p_flag & (P_INMEM | P_SWAPPINGOUT | P_SWAPPINGIN)) == - P_INMEM, ("swapout: lost a swapout race?")); - - /* - * Remember the resident count. - */ - p->p_vmspace->vm_swrss = vmspace_resident_count(p->p_vmspace); - - /* - * Check and mark all threads before we proceed. - */ - p->p_flag &= ~P_INMEM; - p->p_flag |= P_SWAPPINGOUT; - FOREACH_THREAD_IN_PROC(p, td) { - thread_lock(td); - if (!thread_safetoswapout(td)) { - thread_unlock(td); - swapclear(p); - return (EBUSY); - } - td->td_flags &= ~TDF_INMEM; - TD_SET_SWAPPED(td); - thread_unlock(td); - } - td = FIRST_THREAD_IN_PROC(p); - ++td->td_ru.ru_nswap; - PROC_UNLOCK(p); - - /* - * This list is stable because all threads are now prevented from - * running. The list is only modified in the context of a running - * thread in this process. - */ - FOREACH_THREAD_IN_PROC(p, td) - vm_thread_swapout(td); - - PROC_LOCK(p); - p->p_flag &= ~P_SWAPPINGOUT; - p->p_swtick = ticks; - return (0); -} diff --git a/sys/vm/vm_swapout_dummy.c b/sys/vm/vm_swapout_dummy.c index bf0fd7b5aa5d..0e0a268c8c46 100644 --- a/sys/vm/vm_swapout_dummy.c +++ b/sys/vm/vm_swapout_dummy.c @@ -91,16 +91,6 @@ SYSCTL_INT(_vm, OID_AUTO, swap_idle_enabled, CTLFLAG_RD, &vm_swap_idle_enabled, 0, "Allow swapout on idle criteria"); -void -vm_swapout_run(void) -{ -} - -void -vm_swapout_run_idle(void) -{ -} - void faultin(struct proc *p) {