Index: mac_framework.c =================================================================== RCS file: /home/ncvs/src/sys/security/mac/mac_framework.c,v retrieving revision 1.134 diff -u -r1.134 mac_framework.c --- mac_framework.c 29 Dec 2006 20:21:21 -0000 1.134 +++ mac_framework.c 31 Dec 2006 17:04:57 -0000 @@ -179,6 +179,7 @@ static struct mtx mac_policy_mtx; static struct cv mac_policy_cv; static int mac_policy_count; +static int mac_policy_wait; #endif struct mac_policy_list_head mac_policy_list; struct mac_policy_list_head mac_static_policy_list; @@ -202,8 +203,11 @@ WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "mac_policy_grab_exclusive() at %s:%d", __FILE__, __LINE__); mtx_lock(&mac_policy_mtx); - while (mac_policy_count != 0) + while (mac_policy_count != 0) { + mac_policy_wait++; cv_wait(&mac_policy_cv, &mac_policy_mtx); + mac_policy_wait--; + } #endif } @@ -224,15 +228,18 @@ void mac_policy_release_exclusive(void) { - #ifndef MAC_STATIC + int dowakeup; + if (!mac_late) return; KASSERT(mac_policy_count == 0, ("mac_policy_release_exclusive(): not exclusive")); + dowakeup = (mac_policy_wait != 0); mtx_unlock(&mac_policy_mtx); - cv_signal(&mac_policy_cv); + if (dowakeup) + cv_signal(&mac_policy_cv); #endif } @@ -278,17 +285,20 @@ void mac_policy_list_unbusy(void) { - #ifndef MAC_STATIC + int dowakeup; + if (!mac_late) return; mtx_lock(&mac_policy_mtx); mac_policy_count--; KASSERT(mac_policy_count >= 0, ("MAC_POLICY_LIST_LOCK")); - if (mac_policy_count == 0) - cv_signal(&mac_policy_cv); + dowakeup = (mac_policy_count == 0 && mac_policy_wait != 0); mtx_unlock(&mac_policy_mtx); + + if (dowakeup) + cv_signal(&mac_policy_cv); #endif }