]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: batch moving gFree list between local p and global schedt
authorAndy Pan <panjf2000@gmail.com>
Mon, 23 Nov 2020 07:42:48 +0000 (15:42 +0800)
committerAustin Clements <austin@google.com>
Thu, 25 Feb 2021 18:08:41 +0000 (18:08 +0000)
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>
src/runtime/proc.go

index dbb430fd259db9abcbb492bedea4fc0cbe2ecc48..19049d21f3f75ce874de939f3009d98f66d6fd91 100644 (file)
@@ -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)
 }