Module Name: src Committed By: rmind Date: Fri Jan 8 12:10:46 UTC 2010
Modified Files: src/sys/kern: kern_softint.c Log Message: softint_execute: release/re-acquire kernel-lock depending on SOFTINT_MPSAFE flag. Keeping it held for MP-safe cases break the lock order assumptions. Per discussion with <martin>. To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/sys/kern/kern_softint.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_softint.c diff -u src/sys/kern/kern_softint.c:1.29 src/sys/kern/kern_softint.c:1.30 --- src/sys/kern/kern_softint.c:1.29 Sun Jul 19 10:11:55 2009 +++ src/sys/kern/kern_softint.c Fri Jan 8 12:10:46 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_softint.c,v 1.29 2009/07/19 10:11:55 yamt Exp $ */ +/* $NetBSD: kern_softint.c,v 1.30 2010/01/08 12:10:46 rmind Exp $ */ /*- * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc. @@ -176,7 +176,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_softint.c,v 1.29 2009/07/19 10:11:55 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_softint.c,v 1.30 2010/01/08 12:10:46 rmind Exp $"); #include <sys/param.h> #include <sys/malloc.h> @@ -527,7 +527,12 @@ splx(s); /* Run the handler. */ - if ((sh->sh_flags & SOFTINT_MPSAFE) == 0 && !havelock) { + if (sh->sh_flags & SOFTINT_MPSAFE) { + if (havelock) { + KERNEL_UNLOCK_ONE(l); + havelock = false; + } + } else if (!havelock) { KERNEL_LOCK(1, l); havelock = true; }