Module Name: src
Committed By: christos
Date: Wed Sep 14 12:28:09 UTC 2011
Modified Files:
src/sys/compat/linux/common: linux_futex.c linux_futex.h linux_mod.c
Log Message:
Can't use RUN_ONCE here to initialize the futex_lock, otherwise we cannot
unload the module.
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/compat/linux/common/linux_futex.c
cvs rdiff -u -r1.4 -r1.5 src/sys/compat/linux/common/linux_futex.h
cvs rdiff -u -r1.1 -r1.2 src/sys/compat/linux/common/linux_mod.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/compat/linux/common/linux_futex.c
diff -u src/sys/compat/linux/common/linux_futex.c:1.26 src/sys/compat/linux/common/linux_futex.c:1.27
--- src/sys/compat/linux/common/linux_futex.c:1.26 Tue Jul 6 21:30:35 2010
+++ src/sys/compat/linux/common/linux_futex.c Wed Sep 14 08:28:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_futex.c,v 1.26 2010/07/07 01:30:35 chs Exp $ */
+/* $NetBSD: linux_futex.c,v 1.27 2011/09/14 12:28:08 christos Exp $ */
/*-
* Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.26 2010/07/07 01:30:35 chs Exp $");
+__KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.27 2011/09/14 12:28:08 christos Exp $");
#include <sys/param.h>
#include <sys/time.h>
@@ -42,7 +42,6 @@
#include <sys/queue.h>
#include <sys/condvar.h>
#include <sys/mutex.h>
-#include <sys/once.h>
#include <sys/kmem.h>
#include <sys/kernel.h>
#include <sys/atomic.h>
@@ -92,14 +91,18 @@
#define FUTEXPRINTF(a)
#endif
-static ONCE_DECL(futex_once);
-
-static int
-futex_init(void)
+void
+linux_futex_init(void)
{
- FUTEXPRINTF(("futex_init: initializing futex\n"));
+ FUTEXPRINTF(("%s: initializing futex\n", __func__));
mutex_init(&futex_lock, MUTEX_DEFAULT, IPL_NONE);
- return 0;
+}
+
+void
+linux_futex_fini(void)
+{
+ FUTEXPRINTF(("%s: destroying futex\n", __func__));
+ mutex_destroy(&futex_lock);
}
static struct waiting_proc *futex_wp_alloc(void);
@@ -158,8 +161,6 @@
struct waiting_proc *wp;
int op_ret;
- RUN_ONCE(&futex_once, futex_init);
-
/*
* Our implementation provides only private futexes. Most of the apps
* should use private futexes but don't claim so. Therefore we treat
Index: src/sys/compat/linux/common/linux_futex.h
diff -u src/sys/compat/linux/common/linux_futex.h:1.4 src/sys/compat/linux/common/linux_futex.h:1.5
--- src/sys/compat/linux/common/linux_futex.h:1.4 Tue Jul 6 21:30:35 2010
+++ src/sys/compat/linux/common/linux_futex.h Wed Sep 14 08:28:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_futex.h,v 1.4 2010/07/07 01:30:35 chs Exp $ */
+/* $NetBSD: linux_futex.h,v 1.5 2011/09/14 12:28:08 christos Exp $ */
/*-
* Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@@ -76,5 +76,7 @@
struct linux_sys_futex_args;
int linux_do_futex(struct lwp *, const struct linux_sys_futex_args *,
register_t *, struct timespec *);
+void linux_futex_init(void);
+void linux_futex_fini(void);
#endif /* !_LINUX_FUTEX_H */
Index: src/sys/compat/linux/common/linux_mod.c
diff -u src/sys/compat/linux/common/linux_mod.c:1.1 src/sys/compat/linux/common/linux_mod.c:1.2
--- src/sys/compat/linux/common/linux_mod.c:1.1 Wed Nov 19 13:36:03 2008
+++ src/sys/compat/linux/common/linux_mod.c Wed Sep 14 08:28:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_mod.c,v 1.1 2008/11/19 18:36:03 ad Exp $ */
+/* $NetBSD: linux_mod.c,v 1.2 2011/09/14 12:28:08 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_mod.c,v 1.1 2008/11/19 18:36:03 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_mod.c,v 1.2 2011/09/14 12:28:08 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_execfmt.h"
@@ -46,6 +46,7 @@
#include <sys/signalvar.h>
#include <compat/linux/common/linux_sysctl.h>
+#include <compat/linux/common/linux_futex.h>
#include <compat/linux/common/linux_exec.h>
#if defined(EXEC_ELF32) && ELFSIZE == 32
@@ -111,6 +112,7 @@
switch (cmd) {
case MODULE_CMD_INIT:
+ linux_futex_init();
linux_sysctl_init();
error = exec_add(linux_execsw,
__arraycount(linux_execsw));
@@ -121,8 +123,10 @@
case MODULE_CMD_FINI:
error = exec_remove(linux_execsw,
__arraycount(linux_execsw));
- if (error == 0)
+ if (error == 0) {
linux_sysctl_fini();
+ linux_futex_fini();
+ }
return error;
default: