mirror of
https://github.com/golang/go
synced 2024-11-19 15:24:46 -07:00
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: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
923299a6b8
commit
eaf603601b
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user