From f15761b50bb3a2d1bae9b97f147b2d660e2e4853 Mon Sep 17 00:00:00 2001 From: Ludi Rehak Date: Sat, 25 Jun 2022 13:27:11 -0700 Subject: [PATCH] runtime: fix formula for computing number of padding bytes In order to prevent false sharing of cache lines, structs are padded with some number of bytes. These bytes are unused, serving only to make the size of the struct a multiple of the size of the cache line. The current calculation of how much to pad is an overestimation, when the struct size is already a multiple of the cache line size without padding. For these cases, no padding is necessary, and the size of the inner pad field should be 0. The bug is that the pad field is sized to a whole 'nother cache line, wasting space. Here is the current formula that can never return 0: cpu.CacheLinePadSize - unsafe.Sizeof(myStruct{})%cpu.CacheLinePadSize This change simply mods that calculation by cpu.CacheLinePadSize, so that 0 will be returned instead of cpu.CacheLinePadSize. Change-Id: I26a2b287171bf47a3b9121873b2722f728381b5e Reviewed-on: https://go-review.googlesource.com/c/go/+/414214 Reviewed-by: Keith Randall Run-TryBot: Michael Pratt Auto-Submit: Michael Pratt Reviewed-by: Keith Randall Reviewed-by: Joedian Reid TryBot-Result: Gopher Robot --- src/runtime/mheap.go | 2 +- src/runtime/stack.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index af14bf58a3a..be53f7bd91e 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -200,7 +200,7 @@ type mheap struct { // central is indexed by spanClass. central [numSpanClasses]struct { mcentral mcentral - pad [cpu.CacheLinePadSize - unsafe.Sizeof(mcentral{})%cpu.CacheLinePadSize]byte + pad [(cpu.CacheLinePadSize - unsafe.Sizeof(mcentral{})%cpu.CacheLinePadSize) % cpu.CacheLinePadSize]byte } spanalloc fixalloc // allocator for span* diff --git a/src/runtime/stack.go b/src/runtime/stack.go index b94a4a7249e..22dc2d4748d 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -157,7 +157,7 @@ const ( // There is a free list for each order. var stackpool [_NumStackOrders]struct { item stackpoolItem - _ [cpu.CacheLinePadSize - unsafe.Sizeof(stackpoolItem{})%cpu.CacheLinePadSize]byte + _ [(cpu.CacheLinePadSize - unsafe.Sizeof(stackpoolItem{})%cpu.CacheLinePadSize) % cpu.CacheLinePadSize]byte } type stackpoolItem struct {