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>