From: David Carlier Date: Fri, 13 Sep 2019 04:12:58 +0000 (+0100) Subject: BUILD/MEDIUM: threads: enable cpu_affinity on osx X-Git-Tag: v2.1-dev3~60 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5e4c8e2a67b8db5fe293c871b00bbb33ec72fc67;p=thirdparty%2Fhaproxy.git BUILD/MEDIUM: threads: enable cpu_affinity on osx Enable it but on a per thread basis only using Darwin native API. --- diff --git a/Makefile b/Makefile index 9cacb93304..fd8edc5963 100644 --- a/Makefile +++ b/Makefile @@ -356,7 +356,7 @@ endif # Mac OS/X ifeq ($(TARGET),osx) set_target_defaults = $(call default_opts, \ - USE_POLL USE_TPROXY USE_LIBCRYPT USE_THREAD USE_KQUEUE) + USE_POLL USE_TPROXY USE_LIBCRYPT USE_THREAD USE_CPU_AFFINITY USE_KQUEUE) EXPORT_SYMBOL = -export_dynamic endif diff --git a/src/haproxy.c b/src/haproxy.c index db6f21f560..a4f2e0df53 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -59,6 +59,11 @@ #endif #include #endif +#ifdef __APPLE__ +#include +#include +#include +#endif #endif #if defined(USE_PRCTL) @@ -3164,7 +3169,7 @@ int main(int argc, char **argv) } ret = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(cpuset), &cpuset); } -#else +#elif defined(__linux__) sched_setaffinity(0, sizeof(unsigned long), (void *)&global.cpu_map.proc[proc]); #endif #endif @@ -3377,6 +3382,17 @@ int main(int argc, char **argv) if (i < MAX_THREADS && /* only the first 32/64 threads may be pinned */ global.cpu_map.thread[i]) {/* only do this if the thread has a THREAD map */ +#if defined(__APPLE__) + int j; + unsigned long cpu_map = global.cpu_map.thread[i]; + + while ((j = ffsl(cpu_map)) > 0) { + thread_affinity_policy_data_t cpu_set = { j - 1 }; + thread_port_t mthread = pthread_mach_thread_np(ha_thread_info[i].pthread); + thread_policy_set(mthread, THREAD_AFFINITY_POLICY, (thread_policy_t)&cpu_set, 1); + cpu_map &= ~(1UL << (j - 1)); + } +#else #if defined(__FreeBSD__) || defined(__NetBSD__) cpuset_t cpuset; #else @@ -3393,6 +3409,7 @@ int main(int argc, char **argv) } pthread_setaffinity_np(ha_thread_info[i].pthread, sizeof(cpuset), &cpuset); +#endif } } #endif /* !USE_CPU_AFFINITY */