diff --git a/8005-PAGENUM-enable-custom-span-size.patch b/8005-PAGENUM-enable-custom-span-size.patch new file mode 100644 index 0000000000000000000000000000000000000000..79a32f30a086a63babf36d35a81df1c0d7b84894 --- /dev/null +++ b/8005-PAGENUM-enable-custom-span-size.patch @@ -0,0 +1,274 @@ +From 0507be7c01e2346115ed46a3f4871f374bf7086f Mon Sep 17 00:00:00 2001 +From: huang-xiaoquan +Date: Tue, 18 Nov 2025 16:09:16 +0800 +Subject: [PATCH] [PAGENUM] enable custom span size + +--- + src/internal/goexperiment/exp_pagenum_off.go | 9 ++ + src/internal/goexperiment/exp_pagenum_on.go | 9 ++ + src/internal/goexperiment/flags.go | 3 + + src/runtime/heapdump.go | 3 +- + src/runtime/mksizeclasses.go | 18 +++- + src/runtime/sizeclasses.go | 2 + + src/runtime/sizeclasses_expand_span_size.go | 101 +++++++++++++++++++ + 7 files changed, 142 insertions(+), 3 deletions(-) + create mode 100644 src/internal/goexperiment/exp_pagenum_off.go + create mode 100644 src/internal/goexperiment/exp_pagenum_on.go + create mode 100644 src/runtime/sizeclasses_expand_span_size.go + +diff --git a/src/internal/goexperiment/exp_pagenum_off.go b/src/internal/goexperiment/exp_pagenum_off.go +new file mode 100644 +index 00000000..7581ce13 +--- /dev/null ++++ b/src/internal/goexperiment/exp_pagenum_off.go +@@ -0,0 +1,9 @@ ++// Code generated by mkconsts.go. DO NOT EDIT. ++ ++//go:build !goexperiment.pagenum ++// +build !goexperiment.pagenum ++ ++package goexperiment ++ ++const PageNum = false ++const PageNumInt = 0 +diff --git a/src/internal/goexperiment/exp_pagenum_on.go b/src/internal/goexperiment/exp_pagenum_on.go +new file mode 100644 +index 00000000..76cd6739 +--- /dev/null ++++ b/src/internal/goexperiment/exp_pagenum_on.go +@@ -0,0 +1,9 @@ ++// Code generated by mkconsts.go. DO NOT EDIT. ++ ++//go:build goexperiment.pagenum ++// +build goexperiment.pagenum ++ ++package goexperiment ++ ++const PageNum = true ++const PageNumInt = 1 +diff --git a/src/internal/goexperiment/flags.go b/src/internal/goexperiment/flags.go +index 1524ffcc..87ddd355 100644 +--- a/src/internal/goexperiment/flags.go ++++ b/src/internal/goexperiment/flags.go +@@ -112,4 +112,7 @@ type Flags struct { + + // Kunpeng malloc prefetch optimization. + PrefetchMalloc bool ++ ++ //PageNum enables 128k span size ++ PageNum bool + } +diff --git a/src/runtime/heapdump.go b/src/runtime/heapdump.go +index 8ddec8b2..f0fec0af 100644 +--- a/src/runtime/heapdump.go ++++ b/src/runtime/heapdump.go +@@ -14,6 +14,7 @@ package runtime + import ( + "internal/abi" + "internal/goarch" ++ "internal/goexperiment" + "unsafe" + ) + +@@ -471,7 +472,7 @@ func dumproots() { + + // Bit vector of free marks. + // Needs to be as big as the largest number of objects per span. +-var freemark [_PageSize / 8]bool ++var freemark [_PageSize / 8 * (1 + goexperiment.PageNumInt * _PageNumberMulti)]bool + + func dumpobjs() { + // To protect mheap_.allspans. +diff --git a/src/runtime/mksizeclasses.go b/src/runtime/mksizeclasses.go +index 156e6131..ff8493b6 100644 +--- a/src/runtime/mksizeclasses.go ++++ b/src/runtime/mksizeclasses.go +@@ -43,7 +43,7 @@ import ( + + // Generate msize.go + +-var stdout = flag.Bool("stdout", false, "write to stdout instead of sizeclasses.go") ++var stdout = flag.Bool("stdout", false, "write to stdout instead of sizeclasses_expand_span_size.go") + + func main() { + flag.Parse() +@@ -52,6 +52,9 @@ func main() { + fmt.Fprintln(&b, "// Code generated by mksizeclasses.go; DO NOT EDIT.") + fmt.Fprintln(&b, "//go:generate go run mksizeclasses.go") + fmt.Fprintln(&b) ++ if !*stdout { ++ fmt.Fprintln(&b, "//go:build goexperiment.pagenum") ++ } + fmt.Fprintln(&b, "package runtime") + classes := makeClasses() + +@@ -66,7 +69,7 @@ func main() { + if *stdout { + _, err = os.Stdout.Write(out) + } else { +- err = os.WriteFile("sizeclasses.go", out, 0666) ++ err = os.WriteFile("sizeclasses_expand_span_size.go", out, 0666) + } + if err != nil { + log.Fatal(err) +@@ -83,6 +86,7 @@ const ( + + // Derived constants. + pageSize = 1 << pageShift ++ pageNumberMultiplier = 8 + ) + + type class struct { +@@ -146,6 +150,15 @@ func makeClasses() []class { + continue + } + c := &classes[i] ++ ++ // 52 indicates 8x pages for object under 8KB (min span 8KB*8=64KB) ++ // 60 indicates 4x pages for object under 16KB (min span 8KB*4=32KB) ++ if i < 52 { ++ c.npages = pageNumberMultiplier ++ } else if i < 60 { ++ c.npages *= 4 ++ } ++ + psize := c.npages * pageSize + new_size := (psize / (psize / c.size)) &^ (largeSizeDiv - 1) + if new_size > c.size { +@@ -297,6 +310,7 @@ func printClasses(w io.Writer, classes []class) { + fmt.Fprintf(w, "_NumSizeClasses = %d\n", len(classes)) + fmt.Fprintf(w, "_PageShift = %d\n", pageShift) + fmt.Fprintf(w, "maxObjsPerSpan = %d\n", maxObjsPerSpan(classes)) ++ fmt.Fprintf(w, "_PageNumberMulti = %d\n", pageNumberMultiplier) + fmt.Fprintln(w, ")") + + fmt.Fprint(w, "var class_to_size = [_NumSizeClasses]uint16 {") +diff --git a/src/runtime/sizeclasses.go b/src/runtime/sizeclasses.go +index 93146234..115370b3 100644 +--- a/src/runtime/sizeclasses.go ++++ b/src/runtime/sizeclasses.go +@@ -1,5 +1,6 @@ + // Code generated by mksizeclasses.go; DO NOT EDIT. + //go:generate go run mksizeclasses.go ++//go:build !goexperiment.pagenum + + package runtime + +@@ -89,6 +90,7 @@ const ( + _NumSizeClasses = 68 + _PageShift = 13 + maxObjsPerSpan = 1024 ++ _PageNumberMulti = 1 + ) + + var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 24, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768} +diff --git a/src/runtime/sizeclasses_expand_span_size.go b/src/runtime/sizeclasses_expand_span_size.go +new file mode 100644 +index 00000000..1b938112 +--- /dev/null ++++ b/src/runtime/sizeclasses_expand_span_size.go +@@ -0,0 +1,101 @@ ++// Code generated by mksizeclasses.go; DO NOT EDIT. ++//go:generate go run mksizeclasses.go ++ ++//go:build goexperiment.pagenum ++ ++package runtime ++ ++// class bytes/obj bytes/span objects tail waste max waste min align ++// 1 8 65536 8192 0 87.50% 8 ++// 2 16 65536 4096 0 43.75% 16 ++// 3 24 65536 2730 16 29.18% 8 ++// 4 32 65536 2048 0 21.88% 32 ++// 5 48 65536 1365 16 31.27% 16 ++// 6 64 65536 1024 0 23.44% 64 ++// 7 80 65536 819 16 18.77% 16 ++// 8 96 65536 682 64 15.71% 32 ++// 9 112 65536 585 16 13.41% 16 ++// 10 128 65536 512 0 11.72% 128 ++// 11 144 65536 455 16 10.44% 16 ++// 12 160 65536 409 96 9.51% 32 ++// 13 176 65536 372 64 8.61% 16 ++// 14 192 65536 341 64 7.90% 64 ++// 15 208 65536 315 16 7.23% 16 ++// 16 224 65536 292 128 6.88% 32 ++// 17 240 65536 273 16 6.27% 16 ++// 18 256 65536 256 0 5.86% 256 ++// 19 288 65536 227 160 10.98% 32 ++// 20 320 65536 204 256 10.04% 64 ++// 21 352 65536 186 64 8.90% 32 ++// 22 384 65536 170 256 8.43% 128 ++// 23 416 65536 157 224 7.77% 32 ++// 24 448 65536 146 128 7.10% 64 ++// 25 480 65536 136 256 6.82% 32 ++// 26 512 65536 128 0 6.05% 512 ++// 27 576 65536 113 448 11.55% 64 ++// 28 640 65536 102 256 10.20% 128 ++// 29 704 65536 93 64 9.04% 64 ++// 30 768 65536 85 256 8.56% 256 ++// 31 896 65536 73 128 14.34% 128 ++// 32 1024 65536 64 0 12.40% 1024 ++// 33 1152 65536 56 1024 12.41% 128 ++// 34 1280 65536 51 256 10.27% 256 ++// 35 1408 65536 46 768 10.09% 128 ++// 36 1536 65536 42 1024 9.70% 512 ++// 37 1664 65536 39 640 8.53% 128 ++// 38 2048 65536 32 0 18.70% 2048 ++// 39 2304 65536 28 1024 12.46% 256 ++// 40 2560 65536 25 1536 12.07% 512 ++// 41 2816 65536 23 768 10.12% 256 ++// 42 3072 65536 21 1024 9.73% 1024 ++// 43 3328 65536 19 2304 10.91% 256 ++// 44 4096 65536 16 0 18.73% 4096 ++// 45 4608 65536 14 1024 12.48% 512 ++// 46 5376 65536 12 1024 15.61% 256 ++// 47 6528 65536 10 256 17.95% 128 ++// 48 6528 65536 10 256 0.38% 128 ++// 49 7168 65536 9 1024 10.34% 1024 ++// 50 7168 65536 9 1024 1.55% 1024 ++// 51 8192 65536 8 0 12.49% 8192 ++// 52 8448 229376 27 1280 3.56% 256 ++// 53 8832 196608 22 2304 5.46% 128 ++// 54 9600 163840 17 640 8.35% 128 ++// 55 10880 131072 12 512 12.10% 128 ++// 56 12288 98304 8 0 11.45% 4096 ++// 57 13568 163840 12 1024 9.99% 256 ++// 58 14336 229376 16 0 5.35% 2048 ++// 59 16384 65536 4 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 ++// 63 21760 65536 3 256 6.25% 256 ++// 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% 8192 ++ ++// alignment bits min obj size ++// 8 3 8 ++// 16 4 32 ++// 32 5 256 ++// 64 6 512 ++// 128 7 768 ++// 4096 12 28672 ++// 8192 13 32768 ++ ++const ( ++ _MaxSmallSize = 32768 ++ smallSizeDiv = 8 ++ smallSizeMax = 1024 ++ largeSizeDiv = 128 ++ _NumSizeClasses = 68 ++ _PageShift = 13 ++ maxObjsPerSpan = 8192 ++ _PageNumberMulti = 8 ++) ++ ++var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 24, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536, 1664, 2048, 2304, 2560, 2816, 3072, 3328, 4096, 4608, 5376, 6528, 6528, 7168, 7168, 8192, 8448, 8832, 9600, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768} ++var class_to_allocnpages = [_NumSizeClasses]uint8{0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 28, 24, 20, 16, 12, 20, 28, 8, 9, 7, 5, 8, 3, 10, 7, 4} ++var class_to_divmagic = [_NumSizeClasses]uint32{0, ^uint32(0)/8 + 1, ^uint32(0)/16 + 1, ^uint32(0)/24 + 1, ^uint32(0)/32 + 1, ^uint32(0)/48 + 1, ^uint32(0)/64 + 1, ^uint32(0)/80 + 1, ^uint32(0)/96 + 1, ^uint32(0)/112 + 1, ^uint32(0)/128 + 1, ^uint32(0)/144 + 1, ^uint32(0)/160 + 1, ^uint32(0)/176 + 1, ^uint32(0)/192 + 1, ^uint32(0)/208 + 1, ^uint32(0)/224 + 1, ^uint32(0)/240 + 1, ^uint32(0)/256 + 1, ^uint32(0)/288 + 1, ^uint32(0)/320 + 1, ^uint32(0)/352 + 1, ^uint32(0)/384 + 1, ^uint32(0)/416 + 1, ^uint32(0)/448 + 1, ^uint32(0)/480 + 1, ^uint32(0)/512 + 1, ^uint32(0)/576 + 1, ^uint32(0)/640 + 1, ^uint32(0)/704 + 1, ^uint32(0)/768 + 1, ^uint32(0)/896 + 1, ^uint32(0)/1024 + 1, ^uint32(0)/1152 + 1, ^uint32(0)/1280 + 1, ^uint32(0)/1408 + 1, ^uint32(0)/1536 + 1, ^uint32(0)/1664 + 1, ^uint32(0)/2048 + 1, ^uint32(0)/2304 + 1, ^uint32(0)/2560 + 1, ^uint32(0)/2816 + 1, ^uint32(0)/3072 + 1, ^uint32(0)/3328 + 1, ^uint32(0)/4096 + 1, ^uint32(0)/4608 + 1, ^uint32(0)/5376 + 1, ^uint32(0)/6528 + 1, ^uint32(0)/6528 + 1, ^uint32(0)/7168 + 1, ^uint32(0)/7168 + 1, ^uint32(0)/8192 + 1, ^uint32(0)/8448 + 1, ^uint32(0)/8832 + 1, ^uint32(0)/9600 + 1, ^uint32(0)/10880 + 1, ^uint32(0)/12288 + 1, ^uint32(0)/13568 + 1, ^uint32(0)/14336 + 1, ^uint32(0)/16384 + 1, ^uint32(0)/18432 + 1, ^uint32(0)/19072 + 1, ^uint32(0)/20480 + 1, ^uint32(0)/21760 + 1, ^uint32(0)/24576 + 1, ^uint32(0)/27264 + 1, ^uint32(0)/28672 + 1, ^uint32(0)/32768 + 1} ++var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32} ++var size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{32, 33, 34, 35, 36, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, 49, 49, 49, 49, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67} +-- +2.33.0 + diff --git a/golang.spec b/golang.spec index e1117d4e780c33520cea3ad2f45d9956441cb483..d6b475408af77741fb1e3ba1898980a708e15a55 100644 --- a/golang.spec +++ b/golang.spec @@ -69,7 +69,7 @@ Name: golang Version: 1.21.4 -Release: 40 +Release: 41 Summary: The Go Programming Language License: BSD and Public Domain URL: https://golang.org/ @@ -186,6 +186,7 @@ Patch8001: 8001-runtime-add-kunpeng-malloc-optimize.patch Patch8002: 8002-cmd-go-Use-AI-to-guide-optimization.patch Patch8003: 8003-internal-buildcfg-add-Kunpeng-atomic-optimize.patch Patch8004: 8004-runtime-add-gcRatio-option.patch +Patch8005: 8005-PAGENUM-enable-custom-span-size.patch # Part 2000 ~ 2119 # RISC-V RVA23 support backport @@ -548,6 +549,12 @@ fi %files devel -f go-tests.list -f go-misc.list -f go-src.list %changelog +* Tue Nov 18 2025 huang-xiaoquan - 1.21.4-41 +- Type:Feature +- CVE:NA +- SUG:NA +- DESC: [pagenum] enable custom span size + * Fri Sep 26 2025 Julian Zhu - 1.21.4-40 - Type:bugfix - CVE:NA