Module Name:    src
Committed By:   rmind
Date:           Sat Apr 16 20:39:18 UTC 2011

Modified Files:
        src/sys/kern: uipc_sem.c

Log Message:
- Add nsems_total and track the use of all semaphores (not only named ones).
  Prevents ksem module from unloading while anonymous semaphore(s) are in use.
- ksem_free: add few asserts.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/kern/uipc_sem.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/uipc_sem.c
diff -u src/sys/kern/uipc_sem.c:1.33 src/sys/kern/uipc_sem.c:1.34
--- src/sys/kern/uipc_sem.c:1.33	Fri Apr 15 00:01:48 2011
+++ src/sys/kern/uipc_sem.c	Sat Apr 16 20:39:18 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_sem.c,v 1.33 2011/04/15 00:01:48 rmind Exp $	*/
+/*	$NetBSD: uipc_sem.c,v 1.34 2011/04/16 20:39:18 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -60,11 +60,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.33 2011/04/15 00:01:48 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.34 2011/04/16 20:39:18 rmind Exp $");
 
 #include <sys/param.h>
-#include <sys/systm.h>
 #include <sys/kernel.h>
+
+#include <sys/atomic.h>
 #include <sys/proc.h>
 #include <sys/ksem.h>
 #include <sys/syscall.h>
@@ -104,6 +105,7 @@
 
 static kmutex_t		ksem_lock	__cacheline_aligned;
 static LIST_HEAD(,ksem)	ksem_head	__cacheline_aligned;
+static u_int		nsems_total	__cacheline_aligned;
 static u_int		nsems		__cacheline_aligned;
 
 static int		ksem_sysinit(void);
@@ -141,9 +143,10 @@
 {
 	int error;
 
-	nsems = 0;
 	mutex_init(&ksem_lock, MUTEX_DEFAULT, IPL_NONE);
 	LIST_INIT(&ksem_head);
+	nsems_total = 0;
+	nsems = 0;
 
 	error = syscall_establish(NULL, ksem_syscalls);
 	if (error) {
@@ -162,7 +165,11 @@
 		if (error != 0) {
 			return error;
 		}
-		if (nsems != 0) {
+		/*
+		 * Make sure that no semaphores are in use.  Note: semops
+		 * must be unused at this point.
+		 */
+		if (nsems_total) {
 			error = syscall_establish(NULL, ksem_syscalls);
 			KASSERT(error == 0);
 			return EBUSY;
@@ -296,6 +303,7 @@
 	ks->ks_uid = kauth_cred_geteuid(uc);
 	ks->ks_gid = kauth_cred_getegid(uc);
 
+	atomic_inc_uint(&nsems_total);
 	*ksret = ks;
 	return 0;
 }
@@ -304,6 +312,9 @@
 ksem_free(ksem_t *ks)
 {
 
+	KASSERT(ks->ks_ref == 0);
+	KASSERT(!cv_has_waiters(&ks->ks_cv));
+
 	if (ks->ks_name) {
 		KASSERT(ks->ks_namelen > 0);
 		kmem_free(ks->ks_name, ks->ks_namelen);
@@ -311,6 +322,8 @@
 	mutex_destroy(&ks->ks_lock);
 	cv_destroy(&ks->ks_cv);
 	kmem_free(ks, sizeof(ksem_t));
+
+	atomic_dec_uint(&nsems_total);
 }
 
 int

Reply via email to