merge
This commit is contained in:
commit
00bfe3ec2b
4 changed files with 23 additions and 37 deletions
|
@ -137,12 +137,12 @@ reclaim(void)
|
||||||
ulong np;
|
ulong np;
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
if((np = pagereclaim(&fscache, 1000)) > 0) {
|
if((np = pagereclaim(&fscache) + imagereclaim(0)) > 0){
|
||||||
if(0) print("reclaim: %lud fscache\n", np);
|
if(0) print("reclaim: %lud fscache + inactive image\n", np);
|
||||||
} else if((np = pagereclaim(&swapimage, 1000)) > 0) {
|
} else if((np = pagereclaim(&swapimage)) > 0) {
|
||||||
if(0) print("reclaim: %lud swap\n", np);
|
if(0) print("reclaim: %lud swap\n", np);
|
||||||
} else if((np = imagereclaim(1000)) > 0) {
|
} else if((np = imagereclaim(1)) > 0) {
|
||||||
if(0) print("reclaim: %lud image\n", np);
|
if(0) print("reclaim: %lud active image\n", np);
|
||||||
}
|
}
|
||||||
if(!needpages(nil))
|
if(!needpages(nil))
|
||||||
return 1; /* have pages, done */
|
return 1; /* have pages, done */
|
||||||
|
|
|
@ -93,15 +93,12 @@ freepages(Page *head, Page *tail, ulong np)
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong
|
ulong
|
||||||
pagereclaim(Image *i, ulong pages)
|
pagereclaim(Image *i)
|
||||||
{
|
{
|
||||||
Page **h, **l, **x, *p;
|
Page **h, **l, **x, *p;
|
||||||
Page *fh, *ft;
|
Page *fh, *ft;
|
||||||
ulong np;
|
ulong np;
|
||||||
|
|
||||||
if(pages == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
lock(i);
|
lock(i);
|
||||||
if(i->pgref == 0){
|
if(i->pgref == 0){
|
||||||
unlock(i);
|
unlock(i);
|
||||||
|
@ -127,18 +124,18 @@ pagereclaim(Image *i, ulong pages)
|
||||||
p->next = nil;
|
p->next = nil;
|
||||||
p->image = nil;
|
p->image = nil;
|
||||||
p->daddr = ~0;
|
p->daddr = ~0;
|
||||||
i->pgref--;
|
|
||||||
decref(i);
|
|
||||||
|
|
||||||
if(fh == nil)
|
if(fh == nil)
|
||||||
fh = p;
|
fh = p;
|
||||||
else
|
else
|
||||||
ft->next = p;
|
ft->next = p;
|
||||||
ft = p;
|
ft = p;
|
||||||
if(++np >= pages)
|
np++;
|
||||||
|
|
||||||
|
decref(i);
|
||||||
|
if(--i->pgref == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
unlock(i);
|
|
||||||
putimage(i);
|
putimage(i);
|
||||||
|
|
||||||
if(np > 0){
|
if(np > 0){
|
||||||
|
@ -297,7 +294,6 @@ uncachepage(Page *p)
|
||||||
p->image = nil;
|
p->image = nil;
|
||||||
p->daddr = ~0;
|
p->daddr = ~0;
|
||||||
i->pgref--;
|
i->pgref--;
|
||||||
unlock(i);
|
|
||||||
putimage(i);
|
putimage(i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,7 +134,7 @@ void ilock(Lock*);
|
||||||
void interrupted(void);
|
void interrupted(void);
|
||||||
void iunlock(Lock*);
|
void iunlock(Lock*);
|
||||||
ulong imagecached(void);
|
ulong imagecached(void);
|
||||||
ulong imagereclaim(ulong);
|
ulong imagereclaim(int);
|
||||||
long incref(Ref*);
|
long incref(Ref*);
|
||||||
void init0(void);
|
void init0(void);
|
||||||
void initseg(void);
|
void initseg(void);
|
||||||
|
@ -213,7 +213,7 @@ Block* padblock(Block*, int);
|
||||||
void pagechaindone(void);
|
void pagechaindone(void);
|
||||||
void pagechainhead(Page*);
|
void pagechainhead(Page*);
|
||||||
void pageinit(void);
|
void pageinit(void);
|
||||||
ulong pagereclaim(Image*, ulong);
|
ulong pagereclaim(Image*);
|
||||||
void panic(char*, ...);
|
void panic(char*, ...);
|
||||||
Cmdbuf* parsecmd(char *a, int n);
|
Cmdbuf* parsecmd(char *a, int n);
|
||||||
void pathclose(Path*);
|
void pathclose(Path*);
|
||||||
|
|
|
@ -102,7 +102,6 @@ putseg(Segment *s)
|
||||||
}
|
}
|
||||||
if(i->s == s)
|
if(i->s == s)
|
||||||
i->s = nil;
|
i->s = nil;
|
||||||
unlock(i);
|
|
||||||
putimage(i);
|
putimage(i);
|
||||||
} else if(decref(s) != 0)
|
} else if(decref(s) != 0)
|
||||||
return;
|
return;
|
||||||
|
@ -260,7 +259,7 @@ attachimage(int type, Chan *c, uintptr base, ulong len)
|
||||||
/* dump pages of inactive images to free image structures */
|
/* dump pages of inactive images to free image structures */
|
||||||
while((i = imagealloc.free) == nil) {
|
while((i = imagealloc.free) == nil) {
|
||||||
unlock(&imagealloc);
|
unlock(&imagealloc);
|
||||||
if(imagereclaim(1000) == 0 && imagealloc.free == nil){
|
if(imagereclaim(0) == 0 && imagealloc.free == nil){
|
||||||
freebroken(); /* can use the memory */
|
freebroken(); /* can use the memory */
|
||||||
resrcwait("no image after reclaim");
|
resrcwait("no image after reclaim");
|
||||||
}
|
}
|
||||||
|
@ -288,7 +287,6 @@ found:
|
||||||
if(i->s == nil) {
|
if(i->s == nil) {
|
||||||
incref(i);
|
incref(i);
|
||||||
if(waserror()) {
|
if(waserror()) {
|
||||||
unlock(i);
|
|
||||||
putimage(i);
|
putimage(i);
|
||||||
nexterror();
|
nexterror();
|
||||||
}
|
}
|
||||||
|
@ -316,14 +314,11 @@ imagecached(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong
|
ulong
|
||||||
imagereclaim(ulong pages)
|
imagereclaim(int active)
|
||||||
{
|
{
|
||||||
static Image *i, *ie;
|
static Image *i, *ie;
|
||||||
ulong np;
|
|
||||||
int j;
|
int j;
|
||||||
|
ulong np;
|
||||||
if(pages == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
eqlock(&imagealloc.ireclaim);
|
eqlock(&imagealloc.ireclaim);
|
||||||
if(i == nil){
|
if(i == nil){
|
||||||
|
@ -334,23 +329,19 @@ imagereclaim(ulong pages)
|
||||||
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;
|
||||||
if(i->ref == 0)
|
if(i->ref == 0 || (i->ref != i->pgref) == !active)
|
||||||
continue;
|
continue;
|
||||||
/*
|
np += pagereclaim(i);
|
||||||
* if there are no free image structures, only
|
if(np >= 1000)
|
||||||
* reclaim pages from inactive images.
|
goto Done;
|
||||||
*/
|
|
||||||
if(imagealloc.free != nil || i->ref == i->pgref){
|
|
||||||
np += pagereclaim(i, pages - np);
|
|
||||||
if(np >= pages)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Done:
|
||||||
qunlock(&imagealloc.ireclaim);
|
qunlock(&imagealloc.ireclaim);
|
||||||
|
|
||||||
return np;
|
return np;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* putimage(): called with image locked and unlocks */
|
||||||
void
|
void
|
||||||
putimage(Image *i)
|
putimage(Image *i)
|
||||||
{
|
{
|
||||||
|
@ -358,14 +349,13 @@ putimage(Image *i)
|
||||||
Chan *c;
|
Chan *c;
|
||||||
long r;
|
long r;
|
||||||
|
|
||||||
|
r = decref(i);
|
||||||
if(i->notext){
|
if(i->notext){
|
||||||
decref(i);
|
unlock(i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = nil;
|
c = nil;
|
||||||
lock(i);
|
|
||||||
r = decref(i);
|
|
||||||
if(r == i->pgref){
|
if(r == i->pgref){
|
||||||
/*
|
/*
|
||||||
* all remaining references to this image are from the
|
* all remaining references to this image are from the
|
||||||
|
|
Loading…
Reference in a new issue