]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: reduced struct sizes found via pahole
authorSabyrzhan Tasbolatov <snovitoll@gmail.com>
Sun, 14 Apr 2024 11:55:57 +0000 (16:55 +0500)
committerGopher Robot <gobot@golang.org>
Mon, 22 Apr 2024 22:07:41 +0000 (22:07 +0000)
During my research of pahole with Go structs, I've found couple of
structs in runtime/ pkg where we can reduce several structs' sizes
highligted by pahole tool which detect byte holes and paddings.

Overall, there are 80 bytes reduced.

Change-Id: I398e5ed6f5b199394307741981cb5ad5b875e98f
Reviewed-on: https://go-review.googlesource.com/c/go/+/578795
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Joedian Reid <joedian@google.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/runtime/mgclimit.go
src/runtime/mgcscavenge.go
src/runtime/netpoll.go
src/runtime/proc.go
src/runtime/runtime2.go
src/runtime/sizeof_test.go
src/runtime/symtab.go

index bd6dc37e04839fce135757eea40682a22463311a..ad86fbd65bceb34fcf667c0b7d4c7c482b0b55a4 100644 (file)
@@ -33,16 +33,6 @@ type gcCPULimiterState struct {
        lock atomic.Uint32
 
        enabled atomic.Bool
-       bucket  struct {
-               // Invariants:
-               // - fill >= 0
-               // - capacity >= 0
-               // - fill <= capacity
-               fill, capacity uint64
-       }
-       // overflow is the cumulative amount of GC CPU time that we tried to fill the
-       // bucket with but exceeded its capacity.
-       overflow uint64
 
        // gcEnabled is an internal copy of gcBlackenEnabled that determines
        // whether the limiter tracks total assist time.
@@ -55,6 +45,20 @@ type gcCPULimiterState struct {
        // the mark and sweep phases.
        transitioning bool
 
+       // test indicates whether this instance of the struct was made for testing purposes.
+       test bool
+
+       bucket struct {
+               // Invariants:
+               // - fill >= 0
+               // - capacity >= 0
+               // - fill <= capacity
+               fill, capacity uint64
+       }
+       // overflow is the cumulative amount of GC CPU time that we tried to fill the
+       // bucket with but exceeded its capacity.
+       overflow uint64
+
        // assistTimePool is the accumulated assist time since the last update.
        assistTimePool atomic.Int64
 
@@ -77,9 +81,6 @@ type gcCPULimiterState struct {
        //
        // gomaxprocs isn't used directly so as to keep this structure unit-testable.
        nprocs int32
-
-       // test indicates whether this instance of the struct was made for testing purposes.
-       test bool
 }
 
 // limiting returns true if the CPU limiter is currently enabled, meaning the Go GC
index dede4a1ad317a757fbeaa7e4b1421617eee95ac2..8102940a7c75a5d8da3f06021c1cb9eaf218e92c 100644 (file)
@@ -281,15 +281,19 @@ type scavengerState struct {
        // g is the goroutine the scavenger is bound to.
        g *g
 
-       // parked is whether or not the scavenger is parked.
-       parked bool
-
        // timer is the timer used for the scavenger to sleep.
        timer *timer
 
        // sysmonWake signals to sysmon that it should wake the scavenger.
        sysmonWake atomic.Uint32
 
+       // parked is whether or not the scavenger is parked.
+       parked bool
+
+       // printControllerReset instructs printScavTrace to signal that
+       // the controller was reset.
+       printControllerReset bool
+
        // targetCPUFraction is the target CPU overhead for the scavenger.
        targetCPUFraction float64
 
@@ -312,10 +316,6 @@ type scavengerState struct {
        // value. Used if the controller's assumptions fail to hold.
        controllerCooldown int64
 
-       // printControllerReset instructs printScavTrace to signal that
-       // the controller was reset.
-       printControllerReset bool
-
        // sleepStub is a stub used for testing to avoid actually having
        // the scavenger sleep.
        //
index 6a73f709889d3278d315059ac7529f9f3f852d3b..bbfef80aec88695018953b5ba98ea7a497ef1151 100644 (file)
@@ -102,14 +102,14 @@ type pollDesc struct {
 
        lock    mutex // protects the following fields
        closing bool
+       rrun    bool      // whether rt is running
+       wrun    bool      // whether wt is running
        user    uint32    // user settable cookie
        rseq    uintptr   // protects from stale read timers
        rt      timer     // read deadline timer
-       rrun    bool      // whether rt is running
        rd      int64     // read deadline (a nanotime in the future, -1 when expired)
        wseq    uintptr   // protects from stale write timers
        wt      timer     // write deadline timer
-       wrun    bool      // whether wt is running
        wd      int64     // write deadline (a nanotime in the future, -1 when expired)
        self    *pollDesc // storage for indirect interface. See (*pollDesc).makeArg.
 }
index 1468c7c599d7598bd41e6f7b29f2d205e84c2f45..e469f20e5e68ca62f58628317ea207ba98033d0a 100644 (file)
@@ -6024,8 +6024,8 @@ func sysmon() {
 
 type sysmontick struct {
        schedtick   uint32
-       schedwhen   int64
        syscalltick uint32
+       schedwhen   int64
        syscallwhen int64
 }
 
index b58255f279bf052a673ac64286d05848923cc075..0093a6ddb9bb6d490cbfbb1d91b39c741daaa4ac 100644 (file)
@@ -510,12 +510,12 @@ type g struct {
        sleepWhen     int64          // when to sleep until
        selectDone    atomic.Uint32  // are we participating in a select and did someone win the race?
 
-       coroarg *coro // argument during coroutine transfers
-
        // goroutineProfiled indicates the status of this goroutine's stack for the
        // current in-progress goroutine profile
        goroutineProfiled goroutineProfileStateHolder
 
+       coroarg *coro // argument during coroutine transfers
+
        // Per-G tracer state.
        trace gTraceState
 
@@ -604,8 +604,8 @@ type m struct {
        // there's no stack to put them on. That is their sole purpose.
        waitunlockf          func(*g, unsafe.Pointer) bool
        waitlock             unsafe.Pointer
-       waitTraceBlockReason traceBlockReason
        waitTraceSkip        int
+       waitTraceBlockReason traceBlockReason
 
        syscalltick uint32
        freelink    *m // on sched.freem
index d235d6a3f80d207679a8d8430407623eb3bde09e..43aba98dcebcdb3d2a15721b814bdab8ee8a46ed 100644 (file)
@@ -20,7 +20,7 @@ func TestSizeof(t *testing.T) {
                _32bit uintptr // size on 32bit platforms
                _64bit uintptr // size on 64bit platforms
        }{
-               {runtime.G{}, 272, 440},   // g, but exported for testing
+               {runtime.G{}, 272, 432},   // g, but exported for testing
                {runtime.Sudog{}, 56, 88}, // sudog, but exported for testing
        }
 
index bfe415360edae7d7bf709b71d4813f168994b4d0..a7ce9c3a7e94c8c53fec33b3120aa8cf761fc77f 100644 (file)
@@ -401,13 +401,12 @@ type moduledata struct {
        modulehashes []modulehash
 
        hasmain uint8 // 1 if module contains the main function, 0 otherwise
+       bad     bool  // module failed to load and should be ignored
 
        gcdatamask, gcbssmask bitvector
 
        typemap map[typeOff]*_type // offset to *_rtype in previous module
 
-       bad bool // module failed to load and should be ignored
-
        next *moduledata
 }