diff options
author | Ian Coolidge <icoolidge@google.com> | 2017-10-19 14:50:26 -0700 |
---|---|---|
committer | Ian Coolidge <icoolidge@google.com> | 2017-10-24 13:03:45 -0700 |
commit | b6b8de1758be800f170a15d7cf05fffc04619bb8 (patch) | |
tree | 24fba7fd8949352c707855e9bd46d4ca7c20db45 /src | |
parent | 80eee985f4646019a6d90e1187fd10d6319f81aa (diff) |
reland: cpu_linux: Don't spam sched_getcpu failures on qemu
__NR_getcpu isn't implemented on qemu, and for some reason
sysconf(_SC_NPROCESSORS_ONLN) returns the number of processers
of the host system, giving a false indication that there is more
than one cpu for the qemu case.
Expand the init_num_cpus sequence to also run sched_getcpu once,
if GPR_MUSL_LIBC_COMPAT isn't defined.
If that call isn't supported, initialize 'ncpus' to 1.
Later, in gpr_cpu_current_cpu, use gpr_cpu_num_cores to avoid
the system call in cases where we know it isn't supported, or
if the ncpus is otherwise 1.
Diffstat (limited to 'src')
-rw-r--r-- | src/core/lib/support/cpu_linux.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/core/lib/support/cpu_linux.cc b/src/core/lib/support/cpu_linux.cc index 2280668442..21b1a71dc9 100644 --- a/src/core/lib/support/cpu_linux.cc +++ b/src/core/lib/support/cpu_linux.cc @@ -36,6 +36,13 @@ static int ncpus = 0; static void init_num_cpus() { +#ifndef GPR_MUSL_LIBC_COMPAT + if (sched_getcpu() < 0) { + gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno)); + ncpus = 1; + return; + } +#endif /* This must be signed. sysconf returns -1 when the number cannot be determined */ ncpus = (int)sysconf(_SC_NPROCESSORS_ONLN); @@ -56,6 +63,9 @@ unsigned gpr_cpu_current_cpu(void) { // sched_getcpu() is undefined on musl return 0; #else + if (gpr_cpu_num_cores() == 1) { + return 0; + } int cpu = sched_getcpu(); if (cpu < 0) { gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno)); |