]> git.lizzy.rs Git - plan9front.git/commitdiff
kernel: make pagereclaim() a bit less stupid
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sat, 7 Feb 2015 02:01:59 +0000 (03:01 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sat, 7 Feb 2015 02:01:59 +0000 (03:01 +0100)
put recently used pages at the head of ther image hash
chains, and reclaim pages from the tail first.

sys/src/9/port/page.c

index c33b1ec6b7992a1937f671f81ef762e626f7671a..dcd70126755c04bab4bb13a251f5ca2986f99346 100644 (file)
@@ -86,7 +86,7 @@ freepages(Page *head, Page *tail, int n)
 int
 pagereclaim(Image *i, int min)
 {
-       Page **h, **l, *p;
+       Page **h, **l, **x, *p;
        Page *fh, *ft;
        int n;
 
@@ -100,17 +100,18 @@ pagereclaim(Image *i, int min)
        n = 0;
        fh = ft = nil;
        for(h = i->pghash; h < &i->pghash[PGHSIZE]; h++){
-               if((p = *h) == nil)
-                       continue;
-               for(l = h; p != nil; p = p->next){
+               l = h;
+               x = nil;
+               for(p = *l; p != nil; p = p->next){
                        if(p->ref == 0)
-                               break;
+                               x = l;
                        l = &p->next;
                }
-               if(p == nil)
+               if(x == nil)
                        continue;
 
-               *l = p->next;
+               p = *x;
+               *x = p->next;
                p->next = nil;
                p->image = nil;
                p->daddr = ~0;
@@ -315,15 +316,20 @@ uncachepage(Page *p)
 Page*
 lookpage(Image *i, uintptr daddr)
 {
-       Page *p;
+       Page *p, **h, **l;
 
        lock(i);
-       for(p = PGHASH(i, daddr); p != nil; p = p->next) {
-               if(p->daddr == daddr) {
+       l = h = &PGHASH(i, daddr);
+       for(p = *l; p != nil; p = p->next){
+               if(p->daddr == daddr){
+                       *l = p->next;
+                       p->next = *h;
+                       *h = p;
                        incref(p);
                        unlock(i);
                        return p;
                }
+               l = &p->next;
        }
        unlock(i);