- 11 Sep, 2014 4 commits
-
-
Russ Cox authored
A write *p = x that needs a write barrier (not all do) now turns into runtime.writebarrierptr(p, x) or one of the other variants. The write barrier implementations are trivial. The goal here is to emit the calls in the correct places and to incur the cost of those function calls in the Go 1.4 cycle. Performance on the Go 1 benchmark suite below. Remember, the goal is to slow things down (and be correct). We will look into optimizations in separate CLs, as part of the process of comparing Go 1.3 against tip in order to make sure Go 1.4 runs at least as fast as Go 1.3. benchmark old ns/op new ns/op delta BenchmarkBinaryTree17 3118336716 3452876110 +10.73% BenchmarkFannkuch11 3184497677 3211552284 +0.85% BenchmarkFmtFprintfEmpty 89.9 107 +19.02% BenchmarkFmtFprintfString 236 287 +21.61% BenchmarkFmtFprintfInt 246 278 +13.01% BenchmarkFmtFprintfIntInt 395 458 +15.95% BenchmarkFmtFprintfPrefixedInt 343 378 +10.20% BenchmarkFmtFprintfFloat 477 525 +10.06% BenchmarkFmtManyArgs 1446 1707 +18.05% BenchmarkGobDecode 14398047 14685958 +2.00% BenchmarkGobEncode 12557718 12947104 +3.10% BenchmarkGzip 453462345 472413285 +4.18% BenchmarkGunzip 114226016 115127398 +0.79% BenchmarkHTTPClientServer 114689 112122 -2.24% BenchmarkJSONEncode 24914536 26135942 +4.90% BenchmarkJSONDecode 86832877 103620289 +19.33% BenchmarkMandelbrot200 4833452 4898780 +1.35% BenchmarkGoParse 4317976 4835474 +11.98% BenchmarkRegexpMatchEasy0_32 150 166 +10.67% BenchmarkRegexpMatchEasy0_1K 393 402 +2.29% BenchmarkRegexpMatchEasy1_32 125 142 +13.60% BenchmarkRegexpMatchEasy1_1K 1010 1236 +22.38% BenchmarkRegexpMatchMedium_32 232 301 +29.74% BenchmarkRegexpMatchMedium_1K 76963 102721 +33.47% BenchmarkRegexpMatchHard_32 3833 5463 +42.53% BenchmarkRegexpMatchHard_1K 119668 161614 +35.05% BenchmarkRevcomp 763449047 706768534 -7.42% BenchmarkTemplate 124954724 134834549 +7.91% BenchmarkTimeParse 517 511 -1.16% BenchmarkTimeFormat 501 514 +2.59% benchmark old MB/s new MB/s speedup BenchmarkGobDecode 53.31 52.26 0.98x BenchmarkGobEncode 61.12 59.28 0.97x BenchmarkGzip 42.79 41.08 0.96x BenchmarkGunzip 169.88 168.55 0.99x BenchmarkJSONEncode 77.89 74.25 0.95x BenchmarkJSONDecode 22.35 18.73 0.84x BenchmarkGoParse 13.41 11.98 0.89x BenchmarkRegexpMatchEasy0_32 213.30 191.72 0.90x BenchmarkRegexpMatchEasy0_1K 2603.92 2542.74 0.98x BenchmarkRegexpMatchEasy1_32 254.00 224.93 0.89x BenchmarkRegexpMatchEasy1_1K 1013.53 827.98 0.82x BenchmarkRegexpMatchMedium_32 4.30 3.31 0.77x BenchmarkRegexpMatchMedium_1K 13.30 9.97 0.75x BenchmarkRegexpMatchHard_32 8.35 5.86 0.70x BenchmarkRegexpMatchHard_1K 8.56 6.34 0.74x BenchmarkRevcomp 332.92 359.62 1.08x BenchmarkTemplate 15.53 14.39 0.93x LGTM=rlh R=rlh CC=dvyukov, golang-codereviews, iant, khr, r https://golang.org/cl/136380043
-
Russ Cox authored
The uses of onM in dopanic/startpanic are okay even from the signal stack. Fixes #8666. LGTM=khr R=khr CC=golang-codereviews https://golang.org/cl/134710043
-
Mikio Hara authored
The previous implementation used per-socket TCP keepalive options wrong. For example, it used another level socket option to control TCP and it didn't use TCP_KEEPINTVL option when possible. Fixes #8683. Fixes #8701. Update #8679 LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/136480043
-
Keith Randall authored
LGTM=bradfitz, iant R=iant, bradfitz CC=golang-codereviews https://golang.org/cl/140510043
-
- 10 Sep, 2014 4 commits
-
-
Keith Randall authored
They will both need write barriers at some point. But until then, no reason why we shouldn't share. LGTM=rsc R=golang-codereviews, rsc CC=golang-codereviews https://golang.org/cl/141330043
-
Anthony Martin authored
LGTM=iant R=rsc, 0intro, alex.brainman, iant CC=golang-codereviews https://golang.org/cl/140460044
-
Matthew Dempsky authored
The previous implementation had several subtle issues. It's not clear if any of these could actually be causing the flakiness problems on openbsd/386, but fixing them should only help. 1. thrsleep() is implemented internally as unlock, then test *abort (if abort != nil), then tsleep(). Under the current code, that makes it theoretically possible that semasleep()/thrsleep() could release waitsemalock, then a racing semawakeup() could acquire the lock, increment waitsemacount, and call thrwakeup()/wakeup() before thrsleep() reaches tsleep(). (In practice, OpenBSD's big kernel lock seems unlikely to let this actually happen.) The proper way to avoid this is to pass &waitsemacount as the abort pointer to thrsleep so thrsleep knows to re-check it before going to sleep, and to wakeup if it's non-zero. Then we avoid any races. (I actually suspect openbsd's sema{sleep,wakeup}() could be further simplified using cas/xadd instead of locks, but I don't want to be more intrusive than necessary so late in the 1.4 release cycle.) 2. semasleep() takes a relative sleep duration, but thrsleep() needs an absolute sleep deadline. Instead of recomputing the deadline each iteration, compute it once up front and use (*Timespec)(nil) to signify no deadline. Ensures we retry properly if there's a spurious wakeup. 3. Instead of assuming if thrsleep() woke up and waitsemacount wasn't available that we must have hit the deadline, check that the system call returned EWOULDBLOCK. 4. Instead of assuming that 64-bit systems are little-endian, compute timediv() using a temporary int32 nsec and then assign it to tv_nsec. LGTM=iant R=jsing, iant CC=golang-codereviews https://golang.org/cl/137960043
-
Anthony Martin authored
A race exists between the parent and child processes after a fork. The child needs to access the new M pointer passed as an argument but the parent may have already returned and clobbered it. Previously, we avoided this by saving the necessary data into registers before the rfork system call but this isn't guaranteed to work because Plan 9 makes no promises about the register state after a system call. Only the 386 kernel seems to save them. For amd64 and arm, this method won't work. We eliminate the race by allocating stack space for the scheduler goroutines (g0) in the per-process copy-on-write stack segment and by only calling rfork on the scheduler stack. LGTM=aram, 0intro, rsc R=aram, 0intro, mischief, rsc CC=golang-codereviews https://golang.org/cl/110680044
-
- 09 Sep, 2014 17 commits
-
-
Keith Randall authored
Move timenow thunk into time.s Move declarations for generic c/asm services into stubs.go LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/137360043
-
Keith Randall authored
Fixes #8688 LGTM=rsc R=golang-codereviews, bradfitz, rsc, khr CC=golang-codereviews https://golang.org/cl/135660043
-
Russ Cox authored
The only thing I can see that is really Plan 9-specific is that the stack pointer used for signal handling used to have more mapped memory above it. Specifically it used to have at most 88 bytes (StackTop), so change the allocation of a 40-byte frame to a 128-byte frame. No idea if this will work, but worth a try. Note that "fix" here means get it back to timing out instead of crashing. TBR=iant CC=golang-codereviews https://golang.org/cl/142840043
-
Russ Cox authored
The difference between the old and the new (from earlier) code is that we set stackguard = stack.lo + StackGuard, while the old code set stackguard = stack.lo. That 512 bytes appears to be the difference between the profileloop function running and not running. We don't know how big the system stack is, but it is likely MUCH bigger than 4k. Give Go/C 8k. TBR=iant CC=golang-codereviews https://golang.org/cl/140440044
-
Russ Cox authored
Start the stack a few words below the actual top, so that if something tries to read goexit's caller PC from the stack, it won't fault on a bad memory address. Today, heapdump does that. Maybe tomorrow, traceback or something else will do that. Make it not a bug. TBR=khr R=khr CC=golang-codereviews https://golang.org/cl/136450043
-
Rob Pike authored
For -mode=atomic, we need to read the counters using an atomic load to avoid a race. Not worth worrying about when -mode=atomic is set during generation of the profile, so we use atomic loads always. Fixes #8630. LGTM=rsc R=dvyukov, rsc CC=golang-codereviews https://golang.org/cl/141800043
-
Rob Pike authored
With new interface allocation rules, the old counts were wrong and so was the commentary. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/142760044
-
Rob Pike authored
Space is not a control character. Fixes #8571. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/137380043
-
Russ Cox authored
No promise about correctness, but they do build. TBR=khr CC=golang-codereviews https://golang.org/cl/143720043
-
Russ Cox authored
Commit to stack copying for stack growth. We're carrying around a surprising amount of cruft from older schemes. I am confident that precise stack scans and stack copying are here to stay. Delete fallback code for when precise stack info is disabled. Delete fallback code for when copying stacks is disabled. Delete fallback code for when StackCopyAlways is disabled. Delete Stktop chain - there is only one stack segment now. Delete M.moreargp, M.moreargsize, M.moreframesize, M.cret. Delete G.writenbuf (unrelated, just dead). Delete runtime.lessstack, runtime.oldstack. Delete many amd64 morestack variants. Delete initialization of morestack frame/arg sizes (shortens split prologue!). Replace G's stackguard/stackbase/stack0/stacksize/ syscallstack/syscallguard/forkstackguard with simple stack bounds (lo, hi). Update liblink, runtime/cgo for adjustments to G. LGTM=khr R=khr, bradfitz CC=golang-codereviews, iant, r https://golang.org/cl/137410043
-
Alex Brainman authored
I have found better approach, then longer wait. See CL 134360043 for details. ««« original CL description runtime/pprof: adjust cpuHogger so that tests pass on windows builders LGTM=rsc R=dvyukov, rsc CC=golang-codereviews https://golang.org/cl/140110043 »»» LGTM=dave R=golang-codereviews, dave, dvyukov CC=golang-codereviews https://golang.org/cl/133500043
-
Russ Cox authored
I assumed they were the same when I wrote cgocallback.go earlier today. Merge them to eliminate confusion. I can't tell what gomallocgc did before with a nil type but without FlagNoScan. I created a call like that in cgocallback.go this morning, translating from a C file. It was supposed to do what the C version did, namely treat the block conservatively. Now it will. LGTM=khr R=khr CC=golang-codereviews https://golang.org/cl/141810043
-
Russ Cox authored
It already is updating parts of them; we're just getting lucky retraversing them and not finding much to do. Change argp to a pointer so that it will be updated too. Existing tests break if you apply the change to adjustpanics without also updating the type of argp. LGTM=khr R=khr CC=golang-codereviews https://golang.org/cl/139380043
-
Brad Fitzpatrick authored
Like https://golang.org/cl/139360044 LGTM=rsc, alex.brainman R=alex.brainman, rsc CC=golang-codereviews https://golang.org/cl/138250043
-
Keith Randall authored
This change brings the iter/delete pattern down to O(n lgn) from O(n^2). Fixes #8412. before: BenchmarkMapPop100 50000 32498 ns/op BenchmarkMapPop1000 500 3244851 ns/op BenchmarkMapPop10000 5 270276855 ns/op after: BenchmarkMapPop100 100000 16169 ns/op BenchmarkMapPop1000 5000 300416 ns/op BenchmarkMapPop10000 300 5990814 ns/op LGTM=iant R=golang-codereviews, iant, khr CC=golang-codereviews https://golang.org/cl/141270043
-
Brad Fitzpatrick authored
src/pkg -> src LGTM=alex.brainman R=alex.brainman CC=golang-codereviews https://golang.org/cl/139400043
-
Russ Cox authored
It worked at CL 134660043 on the builders, so I believe it will stick this time. LGTM=bradfitz R=khr, bradfitz CC=golang-codereviews https://golang.org/cl/141280043
-
- 08 Sep, 2014 15 commits
-
-
Andrew Gerrand authored
Generated by a+c. LGTM=jtolds, jbd R=gobot, jbd, jtolds CC=golang-codereviews https://golang.org/cl/137300043
-
Keith Randall authored
LGTM=bradfitz R=dave, bradfitz CC=golang-codereviews https://golang.org/cl/136390043
-
Mikio Hara authored
Fixes #8679. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/141730043
-
Russ Cox authored
windows/amd64 failure: http://build.golang.org/log/1ded5e3ef4bd1226f976e3180772f87e6c918255 # ..\misc\cgo\testso runtime: copystack: locals size info only for syscall.Syscall fatal error: split stack not allowed runtime stack: runtime.throw(0xa64cc7) c:/go/src/runtime/panic.go:395 +0xad fp=0x6fde0 sp=0x6fdb0 runtime.newstack() c:/go/src/runtime/stack.c:1001 +0x750 fp=0x6ff20 sp=0x6fde0 runtime.morestack() c:/go/src/runtime/asm_amd64.s:306 +0x73 fp=0x6ff28 sp=0x6ff20 goroutine 1 [stack growth, locked to thread]: runtime.freedefer(0xc0820ce120) c:/go/src/runtime/panic.go:162 fp=0xc08201b1a0 sp=0xc08201b198 runtime.deferreturn(0xa69420) c:/go/src/runtime/panic.go:211 +0xa8 fp=0xc08201b1e8 sp=0xc08201b1a0 runtime.cgocall_errno(0x498c00, 0xc08201b228, 0x0) c:/go/src/runtime/cgocall.go:134 +0x10e fp=0xc08201b210 sp=0xc08201b1e8 syscall.Syscall(0x7786b1d0, 0x2, 0xc0820c85b0, 0xc08201b2d8, 0x0, 0x0, 0x0, 0x0) c:/go/src/runtime/syscall_windows.c:74 +0x3c fp=0xc08201b260 sp=0xc08201b210 syscall.findFirstFile1(0xc0820c85b0, 0xc08201b2d8, 0x500000000000000, 0x0, 0x0) c:/go/src/syscall/zsyscall_windows.go:340 +0x76 fp=0xc08201b2b0 sp=0xc08201b260 syscall.FindFirstFile(0xc0820c85b0, 0xc08210c500, 0xc0820c85b0, 0x0, 0x0) c:/go/src/syscall/syscall_windows.go:907 +0x6a fp=0xc08201b530 sp=0xc08201b2b0 os.openDir(0xc0820b2e40, 0x33, 0x0, 0x0, 0x0) c:/go/src/os/file_windows.go:96 +0x110 fp=0xc08201b5e0 sp=0xc08201b530 os.OpenFile(0xc0820b2e40, 0x33, 0x0, 0x0, 0x41, 0x0, 0x0) c:/go/src/os/file_windows.go:143 +0x1e9 fp=0xc08201b650 sp=0xc08201b5e0 TBR=khr CC=golang-codereviews https://golang.org/cl/138230043
-
Russ Cox authored
Should help windows/amd64. TBR=khr CC=golang-codereviews https://golang.org/cl/134660043
-
Robert Griesemer authored
Inside a control clause (if ... {}), composite literals starting with a type name must be parenthesized. A composite literal used in the array length expression of an array composite literal is already parenthesized. Not a valid program, but syntactically is should be accepted. LGTM=adonovan R=adonovan CC=golang-codereviews https://golang.org/cl/142760043
-
Russ Cox authored
This should make deferreturn nosplit all the way down, which should fix the current windows/amd64 failure. If not, I will change StackCopyAlways back to 0. TBR=khr CC=golang-codereviews https://golang.org/cl/135600043
-
Andrew Gerrand authored
Fixes #8674. LGTM=r R=r CC=golang-codereviews https://golang.org/cl/139320044
-
Russ Cox authored
Let's see how close we are to this being ready. Will roll back if it breaks any builds in non-trivial ways. LGTM=r, khr R=iant, khr, r CC=golang-codereviews https://golang.org/cl/138200043
-
Russ Cox authored
Was having serious editor problems on Windows. TBR=brainman, iant CC=golang-codereviews https://golang.org/cl/137370043
-
Russ Cox authored
Given: p := alloc() fn_taking_ptr(p) p is NOT recorded as live at the call to fn_taking_ptr: it's not needed by the code following the call. p was passed to fn_taking_ptr, and fn_taking_ptr must keep it alive as long as it needs it. In practice, fn_taking_ptr will keep its own arguments live for as long as the function is executing. But if instead you have: p := alloc() i := uintptr(unsafe.Pointer(p)) fn_taking_int(i) p is STILL NOT recorded as live at the call to fn_taking_int: it's not needed by the code following the call. fn_taking_int is responsible for keeping its own arguments live, but fn_taking_int is written to take an integer, so even though fn_taking_int does keep its argument live, that argument does not keep the allocated memory live, because the garbage collector does not dereference integers. The shorter form: p := alloc() fn_taking_int(uintptr(unsafe.Pointer(p))) and the even shorter form: fn_taking_int(uintptr(unsafe.Pointer(alloc()))) are both the same as the 3-line form above. syscall.Syscall is like fn_taking_int: it is written to take a list of integers, and yet those integers are sometimes pointers. If there is no other copy of those pointers being kept live, the memory they point at may be garbage collected during the call to syscall.Syscall. This is happening on Solaris: for whatever reason, the timing is such that the garbage collector manages to free the string argument to the open(2) system call before the system call has been invoked. Change the system call wrappers to insert explicit references that will keep the allocations alive in the original frame (and therefore preserve the memory) until after syscall.Syscall has returned. Should fix Solaris flakiness. This is not a problem for cgo, because cgo wrappers have correctly typed arguments. LGTM=iant, khr, aram, rlh R=iant, khr, bradfitz, aram, rlh CC=dvyukov, golang-codereviews, r https://golang.org/cl/139360044
-
Russ Cox authored
The sighander has been run at the bottom of the currently executing goroutine stack, but it's in C, and we don't want C on our ordinary goroutine stacks. Worse, it does a lot of stuff, and it might need more stack space. There is scary code in traceback_windows.go that talks about stack splits during sighandler. Moving sighandler to g0 will eliminate the possibility of stack splits and such, and then we can delete traceback_windows.go entirely. Win win. On the builder, all.bat passes with GOARCH=amd64 and all.bat gets most of the way with GOARCH=386 except for a DLL-loading test that I think is unrelated. Fixes windows build. TBR=brainman, iant CC=golang-codereviews https://golang.org/cl/140380043
-
Keith Randall authored
LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/139370043
-
Russ Cox authored
This CL contains compiler+runtime changes that detect C code running on Go (not g0, not gsignal) stacks, and it contains corrections for what it detected. The detection works by changing the C prologue to use a different stack guard word in the G than Go prologue does. On the g0 and gsignal stacks, that stack guard word is set to the usual stack guard value. But on ordinary Go stacks, that stack guard word is set to ^0, which will make any stack split check fail. The C prologue then calls morestackc instead of morestack, and morestackc aborts the program with a message about running C code on a Go stack. This check catches all C code running on the Go stack except NOSPLIT code. The NOSPLIT code is allowed, so the check is complete. Since it is a dynamic check, the code must execute to be caught. But unlike the static checks we've been using in cmd/ld, the dynamic check works with function pointers and other indirect calls. For example it caught sigpanic being pushed onto Go stacks in the signal handlers. Fixes #8667. LGTM=khr, iant R=golang-codereviews, khr, iant CC=golang-codereviews, r https://golang.org/cl/133700043
-
Keith Randall authored
LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/134630043
-