runtime: rename m.gcing to m.preemptoff and make it a string

m.gcing has become overloaded to mean "don't preempt this g" in
general.  Once the garbage collector is preemptible, the one thing it
*won't* mean is that we're in the garbage collector.

So, rename gcing to "preemptoff" and make it a string giving a reason
that preemption is disabled.  gcing was never set to anything but 0 or
1, so we don't have to worry about there being a stack of reasons.

Change-Id: I4337c29e8e942e7aa4f106fc29597e1b5de4ef46
Reviewed-on: https://go-review.googlesource.com/3660
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/src/runtime/stack1.go b/src/runtime/stack1.go
index dda39ce..8ad3317 100644
--- a/src/runtime/stack1.go
+++ b/src/runtime/stack1.go
@@ -208,7 +208,7 @@
 		}
 		var x gclinkptr
 		c := thisg.m.mcache
-		if c == nil || thisg.m.gcing != 0 || thisg.m.helpgc != 0 {
+		if c == nil || thisg.m.preemptoff != "" || thisg.m.helpgc != 0 {
 			// c == nil can happen in the guts of exitsyscall or
 			// procresize. Just get a stack from the global pool.
 			// Also don't touch stackcache during gc
@@ -271,7 +271,7 @@
 		}
 		x := gclinkptr(v)
 		c := gp.m.mcache
-		if c == nil || gp.m.gcing != 0 || gp.m.helpgc != 0 {
+		if c == nil || gp.m.preemptoff != "" || gp.m.helpgc != 0 {
 			lock(&stackpoolmu)
 			stackpoolfree(x, order)
 			unlock(&stackpoolmu)
@@ -648,7 +648,8 @@
 
 	// Be conservative about where we preempt.
 	// We are interested in preempting user Go code, not runtime code.
-	// If we're holding locks, mallocing, or GCing, don't preempt.
+	// If we're holding locks, mallocing, or preemption is disabled, don't
+	// preempt.
 	// This check is very early in newstack so that even the status change
 	// from Grunning to Gwaiting and back doesn't happen in this case.
 	// That status change by itself can be viewed as a small preemption,
@@ -658,7 +659,7 @@
 	// it needs a lock held by the goroutine), that small preemption turns
 	// into a real deadlock.
 	if preempt {
-		if thisg.m.locks != 0 || thisg.m.mallocing != 0 || thisg.m.gcing != 0 || thisg.m.p.status != _Prunning {
+		if thisg.m.locks != 0 || thisg.m.mallocing != 0 || thisg.m.preemptoff != "" || thisg.m.p.status != _Prunning {
 			// Let the goroutine keep running for now.
 			// gp->preempt is set, so it will be preempted next time.
 			gp.stackguard0 = gp.stack.lo + _StackGuard