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

Reply via email to