Commit 27aed3ce authored by Rick Hudson's avatar Rick Hudson

runtime: scanvalid race Fixes #9727

Set gcscanvalid=false after you have cased to _Grunning.
If you do it before the cas and the atomicstatus races to a scan state,
the scan will set gcscanvalid=true and we will be _Grunning
with gcscanvalid==true which is not a good thing.

Change-Id: Ie53ea744a5600392b47da91159d985fe6fe75961
Reviewed-on: https://go-review.googlesource.com/3510Reviewed-by: default avatarAustin Clements <austin@google.com>
parent 428afae0
...@@ -387,10 +387,6 @@ func casgstatus(gp *g, oldval, newval uint32) { ...@@ -387,10 +387,6 @@ func casgstatus(gp *g, oldval, newval uint32) {
}) })
} }
if newval == _Grunning {
gp.gcscanvalid = false
}
// loop if gp->atomicstatus is in a scan state giving // loop if gp->atomicstatus is in a scan state giving
// GC time to finish and change the state to oldval. // GC time to finish and change the state to oldval.
for !cas(&gp.atomicstatus, oldval, newval) { for !cas(&gp.atomicstatus, oldval, newval) {
...@@ -407,6 +403,9 @@ func casgstatus(gp *g, oldval, newval uint32) { ...@@ -407,6 +403,9 @@ func casgstatus(gp *g, oldval, newval uint32) {
// }) // })
// } // }
} }
if newval == _Grunning {
gp.gcscanvalid = false
}
} }
// casgstatus(gp, oldstatus, Gcopystack), assuming oldstatus is Gwaiting or Grunnable. // casgstatus(gp, oldstatus, Gcopystack), assuming oldstatus is Gwaiting or Grunnable.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment