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.
This commit is contained in:
cinap_lenrek 2013-10-25 02:42:35 +02:00
parent b66c4a6232
commit c7c7e7ee2a
3 changed files with 8 additions and 3 deletions

View file

@ -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;

View file

@ -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

View file

@ -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;