]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix GNU/Linux getproccount if sched_getaffinity does not return a multiple...
authorZhengyu He <hzy@google.com>
Thu, 2 Nov 2017 20:39:14 +0000 (13:39 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 3 Nov 2017 01:55:16 +0000 (01:55 +0000)
The current code can potentially return a smaller processor count on a
linux kernel when its cpumask_size (controlled by both kernel config and
boot parameter) is not a multiple of the pointer size, because
r/sys.PtrSize will be rounded down. Since sched_getaffinity returns the
size in bytes, we can just allocate the buf as a byte array to avoid the
extra calculation with the pointer size and roundups.

Change-Id: I0c21046012b88d8a56b5dd3dde1d158d94f8eea9
Reviewed-on: https://go-review.googlesource.com/75591
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/os_linux.go

index 3157b21371907cb6b6362c9a2ce5d799cda99aef..98e7f52b9e63e66c50805913d48880a784ffad2f 100644 (file)
@@ -89,13 +89,13 @@ func getproccount() int32 {
        // buffers, but we don't have a dynamic memory allocator at the
        // moment, so that's a bit tricky and seems like overkill.
        const maxCPUs = 64 * 1024
-       var buf [maxCPUs / (sys.PtrSize * 8)]uintptr
+       var buf [maxCPUs / 8]byte
        r := sched_getaffinity(0, unsafe.Sizeof(buf), &buf[0])
        if r < 0 {
                return 1
        }
        n := int32(0)
-       for _, v := range buf[:r/sys.PtrSize] {
+       for _, v := range buf[:r] {
                for v != 0 {
                        n += int32(v & 1)
                        v >>= 1
@@ -385,7 +385,7 @@ func raise(sig uint32)
 func raiseproc(sig uint32)
 
 //go:noescape
-func sched_getaffinity(pid, len uintptr, buf *uintptr) int32
+func sched_getaffinity(pid, len uintptr, buf *byte) int32
 func osyield()
 
 //go:nosplit