Hello,
I've found an other spl lock lease failure.
It's in an architecture which i couldn't test.
But, I think the diff should work.
bye,
Jan
Index: pmap.c
===================================================================
RCS file: /mount/cvsdev/cvs/openbsd/src/sys/arch/solbourne/solbourne/pmap.c,v
retrieving revision 1.5
diff -u -w -p -r1.5 pmap.c
--- pmap.c 30 May 2011 22:25:22 -0000 1.5
+++ pmap.c 2 Dec 2011 15:46:08 -0000
@@ -915,9 +915,10 @@ pmap_enter(struct pmap *pmap, vaddr_t va
if ((pte = pmap_grow_pte(pmap, va)) == NULL) {
DPRINTF(PDB_ENTER, (" -> pmap_grow_pte failed\n"));
- if (flags & PMAP_CANFAIL)
+ if (flags & PMAP_CANFAIL) {
+ splx(s);
return (ENOMEM);
- else
+ } else
panic("pmap_enter: unable to allocate PT");
}
@@ -974,9 +975,10 @@ pmap_enter(struct pmap *pmap, vaddr_t va
if (cur == NULL) {
cur = pool_get(&pvpool, PR_NOWAIT);
if (cur == NULL) {
- if (flags & PMAP_CANFAIL)
+ if (flags & PMAP_CANFAIL) {
+ splx(s);
return (ENOMEM);
- else
+ } else
panic("pmap_enter: "
"pvlist pool exhausted");
}
@@ -1210,7 +1212,7 @@ pg_flushcache(struct vm_page *pg)
pvl = pg_to_pvl(pg);
if (pvl->pv_pmap == NULL)
- return;
+ goto out;
/*
* Since cache_flush_page() causes the whole cache to be flushed,
@@ -1219,6 +1221,7 @@ pg_flushcache(struct vm_page *pg)
/* for (; pvl != NULL; pvl = pvl->pv_next) */
cache_flush_page(pvl->pv_va);
+ out:
splx(s);
}