From 6ee69a97269eb26186d08832dcafd9432945f5ad Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov <dvyukov@google.com> Date: Wed, 31 Jul 2013 20:03:05 +0400 Subject: [PATCH] undo CL 12167043 / 475e11851fc1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Submitted with some unrelated changes that were not intended to go in. 芦芦芦 original CL description runtime: do not park sysmon thread if any goroutines are running Sysmon thread parks if no goroutines are running (runtime.sched.npidle == runtime.gomaxprocs). Currently it's unparked when a goroutine enters syscall, it was enough to retake P's from blocking syscalls. But it's not enough for reliable goroutine preemption. We need to ensure that sysmon runs if any goroutines are running. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/12167043 禄禄禄 R=rsc CC=golang-dev https://golang.org/cl/12171044 --- src/pkg/runtime/proc.c | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index f333fdd877..c4b8c02517 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -1536,10 +1536,6 @@ exitsyscallfast(void) if(runtime路sched.pidle) { runtime路lock(&runtime路sched); p = pidleget(); - if(p && runtime路atomicload(&runtime路sched.sysmonwait)) { - runtime路atomicstore(&runtime路sched.sysmonwait, 0); - runtime路notewakeup(&runtime路sched.sysmonnote); - } runtime路unlock(&runtime路sched); if(p) { acquirep(p); @@ -1563,10 +1559,6 @@ exitsyscall0(G *gp) p = pidleget(); if(p == nil) globrunqput(gp); - else if(runtime路atomicload(&runtime路sched.sysmonwait)) { - runtime路atomicstore(&runtime路sched.sysmonwait, 0); - runtime路notewakeup(&runtime路sched.sysmonnote); - } runtime路unlock(&runtime路sched); if(p) { acquirep(p); @@ -1932,38 +1924,24 @@ static struct { uintptr pcbuf[100]; } prof; -static void -System(void) -{ -} - // Called if we receive a SIGPROF signal. void runtime路sigprof(uint8 *pc, uint8 *sp, uint8 *lr, G *gp) { int32 n; - bool traceback; - if(prof.fn == nil || prof.hz == 0) - return; - traceback = true; // Windows does profiling in a dedicated thread w/o m. if(!Windows && (m == nil || m->mcache == nil)) - traceback = false; - if(gp == m->g0 || gp == m->gsignal) - traceback = false; - if(m != nil && m->racecall) - traceback = false; + return; + if(prof.fn == nil || prof.hz == 0) + return; runtime路lock(&prof); if(prof.fn == nil) { runtime路unlock(&prof); return; } - n = 1; - prof.pcbuf[0] = (uintptr)pc; - if(traceback) - n = runtime路gentraceback((uintptr)pc, (uintptr)sp, (uintptr)lr, gp, 0, prof.pcbuf, nelem(prof.pcbuf), nil, nil, false); + n = runtime路gentraceback((uintptr)pc, (uintptr)sp, (uintptr)lr, gp, 0, prof.pcbuf, nelem(prof.pcbuf), nil, nil, false); if(n > 0) prof.fn(prof.pcbuf, n); runtime路unlock(&prof); -- 2.30.9