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)
{