On Sun Jun 8 14:17:16 EDT 2014, [email protected] wrote:
> On Sun Jun 8 13:55:52 EDT 2014, [email protected] wrote:
> > right. the question is, how did it vanish from the image cache.
>
> i think it is in the image cache, but .ref >1.
perhaps independent of your question,
my assumption is correct, and proven.
the problem was that pagereclaim() only looked through
pga.pgsza[0], but since 2MiB pages were introduced in nix,
no pages could ever be reclaimed this way, since they would
be in pga.pgsza[1].
i don't think this really addresses your question, or my
original problem though. the corrected version which i think
should work for any architecture is below. i intend to
incorporate charles locking changes later on.
(lock(&lga.pgsza[lg]) instead of the whole thing.)
i think those changes (in the 9atom /sys/src/9 kernels)
are good stuff.
- erik
---
/*
* Called from imagereclaim, to try to release Images.
* The (ignored) argument indicates a preferred image for release.
*/
void
pagereclaim(Image*)
{
int lg, n;
usize sz;
Page *p;
lock(&pga);
/*
* All the pages with images backing them are at the
* end of the list (see putpage) so start there and work
* backward. Assume the smallest page size (BOTCH).
*/
sz = 0;
n = 0;
for(lg = 0; lg < m->npgsz; lg++)
for(p = pga.pgsza[lg].tail; p != nil; p = p->prev){
if(p->image != nil && p->ref == 0 && canlock(p)){
if(p->ref == 0) {
n++;
sz += 1<<m->pgszlg2[lg];
uncachepage(p);
}
unlock(p);
if(sz >= 20*MiB && n>5)
break;
}
}
unlock(&pga);
}