ref: 00bfe3ec2bb2f0e5e33130cb32655453e37abba6
parent: 0fc1abc73d813280fbd8e7119391a8c5c3d36b7c
parent: 61a062ee9ff7bbd489baba6dd7c6adb1978e246b
author: cinap_lenrek <[email protected]>
date: Sun Apr 26 15:55:53 EDT 2020
merge
--- a/sys/src/9/port/devswap.c
+++ b/sys/src/9/port/devswap.c
@@ -137,12 +137,12 @@
ulong np;
for(;;){
- if((np = pagereclaim(&fscache, 1000)) > 0) {
- if(0) print("reclaim: %lud fscache\n", np);
- } else if((np = pagereclaim(&swapimage, 1000)) > 0) {
+ if((np = pagereclaim(&fscache) + imagereclaim(0)) > 0){
+ if(0) print("reclaim: %lud fscache + inactive image\n", np);
+ } else if((np = pagereclaim(&swapimage)) > 0) {
if(0) print("reclaim: %lud swap\n", np);
- } else if((np = imagereclaim(1000)) > 0) {
- if(0) print("reclaim: %lud image\n", np);
+ } else if((np = imagereclaim(1)) > 0) {
+ if(0) print("reclaim: %lud active image\n", np);
}
if(!needpages(nil))
return 1; /* have pages, done */
--- a/sys/src/9/port/page.c
+++ b/sys/src/9/port/page.c
@@ -93,15 +93,12 @@
}
ulong
-pagereclaim(Image *i, ulong pages)
+pagereclaim(Image *i)
{
Page **h, **l, **x, *p;
Page *fh, *ft;
ulong np;
- if(pages == 0)
- return 0;
-
lock(i);
if(i->pgref == 0){
unlock(i);
@@ -127,8 +124,6 @@
p->next = nil;
p->image = nil;
p->daddr = ~0;
- i->pgref--;
- decref(i);
if(fh == nil)
fh = p;
@@ -135,10 +130,12 @@
else
ft->next = p;
ft = p;
- if(++np >= pages)
+ np++;
+
+ decref(i);
+ if(--i->pgref == 0)
break;
}
- unlock(i);
putimage(i);
if(np > 0){
@@ -297,7 +294,6 @@
p->image = nil;
p->daddr = ~0;
i->pgref--;
- unlock(i);
putimage(i);
return;
}
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -134,7 +134,7 @@
void interrupted(void);
void iunlock(Lock*);
ulong imagecached(void);
-ulong imagereclaim(ulong);
+ulong imagereclaim(int);
long incref(Ref*);
void init0(void);
void initseg(void);
@@ -213,7 +213,7 @@
void pagechaindone(void);
void pagechainhead(Page*);
void pageinit(void);
-ulong pagereclaim(Image*, ulong);
+ulong pagereclaim(Image*);
void panic(char*, ...);
Cmdbuf* parsecmd(char *a, int n);
void pathclose(Path*);
--- a/sys/src/9/port/segment.c
+++ b/sys/src/9/port/segment.c
@@ -102,7 +102,6 @@
}
if(i->s == s)
i->s = nil;
- unlock(i);
putimage(i);
} else if(decref(s) != 0)
return;
@@ -260,7 +259,7 @@
/* dump pages of inactive images to free image structures */
while((i = imagealloc.free) == nil) {
unlock(&imagealloc);
- if(imagereclaim(1000) == 0 && imagealloc.free == nil){
+ if(imagereclaim(0) == 0 && imagealloc.free == nil){
freebroken(); /* can use the memory */
resrcwait("no image after reclaim");
}
@@ -288,7 +287,6 @@
if(i->s == nil) {
incref(i);
if(waserror()) {
- unlock(i);
putimage(i);
nexterror();
}
@@ -316,15 +314,12 @@
}
ulong
-imagereclaim(ulong pages)
+imagereclaim(int active)
{
static Image *i, *ie;
- ulong np;
int j;
+ ulong np;
- if(pages == 0)
- return 0;
-
eqlock(&imagealloc.ireclaim);
if(i == nil){
i = imagealloc.list;
@@ -334,23 +329,19 @@
for(j = 0; j < conf.nimage; j++, i++){
if(i >= ie)
i = imagealloc.list;
- if(i->ref == 0)
+ if(i->ref == 0 || (i->ref != i->pgref) == !active)
continue;
- /*
- * if there are no free image structures, only
- * reclaim pages from inactive images.
- */
- if(imagealloc.free != nil || i->ref == i->pgref){
- np += pagereclaim(i, pages - np);
- if(np >= pages)
- break;
- }
+ np += pagereclaim(i);
+ if(np >= 1000)
+ goto Done;
}
+Done:
qunlock(&imagealloc.ireclaim);
return np;
}
+/* putimage(): called with image locked and unlocks */
void
putimage(Image *i)
{
@@ -358,14 +349,13 @@
Chan *c;
long r;
+ r = decref(i);
if(i->notext){
- decref(i);
+ unlock(i);
return;
}
c = nil;
- lock(i);
- r = decref(i);
if(r == i->pgref){
/*
* all remaining references to this image are from the