Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Feb 2007 14:18:36 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 114387 for review
Message-ID:  <200702111418.l1BEIa37085050@repoman.freebsd.org>

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

Change 114387 by rdivacky@rdivacky_witten on 2007/02/11 14:18:34

	Change emul_shared_lock back to an sx. We need sleepable lock because
	we need to hold this lock while doing pfind() which results in a LOR
	caused by rw -> sx -> mutex locking order.

Affected files ...

.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#10 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.c#36 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.h#10 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_sysvec.c#5 edit

Differences ...

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#10 (text+ko) ====

@@ -52,7 +52,6 @@
 #include <sys/mutex.h>
 #include <sys/proc.h>
 #include <sys/resourcevar.h>
-#include <sys/rwlock.h>
 #include <sys/signalvar.h>
 #include <sys/sysctl.h>
 #include <sys/syscallsubr.h>
@@ -1080,7 +1079,7 @@
 			SET_FOREACH(ldhp, linux_device_handler_set)
 				linux_device_register_handler(*ldhp);
 			mtx_init(&emul_lock, "emuldata lock", NULL, MTX_DEF);
-			rw_init(&emul_shared_lock, "emuldata->shared lock");
+			sx_init(&emul_shared_lock, "emuldata->shared lock");
 			LIST_INIT(&futex_list);
 			sx_init(&futex_sx, "futex protection lock");
 			linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
@@ -1111,7 +1110,7 @@
 			SET_FOREACH(ldhp, linux_device_handler_set)
 				linux_device_unregister_handler(*ldhp);
 			mtx_destroy(&emul_lock);
-			rw_destroy(&emul_shared_lock);
+			sx_destroy(&emul_shared_lock);
 			sx_destroy(&futex_sx);
 			EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
 			EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.c#36 (text+ko) ====

@@ -40,7 +40,6 @@
 #include <sys/mutex.h>
 #include <sys/sx.h>
 #include <sys/proc.h>
-#include <sys/rwlock.h>
 #include <sys/syscallsubr.h>
 #include <sys/sysproto.h>
 #include <sys/unistd.h>
@@ -56,7 +55,7 @@
 #include <machine/../linux/linux_proto.h>
 #endif
 
-struct rwlock emul_shared_lock;
+struct sx emul_shared_lock;
 struct mtx emul_lock;
 
 /* this returns locked reference to the emuldata entry (if found) */

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_emul.h#10 (text+ko) ====

@@ -60,10 +60,10 @@
 #define EMUL_LOCK(l)	mtx_lock(l)
 #define EMUL_UNLOCK(l)	mtx_unlock(l)
 
-#define EMUL_SHARED_RLOCK(l) rw_rlock(l)
-#define EMUL_SHARED_RUNLOCK(l) rw_runlock(l)
-#define EMUL_SHARED_WLOCK(l) rw_wlock(l)
-#define EMUL_SHARED_WUNLOCK(l) rw_wunlock(l)
+#define EMUL_SHARED_RLOCK(l) sx_slock(l)
+#define EMUL_SHARED_RUNLOCK(l) sx_sunlock(l)
+#define EMUL_SHARED_WLOCK(l) sx_xlock(l)
+#define EMUL_SHARED_WUNLOCK(l) sx_xunlock(l)
 
 /* for em_find use */
 #define EMUL_DOLOCK		1
@@ -74,7 +74,7 @@
 void	linux_schedtail(void *, struct proc *);
 void	linux_proc_exec(void *, struct proc *, struct image_params *);
 
-extern struct rwlock emul_shared_lock;
+extern struct sx emul_shared_lock;
 extern struct mtx emul_lock;
 
 #endif	/* !_LINUX_EMUL_H_ */

==== //depot/projects/linuxolator/src/sys/i386/linux/linux_sysvec.c#5 (text+ko) ====

@@ -41,7 +41,6 @@
 #include <sys/module.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
-#include <sys/rwlock.h>
 #include <sys/signalvar.h>
 #include <sys/syscallsubr.h>
 #include <sys/sysent.h>
@@ -919,7 +918,7 @@
 			SET_FOREACH(ldhp, linux_device_handler_set)
 				linux_device_register_handler(*ldhp);
 			mtx_init(&emul_lock, "emuldata lock", NULL, MTX_DEF);
-			rw_init(&emul_shared_lock, "emuldata->shared lock");
+			sx_init(&emul_shared_lock, "emuldata->shared lock");
 			LIST_INIT(&futex_list);
 			sx_init(&futex_sx, "futex protection lock");
 			linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, linux_proc_exit,
@@ -950,7 +949,7 @@
 			SET_FOREACH(ldhp, linux_device_handler_set)
 				linux_device_unregister_handler(*ldhp);
 			mtx_destroy(&emul_lock);
-			rw_destroy(&emul_shared_lock);
+			sx_destroy(&emul_shared_lock);
 			sx_destroy(&futex_sx);
 			EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
 			EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag);



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