summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authornetchild <netchild@FreeBSD.org>2006-09-09 16:25:25 +0000
committernetchild <netchild@FreeBSD.org>2006-09-09 16:25:25 +0000
commit2140995733dab01b8715529780b0f015472c6221 (patch)
tree8baf9a85d96af5ccbd1041dde34afb34fc359205 /sys
parent5eee50ca3619c4fd92c6f420733cd71a1d39c3ed (diff)
downloadFreeBSD-src-2140995733dab01b8715529780b0f015472c6221.zip
FreeBSD-src-2140995733dab01b8715529780b0f015472c6221.tar.gz
Change futex lock from mutex to sx. Make futex_get atomic (protected by the
futex lock). Sponsored by: Google SoC 2006 Submitted by: rdivacky Suggested by: jhb
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/linux32/linux32_sysvec.c6
-rw-r--r--sys/compat/linux/linux_futex.c12
-rw-r--r--sys/i386/linux/linux_sysvec.c6
3 files changed, 10 insertions, 14 deletions
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
index 4fa6f14..c6f456b 100644
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -124,7 +124,7 @@ static void exec_linux_setregs(struct thread *td, u_long entry,
static void linux32_fixlimits(struct proc *p);
extern LIST_HEAD(futex_list, futex) futex_list;
-extern struct mtx futex_mtx;
+extern struct sx futex_sx;
static eventhandler_tag linux_exit_tag;
static eventhandler_tag linux_schedtail_tag;
@@ -1080,7 +1080,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
sx_init(&emul_lock, "emuldata lock");
sx_init(&emul_shared_lock, "emuldata->shared lock");
LIST_INIT(&futex_list);
- mtx_init(&futex_mtx, "futex protection lock", NULL, MTX_DEF);
+ sx_init(&futex_sx, "futex protection lock");
linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
NULL, 1000);
linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail, linux_schedtail,
@@ -1110,7 +1110,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
linux_device_unregister_handler(*ldhp);
sx_destroy(&emul_lock);
sx_destroy(&emul_shared_lock);
- mtx_destroy(&futex_mtx);
+ sx_destroy(&futex_sx);
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c
index 513c42d..645c4d6 100644
--- a/sys/compat/linux/linux_futex.c
+++ b/sys/compat/linux/linux_futex.c
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/lock.h>
#include <sys/mutex.h>
+#include <sys/sx.h>
#include <sys/malloc.h>
#ifdef COMPAT_LINUX32
@@ -73,10 +74,10 @@ struct futex {
};
LIST_HEAD(futex_list, futex) futex_list;
-struct mtx futex_mtx; /* this protects the LIST of futexes */
+struct sx futex_sx; /* this protects the LIST of futexes */
-#define FUTEX_LOCK mtx_lock(&futex_mtx)
-#define FUTEX_UNLOCK mtx_unlock(&futex_mtx)
+#define FUTEX_LOCK sx_xlock(&futex_sx)
+#define FUTEX_UNLOCK sx_xunlock(&futex_sx)
#define FUTEX_LOCKED 1
#define FUTEX_UNLOCKED 0
@@ -343,16 +344,11 @@ futex_get(void *uaddr, int locked)
return f;
}
}
- if (locked == FUTEX_UNLOCKED)
- FUTEX_UNLOCK;
- /* Not found, create it */
f = malloc(sizeof(*f), M_LINUX, M_WAITOK);
f->f_uaddr = uaddr;
f->f_refcount = 1;
TAILQ_INIT(&f->f_waiting_proc);
- if (locked == FUTEX_UNLOCKED)
- FUTEX_LOCK;
LIST_INSERT_HEAD(&futex_list, f, f_list);
if (locked == FUTEX_UNLOCKED)
FUTEX_UNLOCK;
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index b6b2cda..9dc804d 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -108,7 +108,7 @@ static void exec_linux_setregs(struct thread *td, u_long entry,
u_long stack, u_long ps_strings);
extern LIST_HEAD(futex_list, futex) futex_list;
-extern struct mtx futex_mtx;
+extern struct sx futex_sx;
static eventhandler_tag linux_exit_tag;
static eventhandler_tag linux_schedtail_tag;
@@ -920,7 +920,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
sx_init(&emul_lock, "emuldata lock");
sx_init(&emul_shared_lock, "emuldata->shared lock");
LIST_INIT(&futex_list);
- mtx_init(&futex_mtx, "futex protection lock", NULL, MTX_DEF);
+ sx_init(&futex_sx, "futex protection lock");
linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
NULL, 1000);
linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail, linux_schedtail,
@@ -950,7 +950,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
linux_device_unregister_handler(*ldhp);
sx_destroy(&emul_lock);
sx_destroy(&emul_shared_lock);
- mtx_destroy(&futex_mtx);
+ sx_destroy(&futex_sx);
EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
OpenPOWER on IntegriCloud