summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-10-25 02:42:35 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-10-25 02:42:35 +0200
commitc7c7e7ee2afcb21f5523d6b66e539befe2b93b01 (patch)
tree95b780eab4082c83e163ffdaac56cc4bd0b5b1e0 /sys/src
parentb66c4a6232489ede3bfe29b813d5fee0a66dc11f (diff)
kernel: disable freelist page caching for executables run from uncached mount
the image cache has the property of keeping a channel for the executable binary arround which prevents the mountpoint from going away. this can easily be reproduced by running: @{rfork n; ramfs; cp /bin/echo /tmp; /tmp/echo} observe how ramfs stays arround until the image is reclaimed. the echo binary is also cached but is unreachable from any namespace. we now restrict the caching to mounts that use the client cache (-C flag) only. this should always be the case for /bin. places where this isnt the case might observe a performance regression.
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/port/page.c7
-rw-r--r--sys/src/9/port/portdat.h3
-rw-r--r--sys/src/9/port/segment.c1
3 files changed, 8 insertions, 3 deletions
diff --git a/sys/src/9/port/page.c b/sys/src/9/port/page.c
index e8c5b6ce0..50cb4efca 100644
--- a/sys/src/9/port/page.c
+++ b/sys/src/9/port/page.c
@@ -228,6 +228,9 @@ putpage(Page *p)
return;
}
+ if(p->image && p->image->nocache)
+ uncachepage(p);
+
if(p->image && p->image != &swapimage)
pagechaintail(p);
else
@@ -291,8 +294,8 @@ duppage(Page *p) /* Always call with p locked */
return;
}
- /* No freelist cache when memory is very low */
- if(palloc.freecount < swapalloc.highwater) {
+ /* No freelist cache with uncached image or when memory is very low */
+ if(p->image->nocache || palloc.freecount < swapalloc.highwater) {
unlock(&palloc);
uncachepage(p);
return;
diff --git a/sys/src/9/port/portdat.h b/sys/src/9/port/portdat.h
index 84545077b..2cad12930 100644
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -352,7 +352,8 @@ struct Image
Segment *s; /* TEXT segment for image if running */
Image *hash; /* Qid hash chains */
Image *next; /* Free list */
- int notext; /* no file associated */
+ char notext; /* no file associated */
+ char nocache; /* no freelist page caching */
};
struct Pte
diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c
index c71eb43e6..1e263fd43 100644
--- a/sys/src/9/port/segment.c
+++ b/sys/src/9/port/segment.c
@@ -275,6 +275,7 @@ attachimage(int type, Chan *c, ulong base, ulong len)
lock(i);
incref(c);
+ i->nocache = (c->flag & CCACHE) == 0;
c->flag &= ~CCACHE;
i->c = c;
i->type = c->type;