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); }