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:
parent
fcb9abccbb
commit
8ed25f24b7
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue