Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 May 2007 12:49:54 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 119328 for review
Message-ID:  <200705061249.l46CnsMI002408@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=119328

Change 119328 by rdivacky@rdivacky_witten on 2007/05/06 12:49:50

	Replace Giant with our own sx lock. There is no point in using Giant. The locking
	might need some review but it should be safe as it is (just inefficient).

Affected files ...

.. //depot/projects/soc2007/rdivacky/linux_futex/sys/amd64/linux32/linux32_sysvec.c#2 edit
.. //depot/projects/soc2007/rdivacky/linux_futex/sys/compat/linux/linux_futex.c#5 edit
.. //depot/projects/soc2007/rdivacky/linux_futex/sys/i386/linux/linux_sysvec.c#2 edit

Differences ...

==== //depot/projects/soc2007/rdivacky/linux_futex/sys/amd64/linux32/linux32_sysvec.c#2 (text+ko) ====

@@ -125,6 +125,7 @@
 
 extern LIST_HEAD(futex_list, futex) futex_list;
 extern struct sx futex_sx;
+extern struct sx futex_lock;
 
 static eventhandler_tag linux_exit_tag;
 static eventhandler_tag linux_schedtail_tag;
@@ -1084,7 +1085,8 @@
 			mtx_init(&emul_lock, "emuldata lock", NULL, MTX_DEF);
 			sx_init(&emul_shared_lock, "emuldata->shared lock");
 			LIST_INIT(&futex_list);
-			sx_init(&futex_sx, "futex protection lock");
+			sx_init(&futex_sx, "futex list protection lock");
+			sx_init(&futex_lock, "futex protection lock");
 			linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
 			      NULL, 1000);
 			linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail, linux_schedtail,
@@ -1115,6 +1117,7 @@
 			mtx_destroy(&emul_lock);
 			sx_destroy(&emul_shared_lock);
 			sx_destroy(&futex_sx);
+			sx_destroy(&futex_lock);
 			EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
 			EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
 			EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);

==== //depot/projects/soc2007/rdivacky/linux_futex/sys/compat/linux/linux_futex.c#5 (text+ko) ====

@@ -75,6 +75,7 @@
 
 LIST_HEAD(futex_list, futex) futex_list;
 struct sx futex_sx;		/* this protects the LIST of futexes */
+struct sx futex_lock;
 
 #define FUTEX_LOCK sx_xlock(&futex_sx)
 #define FUTEX_UNLOCK sx_xunlock(&futex_sx)
@@ -82,8 +83,8 @@
 #define FUTEX_LOCKED	1
 #define FUTEX_UNLOCKED	0
 
-#define FUTEX_SYSTEM_LOCK mtx_lock(&Giant)
-#define FUTEX_SYSTEM_UNLOCK mtx_unlock(&Giant)
+#define FUTEX_SYSTEM_LOCK sx_xlock(&futex_lock)
+#define FUTEX_SYSTEM_UNLOCK sx_xunlock(&futex_lock)
 
 static struct futex	*futex_get(void *, int);
 static void futex_put(struct futex *);
@@ -390,7 +391,7 @@
 		printf("FUTEX --> %d tlseep timeout = %ld\n",
 		    td->td_proc->p_pid, timeout);
 #endif
-	ret = tsleep(wp, PCATCH | PZERO, "linuxfutex", timeout);
+	ret = sx_sleep(wp, &futex_lock, PCATCH | PZERO, "linuxfutex", timeout);
 #ifdef DEBUG
 	if (ldebug(sys_futex))
 		printf("FUTEX -> %d tsleep returns %d\n",

==== //depot/projects/soc2007/rdivacky/linux_futex/sys/i386/linux/linux_sysvec.c#2 (text+ko) ====

@@ -109,6 +109,7 @@
 
 extern LIST_HEAD(futex_list, futex) futex_list;
 extern struct sx futex_sx;
+extern struct sx futex_lock;
 
 static eventhandler_tag linux_exit_tag;
 static eventhandler_tag linux_schedtail_tag;
@@ -920,7 +921,8 @@
 			mtx_init(&emul_lock, "emuldata lock", NULL, MTX_DEF);
 			sx_init(&emul_shared_lock, "emuldata->shared lock");
 			LIST_INIT(&futex_list);
-			sx_init(&futex_sx, "futex protection lock");
+			sx_init(&futex_sx, "futex list protection lock");
+			sx_init(&futex_lock, "futex protection lock");
 			linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
 			      NULL, 1000);
 			linux_schedtail_tag = EVENTHANDLER_REGISTER(schedtail, linux_schedtail,
@@ -951,6 +953,7 @@
 			mtx_destroy(&emul_lock);
 			sx_destroy(&emul_shared_lock);
 			sx_destroy(&futex_sx);
+			sx_destroy(&futex_lock);
 			EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
 			EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);
 			EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200705061249.l46CnsMI002408>