From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751360AbdK0EYn (ORCPT ); Sun, 26 Nov 2017 23:24:43 -0500 Received: from smtp2.provo.novell.com ([137.65.250.81]:34087 "EHLO smtp2.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751227AbdK0EYk (ORCPT ); Sun, 26 Nov 2017 23:24:40 -0500 From: Davidlohr Bueso To: acme@kernel.org Cc: james.yang@arm.com, kim.phillips@arm.com, dave@stgolabs.net, linux-kernel@vger.kernel.org, Kim Phillips , Davidlohr Bueso Subject: [PATCH 2/3] perf bench futex: Add --affine-wakers option to wake-parallel Date: Sun, 26 Nov 2017 20:21:00 -0800 Message-Id: <20171127042101.3659-3-dave@stgolabs.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171127042101.3659-1-dave@stgolabs.net> References: <20171127042101.3659-1-dave@stgolabs.net> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: James Yang The waker threads' processor affinity is not specified, so the result has run-to-run variability as the scheduler decides on which CPUs they are to run. So we add a -W/--affine-wakers flag to stripe the affinity of the waker threads across the online CPUs instead of having the scheduler place them. Cc: Kim Phillips Signed-off-by: James Yang Signed-off-by: Davidlohr Bueso --- tools/perf/bench/futex-wake-parallel.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tools/perf/bench/futex-wake-parallel.c b/tools/perf/bench/futex-wake-parallel.c index 979e303e4797..c04e207ea37c 100644 --- a/tools/perf/bench/futex-wake-parallel.c +++ b/tools/perf/bench/futex-wake-parallel.c @@ -39,6 +39,7 @@ static u_int32_t futex = 0; static pthread_t *blocked_worker; static bool done = false, silent = false, fshared = false; +static bool affine_wakers = false; static unsigned int nblocked_threads = 0, nwaking_threads = 0; static pthread_mutex_t thread_lock; static pthread_cond_t thread_parent, thread_worker; @@ -51,6 +52,7 @@ static const struct option options[] = { OPT_UINTEGER('w', "nwakers", &nwaking_threads, "Specify amount of waking threads"), OPT_BOOLEAN( 's', "silent", &silent, "Silent mode: do not display data/details"), OPT_BOOLEAN( 'S', "shared", &fshared, "Use shared futexes instead of private ones"), + OPT_BOOLEAN( 'W', "affine-wakers", &affine_wakers, "Stripe affinity of waker threads across CPUs"), OPT_END() }; @@ -78,7 +80,8 @@ static void *waking_workerfn(void *arg) return NULL; } -static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr) +static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr, + struct cpu_map *cpu) { unsigned int i; @@ -91,6 +94,17 @@ static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr) * as it will affect the order to acquire the hb spinlock. * For now let the scheduler decide. */ + if (affine_wakers) { + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + CPU_SET(cpu->map[(i + 1) % cpu->nr], &cpuset); + + if (pthread_attr_setaffinity_np(&thread_attr, + sizeof(cpu_set_t), + &cpuset)) + err(EXIT_FAILURE, "pthread_attr_setaffinity_np"); + } + if (pthread_create(&td[i].worker, &thread_attr, waking_workerfn, (void *)&td[i])) err(EXIT_FAILURE, "pthread_create"); @@ -276,7 +290,7 @@ int bench_futex_wake_parallel(int argc, const char **argv) usleep(100000); /* Ok, all threads are patiently blocked, start waking folks up */ - wakeup_threads(waking_worker, thread_attr); + wakeup_threads(waking_worker, thread_attr, cpu); for (i = 0; i < nblocked_threads; i++) { ret = pthread_join(blocked_worker[i], NULL); -- 2.13.6