From: Mikio Hara Date: Wed, 12 Mar 2014 01:33:09 +0000 (+0900) Subject: runtime: make use of THREAD_SHARE userspace mutex on freebsd X-Git-Tag: go1.3beta1~392 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ae9b661fa859222b9bcbcafc1a63f3f305385e75;p=gostls13.git runtime: make use of THREAD_SHARE userspace mutex on freebsd For now Note, futexsleep and futexwakeup are designed for threads, not for processes. The explicit use of UMTX_OP_WAIT_UINT_PRIVATE and UMTX_OP_WAKE_PRIVATE can avoid unnecessary traversals of VM objects, to hit undiscovered bugs related to VM system on SMP/SMT/NUMA environment. Update #7496 LGTM=iant R=golang-codereviews, gobot, iant, bradfitz CC=golang-codereviews https://golang.org/cl/72760043 --- diff --git a/src/pkg/runtime/defs_freebsd.go b/src/pkg/runtime/defs_freebsd.go index dad20f16dd..2832583e06 100644 --- a/src/pkg/runtime/defs_freebsd.go +++ b/src/pkg/runtime/defs_freebsd.go @@ -49,8 +49,10 @@ const ( SA_RESTART = C.SA_RESTART SA_ONSTACK = C.SA_ONSTACK - UMTX_OP_WAIT_UINT = C.UMTX_OP_WAIT_UINT - UMTX_OP_WAKE = C.UMTX_OP_WAKE + UMTX_OP_WAIT_UINT = C.UMTX_OP_WAIT_UINT + UMTX_OP_WAIT_UINT_PRIVATE = C.UMTX_OP_WAIT_UINT_PRIVATE + UMTX_OP_WAKE = C.UMTX_OP_WAKE + UMTX_OP_WAKE_PRIVATE = C.UMTX_OP_WAKE_PRIVATE SIGHUP = C.SIGHUP SIGINT = C.SIGINT diff --git a/src/pkg/runtime/defs_freebsd_386.h b/src/pkg/runtime/defs_freebsd_386.h index cf9c76eb1a..fab9385269 100644 --- a/src/pkg/runtime/defs_freebsd_386.h +++ b/src/pkg/runtime/defs_freebsd_386.h @@ -21,8 +21,10 @@ enum { SA_RESTART = 0x2, SA_ONSTACK = 0x1, - UMTX_OP_WAIT_UINT = 0xb, - UMTX_OP_WAKE = 0x3, + UMTX_OP_WAIT_UINT = 0xb, + UMTX_OP_WAIT_UINT_PRIVATE = 0xf, + UMTX_OP_WAKE = 0x3, + UMTX_OP_WAKE_PRIVATE = 0x10, SIGHUP = 0x1, SIGINT = 0x2, diff --git a/src/pkg/runtime/defs_freebsd_amd64.h b/src/pkg/runtime/defs_freebsd_amd64.h index 3fb33f38a3..c1db91803e 100644 --- a/src/pkg/runtime/defs_freebsd_amd64.h +++ b/src/pkg/runtime/defs_freebsd_amd64.h @@ -21,8 +21,10 @@ enum { SA_RESTART = 0x2, SA_ONSTACK = 0x1, - UMTX_OP_WAIT_UINT = 0xb, - UMTX_OP_WAKE = 0x3, + UMTX_OP_WAIT_UINT = 0xb, + UMTX_OP_WAIT_UINT_PRIVATE = 0xf, + UMTX_OP_WAKE = 0x3, + UMTX_OP_WAKE_PRIVATE = 0x10, SIGHUP = 0x1, SIGINT = 0x2, diff --git a/src/pkg/runtime/defs_freebsd_arm.h b/src/pkg/runtime/defs_freebsd_arm.h index e868ca313e..4fc452e457 100644 --- a/src/pkg/runtime/defs_freebsd_arm.h +++ b/src/pkg/runtime/defs_freebsd_arm.h @@ -21,8 +21,10 @@ enum { SA_RESTART = 0x2, SA_ONSTACK = 0x1, - UMTX_OP_WAIT_UINT = 0xb, - UMTX_OP_WAKE = 0x3, + UMTX_OP_WAIT_UINT = 0xb, + UMTX_OP_WAIT_UINT_PRIVATE = 0xf, + UMTX_OP_WAKE = 0x3, + UMTX_OP_WAKE_PRIVATE = 0x10, SIGHUP = 0x1, SIGINT = 0x2, diff --git a/src/pkg/runtime/os_freebsd.c b/src/pkg/runtime/os_freebsd.c index 8b7b0f6263..7598b13ba5 100644 --- a/src/pkg/runtime/os_freebsd.c +++ b/src/pkg/runtime/os_freebsd.c @@ -50,7 +50,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns) Timespec ts; if(ns < 0) { - ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, nil); + ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT_PRIVATE, val, nil, nil); if(ret >= 0 || ret == -EINTR) return; goto fail; @@ -58,7 +58,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns) // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system. ts.tv_nsec = 0; ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)&ts.tv_nsec); - ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, &ts); + ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT_PRIVATE, val, nil, &ts); if(ret >= 0 || ret == -EINTR) return; @@ -78,7 +78,7 @@ runtime·futexwakeup(uint32 *addr, uint32 cnt) { int32 ret; - ret = runtime·sys_umtx_op(addr, UMTX_OP_WAKE, cnt, nil, nil); + ret = runtime·sys_umtx_op(addr, UMTX_OP_WAKE_PRIVATE, cnt, nil, nil); if(ret >= 0) return;