kernel: cachedel() lock order, lookpage, cleanup

the lock order of page.Lock -> palloc.hashlock was
violated in cachedel() which is called from the
pager. change the code to do it in the right oder
to prevent deadlock.

change lookpage to retry on false hit. i assume that
a false hit means:

a) we'r low on memory -> cached page got uncached/reused

b) duppage() got called on the page, meaning theres another
cached copy in the image now.

paging in is expensive compared to the hashtable lookup, so
i think retrying is better.

cleanup fixfault, adding comments.
This commit is contained in:
cinap_lenrek 2012-10-16 14:12:21 +02:00
parent 1335be8276
commit 45b99937be
2 changed files with 29 additions and 19 deletions

View file

@ -140,15 +140,20 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu)
lkp = *pg;
lock(lkp);
if(lkp->ref < 1)
panic("fault: lkp->ref %d < 1", lkp->ref);
ref = lkp->ref;
if(ref == 0)
panic("fault %#p ref == 0", lkp);
if(lkp->image == &swapimage)
ref = lkp->ref + swapcount(lkp->daddr);
else
ref = lkp->ref;
if(ref == 1 && lkp->image){
/* save a copy of the original for the image cache */
ref += swapcount(lkp->daddr);
if(ref == 1 && lkp->image) {
/*
* save a copy of the original for the image cache
* and uncache the page. page might temporarily be
* unlocked while trying to acquire palloc lock so
* recheck ref in case it got grabbed.
*/
duppage(lkp);
ref = lkp->ref;
}
unlock(lkp);