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.
pull/13138/head
Ian Coolidge 7 years ago
parent 80eee985f4
commit b6b8de1758
  1. 10
      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));

Loading…
Cancel
Save