git: 9front

Download patch

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