Commit eaf60360 authored by Zhengyu He's avatar Zhengyu He Committed by Ian Lance Taylor

runtime: fix GNU/Linux getproccount if sched_getaffinity does not return a multiple of 8

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: default avatarIan Lance Taylor <iant@golang.org>
parent 923299a6
...@@ -89,13 +89,13 @@ func getproccount() int32 { ...@@ -89,13 +89,13 @@ func getproccount() int32 {
// buffers, but we don't have a dynamic memory allocator at the // buffers, but we don't have a dynamic memory allocator at the
// moment, so that's a bit tricky and seems like overkill. // moment, so that's a bit tricky and seems like overkill.
const maxCPUs = 64 * 1024 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]) r := sched_getaffinity(0, unsafe.Sizeof(buf), &buf[0])
if r < 0 { if r < 0 {
return 1 return 1
} }
n := int32(0) n := int32(0)
for _, v := range buf[:r/sys.PtrSize] { for _, v := range buf[:r] {
for v != 0 { for v != 0 {
n += int32(v & 1) n += int32(v & 1)
v >>= 1 v >>= 1
...@@ -385,7 +385,7 @@ func raise(sig uint32) ...@@ -385,7 +385,7 @@ func raise(sig uint32)
func raiseproc(sig uint32) func raiseproc(sig uint32)
//go:noescape //go:noescape
func sched_getaffinity(pid, len uintptr, buf *uintptr) int32 func sched_getaffinity(pid, len uintptr, buf *byte) int32
func osyield() func osyield()
//go:nosplit //go:nosplit
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment