]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix unexpected return pc for runtime.newstackcall
authorDmitriy Vyukov <dvyukov@google.com>
Wed, 23 Jul 2014 14:51:34 +0000 (18:51 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Wed, 23 Jul 2014 14:51:34 +0000 (18:51 +0400)
With cl/112640043 TestCgoDeadlockCrash episodically print:
unexpected return pc for runtime.newstackcall
After adding debug output I see the following trace:

runtime: unexpected return pc for runtime.newstackcall called from 0xc208011b00
runtime.throw(0x414da86)
        src/pkg/runtime/panic.c:523 +0x77
runtime.gentraceback(0x40165fc, 0xba440c28, 0x0, 0xc208d15200, 0xc200000000, 0xc208ddfd20, 0x20, 0x0, 0x0, 0x300)
src/pkg/runtime/traceback_x86.c:185 +0xca4
runtime.callers(0x1, 0xc208ddfd20, 0x20)
src/pkg/runtime/traceback_x86.c:438 +0x98
mcommoninit(0xc208ddfc00)
src/pkg/runtime/proc.c:369 +0x5c
runtime.allocm(0xc208052000)
src/pkg/runtime/proc.c:686 +0xa6
newm(0x4017850, 0xc208052000)
src/pkg/runtime/proc.c:933 +0x27
startm(0xc208052000, 0x100000001)
src/pkg/runtime/proc.c:1011 +0xba
wakep()
src/pkg/runtime/proc.c:1071 +0x57
resetspinning()
src/pkg/runtime/proc.c:1297 +0xa1
schedule()
src/pkg/runtime/proc.c:1366 +0x14b
runtime.gosched0(0xc20808e240)
src/pkg/runtime/proc.c:1465 +0x5b
runtime.newstack()
src/pkg/runtime/stack.c:891 +0x44d
runtime: unexpected return pc for runtime.newstackcall called from 0xc208011b00
runtime.newstackcall(0x4000cbd, 0x4000b80)
src/pkg/runtime/asm_amd64.s:278 +0x6f

I suspect that it can happen on any stack split.
So don't unwind g0 stack.
Also, that comment is lying -- we can traceback w/o mcache,
CPU profiler does that.

LGTM=rsc
R=golang-codereviews
CC=golang-codereviews, khr, rsc
https://golang.org/cl/120040043

src/pkg/runtime/proc.c

index 55c58442bace1144302d0818acd57d8d4b90bb22..d65f605bd64da713e6c5a57597af1c424359f5ef 100644 (file)
@@ -363,9 +363,8 @@ checkmcount(void)
 static void
 mcommoninit(M *mp)
 {
-       // If there is no mcache runtime·callers() will crash,
-       // and we are most likely in sysmon thread so the stack is senseless anyway.
-       if(g->m->mcache)
+       // g0 stack won't make sense for user (and is not necessary unwindable).
+       if(g != g->m->g0)
                runtime·callers(1, mp->createstack, nelem(mp->createstack));
 
        mp->fastrand = 0x49f6428aUL + mp->id + runtime·cputicks();