From 9d43029ff984435111eff658308a44b4f3eee1cc Mon Sep 17 00:00:00 2001 From: qwx Date: Wed, 19 Jan 2022 22:58:53 +0000 Subject: [PATCH] page: performance fixes - fix showpage1 only decrementing proc counter once limit is reached; this blocked having more than one loadpages process after NPROC calls, since the next one has to wait until the last has exited - allow procs to skip pages currently being loaded by others; this forced processes to wait for each other at the same page - bump NPROC from 4 to 8 - (hack) immediately fork a few times after adding all pages at startup to force loading a batch of pages in parallel --- sys/src/cmd/page.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/sys/src/cmd/page.c b/sys/src/cmd/page.c index 901b21215..2c260cc9a 100644 --- a/sys/src/cmd/page.c +++ b/sys/src/cmd/page.c @@ -54,7 +54,7 @@ Image *frame, *paper, *ground; char pagespool[] = "/tmp/pagespool."; enum { - NPROC = 4, + NPROC = 8, NBUF = 8*1024, NPATH = 1024, }; @@ -898,10 +898,6 @@ loadpage(Page *p) { int fd; - qlock(&lru); - llinkhead(p); - qunlock(&lru); - if(p->open != nil && p->image == nil){ fd = openpage(p); if(fd >= 0){ @@ -951,7 +947,11 @@ void loadpages(Page *p, int oviewgen) { while(p != nil && viewgen == oviewgen){ - qlock(p); + qlock(&lru); + llinkhead(p); + qunlock(&lru); + if(!canqlock(p)) + goto next; loadpage(p); if(viewgen != oviewgen){ unloadpage(p); @@ -972,6 +972,7 @@ loadpages(Page *p, int oviewgen) unlockdisplay(display); } qunlock(p); + next: if(p != current && imemsize >= imemlimit) break; /* only one page ahead once we reach the limit */ if(forward < 0){ @@ -1309,16 +1310,17 @@ showpage1(Page *p) writeaddr(p, "/dev/label"); current = p; oviewgen = viewgen; + if(nproc >= NPROC) + waitpid(); switch(rfork(RFPROC|RFMEM)){ case -1: sysfatal("rfork: %r"); case 0: loadpages(p, oviewgen); + nproc--; exits(nil); } - if(++nproc >= NPROC) - if(waitpid() > 0) - nproc--; + nproc++; } /* recursive display lock, called from main proc only */ @@ -1691,6 +1693,8 @@ main(int argc, char *argv[]) addpage(root, "stdin", popenfile, strdup("/fd/0"), -1); for(; *argv; argv++) addpage(root, *argv, popenfile, strdup(*argv), -1); + for(i=0; i