commit 22804c0391f0549356959e1b474c43bfcba1b8cb Author: Nick Mathewson nickm@torproject.org Date: Tue Feb 19 02:31:53 2013 -0500
Check for CPUs more accurartely when ONLN != CONF.
There are two ways to use sysconf to ask about the number of CPUs. When we're on a VM, we would sometimes get it wrong by asking for the number of total CPUs (say, 64) when we should have been asking for the number of CPUs online (say, 1 or 2).
Fix for bug 8002. --- changes/bug8002 | 5 +++++ src/common/compat.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/changes/bug8002 b/changes/bug8002 new file mode 100644 index 0000000..d6e2ff2 --- /dev/null +++ b/changes/bug8002 @@ -0,0 +1,5 @@ + o Minor bugfixes: + - When autodetecting the number of CPUs, use the number of available + CPUs in preferernce to the number of configured CPUs. Inform the + user if this reduces the number of avialable CPUs. Fix for bug 8002. + Bugfix on 0.2.3.1-alpha. diff --git a/src/common/compat.c b/src/common/compat.c index d7ce894..e620653 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -2265,8 +2265,33 @@ compute_num_cpus_impl(void) return (int)info.dwNumberOfProcessors; else return -1; -#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_CONF) - long cpus = sysconf(_SC_NPROCESSORS_CONF); +#elif defined(HAVE_SYSCONF) +#ifdef _SC_NPROCESSORS_CONF + long cpus_conf = sysconf(_SC_NPROCESSORS_CONF); +#else + long cpus_conf = -1; +#endif +#ifdef _SC_NPROCESSORS_ONLN + long cpus_onln = sysconf(_SC_NPROCESSORS_ONLN); +#else + long cpus_onln = -1; +#endif + long cpus = -1; + + if (cpus_conf > 0 && cpus_onln < 0) { + cpus = cpus_conf; + } else if (cpus_onln > 0 && cpus_conf < 0) { + cpus = cpus_onln; + } else if (cpus_onln > 0 && cpus_conf > 0) { + if (cpus_onln < cpus_conf) { + log_notice(LD_GENERAL, "I think we have %ld CPUS, but only %ld of them " + "are available. Telling Tor to only use %ld. You can over" + "ride this with the NumCPUs option", + cpus_conf, cpus_onln, cpus_onln); + } + cpus = cpus_onln; + } + if (cpus >= 1 && cpus < INT_MAX) return (int)cpus; else
tor-commits@lists.torproject.org