From: Cyril Bonté Date: Mon, 12 Mar 2018 20:47:39 +0000 (+0100) Subject: BUG/MEDIUM: fix a 100% cpu usage with cpu-map and nbthread/nbproc X-Git-Tag: v1.9-dev1~377 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d400ab3a369523538c426cb70e059954c76b69c3;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: fix a 100% cpu usage with cpu-map and nbthread/nbproc Krishna Kumar reported a 100% cpu usage with a configuration using cpu-map and a high number of threads, Indeed, this minimal configuration to reproduce the issue : global nbthread 40 cpu-map auto:1/1-40 0-39 frontend test bind :8000 This is due to a wrong type in a shift operator (int vs unsigned long int), causing an endless loop while applying the cpu affinity on threads. The same issue may also occur with nbproc under FreeBSD. This commit addresses both cases. This patch must be backported to 1.8. --- diff --git a/src/haproxy.c b/src/haproxy.c index 8785b9f949..0c823c4979 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2837,7 +2837,7 @@ int main(int argc, char **argv) CPU_ZERO(&cpuset); while ((i = ffsl(cpu_map)) > 0) { CPU_SET(i - 1, &cpuset); - cpu_map &= ~(1 << (i - 1)); + cpu_map &= ~(1UL << (i - 1)); } ret = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(cpuset), &cpuset); } @@ -3037,7 +3037,7 @@ int main(int argc, char **argv) while ((j = ffsl(cpu_map)) > 0) { CPU_SET(j - 1, &cpuset); - cpu_map &= ~(1 << (j - 1)); + cpu_map &= ~(1UL << (j - 1)); } pthread_setaffinity_np(threads[i], sizeof(cpuset), &cpuset);