kernel: various cleanups of imagereclaim(), pagereclaim(), freepages(), putimage()

imagereclaim(), pagereclaim():
- move imagereclaim() and pagereclaim() declarations to portfns.h
- consistently use ulong type for page counts
- name number of pages to free "pages" instead of "min"
- check for pages == 0 on entry

freepages():
- move pagechaindone() call to wakeup newpage() consumers inside
  palloc critical section.

putimage():
- use long type for refcount
This commit is contained in:
cinap_lenrek 2015-07-09 00:01:50 +02:00
parent fcb9abccbb
commit 8ed25f24b7
4 changed files with 37 additions and 35 deletions

View file

@ -83,22 +83,25 @@ pagechaindone(void)
} }
static void static void
freepages(Page *head, Page *tail, int n) freepages(Page *head, Page *tail, ulong np)
{ {
lock(&palloc); lock(&palloc);
tail->next = palloc.head; tail->next = palloc.head;
palloc.head = head; palloc.head = head;
palloc.freecount += n; palloc.freecount += np;
unlock(&palloc);
pagechaindone(); pagechaindone();
unlock(&palloc);
} }
int ulong
pagereclaim(Image *i, int min) pagereclaim(Image *i, ulong pages)
{ {
Page **h, **l, **x, *p; Page **h, **l, **x, *p;
Page *fh, *ft; Page *fh, *ft;
int n; ulong np;
if(pages == 0)
return 0;
lock(i); lock(i);
if(i->pgref == 0){ if(i->pgref == 0){
@ -107,7 +110,7 @@ pagereclaim(Image *i, int min)
} }
incref(i); incref(i);
n = 0; np = 0;
fh = ft = nil; fh = ft = nil;
for(h = i->pghash; h < &i->pghash[PGHSIZE]; h++){ for(h = i->pghash; h < &i->pghash[PGHSIZE]; h++){
l = h; l = h;
@ -133,16 +136,16 @@ pagereclaim(Image *i, int min)
else else
ft->next = p; ft->next = p;
ft = p; ft = p;
if(++n >= min) if(++np >= pages)
break; break;
} }
unlock(i); unlock(i);
putimage(i); putimage(i);
if(n > 0) if(np > 0)
freepages(fh, ft, n); freepages(fh, ft, np);
return n; return np;
} }
static int static int

View file

@ -131,6 +131,7 @@ long ibrk(uintptr, int);
void ilock(Lock*); void ilock(Lock*);
void interrupted(void); void interrupted(void);
void iunlock(Lock*); void iunlock(Lock*);
ulong imagereclaim(ulong);
long incref(Ref*); long incref(Ref*);
void initseg(void); void initseg(void);
int iprint(char*, ...); int iprint(char*, ...);
@ -204,7 +205,8 @@ Block* padblock(Block*, int);
void pagechaindone(void); void pagechaindone(void);
void pagechainhead(Page*); void pagechainhead(Page*);
void pageinit(void); void pageinit(void);
ulong pagenumber(Page*); ulong pagenumber(Page*);
ulong pagereclaim(Image*, ulong);
void pagersummary(void); void pagersummary(void);
void panic(char*, ...); void panic(char*, ...);
Cmdbuf* parsecmd(char *a, int n); Cmdbuf* parsecmd(char *a, int n);

View file

@ -5,8 +5,6 @@
#include "fns.h" #include "fns.h"
#include "../port/error.h" #include "../port/error.h"
int imagereclaim(int);
/* /*
* Attachable segment types * Attachable segment types
*/ */
@ -295,20 +293,22 @@ found:
return i; return i;
} }
extern int pagereclaim(Image*, int); /* page.c */ ulong
imagereclaim(ulong pages)
int
imagereclaim(int min)
{ {
static Image *i, *ie; static Image *i, *ie;
int j, n; ulong np;
int j;
if(pages == 0)
return 0;
eqlock(&imagealloc.ireclaim); eqlock(&imagealloc.ireclaim);
if(i == nil){ if(i == nil){
i = imagealloc.list; i = imagealloc.list;
ie = &imagealloc.list[conf.nimage]; ie = &imagealloc.list[conf.nimage];
} }
n = 0; np = 0;
for(j = 0; j < conf.nimage; j++, i++){ for(j = 0; j < conf.nimage; j++, i++){
if(i >= ie) if(i >= ie)
i = imagealloc.list; i = imagealloc.list;
@ -319,14 +319,14 @@ imagereclaim(int min)
* reclaim pages from inactive images. * reclaim pages from inactive images.
*/ */
if(imagealloc.free != nil || i->ref == i->pgref){ if(imagealloc.free != nil || i->ref == i->pgref){
n += pagereclaim(i, min - n); np += pagereclaim(i, pages - np);
if(n >= min) if(np >= pages)
break; break;
} }
} }
qunlock(&imagealloc.ireclaim); qunlock(&imagealloc.ireclaim);
return n; return np;
} }
void void
@ -334,7 +334,7 @@ putimage(Image *i)
{ {
Image *f, **l; Image *f, **l;
Chan *c; Chan *c;
int r; long r;
if(i->notext){ if(i->notext){
decref(i); decref(i);

View file

@ -118,25 +118,22 @@ kickpager(void)
kproc("pager", pager, 0); kproc("pager", pager, 0);
} }
extern int pagereclaim(Image*,int); /* page.c */
extern int imagereclaim(int); /* segment.c */
static int static int
reclaim(void) reclaim(void)
{ {
int n; ulong np;
for(;;){ for(;;){
if((n = pagereclaim(&fscache, 1000)) > 0) { if((np = pagereclaim(&fscache, 1000)) > 0) {
if(0) print("reclaim: %d fscache\n", n); if(0) print("reclaim: %lud fscache\n", np);
} else if((n = pagereclaim(&swapimage, 1000)) > 0) { } else if((np = pagereclaim(&swapimage, 1000)) > 0) {
if(0) print("reclaim: %d swap\n", n); if(0) print("reclaim: %lud swap\n", np);
} else if((n = imagereclaim(1000)) > 0) { } else if((np = imagereclaim(1000)) > 0) {
if(0) print("reclaim: %d image\n", n); if(0) print("reclaim: %lud image\n", np);
} }
if(!needpages(nil)) if(!needpages(nil))
return 1; /* have pages, done */ return 1; /* have pages, done */
if(n == 0) if(np == 0)
return 0; /* didnt reclaim, need to swap */ return 0; /* didnt reclaim, need to swap */
sched(); sched();
} }