runtime: in doscanstackswitch, set gp->m before gogo

This is following CL 156038. doscanstackswitch uses the same
mechanism of switching goroutines as getTraceback, and so has
the same problem as described in issue golang/go#29448. This CL
applies the same fix.

Change-Id: I0da9996b0f73755f0171c7c10be6c77cb298b517
Reviewed-on: https://go-review.googlesource.com/c/156697
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index 4004df4..1569b5b 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -482,9 +482,14 @@
 void
 doscanstackswitch(G* me, G* gp)
 {
+	M* holdm;
+
 	__go_assert(me->entry == nil);
 	me->fromgogo = false;
 
+	holdm = gp->m;
+	gp->m = me->m;
+
 #ifdef USING_SPLIT_STACK
 	__splitstack_getcontext((void*)(&me->stackcontext[0]));
 #endif
@@ -507,6 +512,8 @@
 
 	if (gp->scang != 0)
 		runtime_gogo(gp);
+
+	gp->m = holdm;
 }
 
 // Do a stack scan, then switch back to the g that triggers this scan.
@@ -515,21 +522,15 @@
 gscanstack(G *gp)
 {
 	G *oldg, *oldcurg;
-	M* holdm;
 
 	oldg = (G*)gp->scang;
 	oldcurg = oldg->m->curg;
-	holdm = gp->m;
-	if(holdm != nil && holdm != g->m)
-		runtime_throw("gscanstack: m is not nil");
 	oldg->m->curg = gp;
-	gp->m = oldg->m;
 	gp->scang = 0;
 
 	doscanstack(gp, (void*)gp->scangcw);
 
 	gp->scangcw = 0;
-	gp->m = holdm;
 	oldg->m->curg = oldcurg;
 	runtime_gogo(oldg);
 }