]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix documented alignment of 32KiB and 64KiB size classes
authorMatthew Dempsky <mdempsky@google.com>
Sat, 13 Mar 2021 00:58:10 +0000 (16:58 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Sat, 13 Mar 2021 04:53:32 +0000 (04:53 +0000)
As Cherry pointed out on golang.org/cl/299909, the page allocator
doesn't guarantee any alignment for multi-page allocations, so object
alignments are thus implicitly capped at page alignment.

Change-Id: I6f5df27f269b095cde54056f876fe4240f69c5c7
Reviewed-on: https://go-review.googlesource.com/c/go/+/301292
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Trust: Matthew Dempsky <mdempsky@google.com>

src/runtime/mksizeclasses.go
src/runtime/sizeclasses.go

index ddbf1bf7feac4ea7702ec57731aa19e61ca31be3..b1b10e9e0230a9976968a4b7cf84a9ee2d746eda 100644 (file)
@@ -239,7 +239,7 @@ func computeDivMagic(c *class) {
 func printComment(w io.Writer, classes []class) {
        fmt.Fprintf(w, "// %-5s  %-9s  %-10s  %-7s  %-10s  %-9s  %-9s\n", "class", "bytes/obj", "bytes/span", "objects", "tail waste", "max waste", "min align")
        prevSize := 0
-       var minAligns [32]int
+       var minAligns [pageShift + 1]int
        for i, c := range classes {
                if i == 0 {
                        continue
@@ -249,6 +249,10 @@ func printComment(w io.Writer, classes []class) {
                tailWaste := spanSize - c.size*(spanSize/c.size)
                maxWaste := float64((c.size-prevSize-1)*objects+tailWaste) / float64(spanSize)
                alignBits := bits.TrailingZeros(uint(c.size))
+               if alignBits > pageShift {
+                       // object alignment is capped at page alignment
+                       alignBits = pageShift
+               }
                for i := range minAligns {
                        if i > alignBits {
                                minAligns[i] = 0
index 65c72cfb1a383bef5757c947ca4350f1b3b2bc5f..067871eaf3453615cda0e6479f2ebef44d8eac57 100644 (file)
@@ -62,7 +62,7 @@ package runtime
 //    56      12288       24576        2           0     11.45%       4096
 //    57      13568       40960        3         256      9.99%        256
 //    58      14336       57344        4           0      5.35%       2048
-//    59      16384       16384        1           0     12.49%      16384
+//    59      16384       16384        1           0     12.49%       8192
 //    60      18432       73728        4           0     11.11%       2048
 //    61      19072       57344        3         128      3.57%        128
 //    62      20480       40960        2           0      6.87%       4096
@@ -70,7 +70,7 @@ package runtime
 //    64      24576       24576        1           0     11.45%       8192
 //    65      27264       81920        3         128     10.00%        128
 //    66      28672       57344        2           0      4.91%       4096
-//    67      32768       32768        1           0     12.50%      32768
+//    67      32768       32768        1           0     12.50%       8192
 
 // alignment  bits  min obj size
 //         8     3             8
@@ -79,7 +79,7 @@ package runtime
 //        64     6           512
 //       128     7           768
 //      4096    12         28672
-//     32768    15         32768
+//      8192    13         32768
 
 const (
        _MaxSmallSize   = 32768