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>