ref: c3c3284b0699cf2d84681cc67a1d403f85dbe9e0
parent: 136910c8458cf21e4ffd6cd283ad073584bf0354
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Feb 21 10:06:38 EST 2026
kernel: don't hardcode reclaim page target, use palloc.headroom, kick pager before acquiering pwait queue
--- a/sys/src/9/port/devswap.c
+++ b/sys/src/9/port/devswap.c
@@ -182,16 +182,13 @@
static int
reclaim(void)
{- enum {- Target = 4*MB/BY2PG,
- };
ulong np;
for(;;){np = pagereclaim(fscache);
- if(np < Target)
- np += imagereclaim(Target-np);
- if(np < Target)
+ if(np < swapalloc.headroom)
+ np += imagereclaim(swapalloc.headroom-np);
+ if(np < swapalloc.headroom)
np += pagereclaim(swapimage);
if(!needpages(nil))
return 1; /* have pages, done */
@@ -409,12 +406,6 @@
}
ioptr = j;
if(j) print("executeio (%lud/%lud): %s\n", j, i, up->errstr);-}
-
-int
-needpages(void*)
-{- return palloc.freecount < swapalloc.headroom;
}
static void
--- a/sys/src/9/port/page.c
+++ b/sys/src/9/port/page.c
@@ -162,8 +162,14 @@
return np;
}
+int
+needpages(void*)
+{+ return palloc.freecount < swapalloc.headroom;
+}
+
static int
-ispages(void*)
+havepages(void*)
{return palloc.freecount > swapalloc.highwater || up->noswap && palloc.freecount > 0;
}
@@ -175,11 +181,12 @@
int color;
lock(&palloc);
- while(!ispages(nil)){+ while(!havepages(nil)){unlock(&palloc);
if(locked)
qunlock(locked);
+ kickpager();
if(!waserror()){Rendezq *q;
@@ -186,8 +193,7 @@
q = &palloc.pwait[!up->noswap];
eqlock(q);
if(!waserror()){- kickpager();
- sleep(q, ispages, nil);
+ sleep(q, havepages, nil);
poperror();
}
qunlock(q);
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -580,9 +580,9 @@
Lock;
Page *head; /* freelist head */
ulong freecount; /* how many pages on free list now */
- Page *pages; /* array of all pages */
ulong user; /* how many user pages */
- Rendezq pwait[2]; /* Queues of procs waiting for memory */
+ Page *pages; /* array of all pages */
+ Rendezq pwait[2]; /* Queues of procs waiting for memory */
};
struct Waitq
--
⑨