aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndy Pan <panjf2000@gmail.com>2020-11-23 15:42:48 +0800
committerAustin Clements <austin@google.com>2021-02-25 18:08:41 +0000
commit1f7a01459b1172fdc571a81ffd369dbf32b6c8b2 (patch)
treedbb3c87f3794ebb292ba78fa7b50c020feb2a94a /src
parentbcac57f89c0ec609e6fbebcbcd42bb73fdaef2f0 (diff)
downloadgo-1f7a01459b1172fdc571a81ffd369dbf32b6c8b2.tar.xz
runtime: batch moving gFree list between local p and global schedt
Change-Id: I0ca1fcee6d3f08bdfcfa51f0dc774118d7355636 Reviewed-on: https://go-review.googlesource.com/c/go/+/271914 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/proc.go34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index dbb430fd25..19049d21f3 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -4170,17 +4170,25 @@ func gfput(_p_ *p, gp *g) {
_p_.gFree.push(gp)
_p_.gFree.n++
if _p_.gFree.n >= 64 {
- lock(&sched.gFree.lock)
+ var (
+ inc int32
+ stackQ gQueue
+ noStackQ gQueue
+ )
for _p_.gFree.n >= 32 {
- _p_.gFree.n--
gp = _p_.gFree.pop()
+ _p_.gFree.n--
if gp.stack.lo == 0 {
- sched.gFree.noStack.push(gp)
+ noStackQ.push(gp)
} else {
- sched.gFree.stack.push(gp)
+ stackQ.push(gp)
}
- sched.gFree.n++
+ inc++
}
+ lock(&sched.gFree.lock)
+ sched.gFree.noStack.pushAll(noStackQ)
+ sched.gFree.stack.pushAll(stackQ)
+ sched.gFree.n += inc
unlock(&sched.gFree.lock)
}
}
@@ -4232,17 +4240,25 @@ retry:
// Purge all cached G's from gfree list to the global list.
func gfpurge(_p_ *p) {
- lock(&sched.gFree.lock)
+ var (
+ inc int32
+ stackQ gQueue
+ noStackQ gQueue
+ )
for !_p_.gFree.empty() {
gp := _p_.gFree.pop()
_p_.gFree.n--
if gp.stack.lo == 0 {
- sched.gFree.noStack.push(gp)
+ noStackQ.push(gp)
} else {
- sched.gFree.stack.push(gp)
+ stackQ.push(gp)
}
- sched.gFree.n++
+ inc++
}
+ lock(&sched.gFree.lock)
+ sched.gFree.noStack.pushAll(noStackQ)
+ sched.gFree.stack.pushAll(stackQ)
+ sched.gFree.n += inc
unlock(&sched.gFree.lock)
}