What is about this patch?
thanks,
Jan
On Fri, Dec 02, 2011 at 06:31:47PM +0100, Jan Klemkow wrote:
> 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);
> }
>
--