From patchwork Mon Nov 27 04:21:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Davidlohr Bueso X-Patchwork-Id: 119653 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp1253102qgn; Sun, 26 Nov 2017 20:24:46 -0800 (PST) X-Google-Smtp-Source: AGs4zMaldcgSjbFJpL9MxUL7C7nZ61FpXT5COiqCkAP34wGNneghxsefIFDPYmPOPqWW3/Pb37GB X-Received: by 10.99.158.18 with SMTP id s18mr5627406pgd.176.1511756686118; Sun, 26 Nov 2017 20:24:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511756686; cv=none; d=google.com; s=arc-20160816; b=uiArzKnlmyrJhT7zMcnJnfxbVTS08RkOmIXOSGXteReI0Vc93wpIordZusfeVT90ZN pHIyRXy7H8Ul81Aef0hTB/dUkQHqF5wA5avkwjPxUgMZzHk8YlJoE87e75YMhVWYqE3p 7uK6a3Pu3mhjphYViHrgPs4JddV6ihZDMXiGcYHK6u4MWp4ZDkG8WY+zPIKebKaUBk59 bOd5rbZw08Y76IxPTMU5f7s0Zpf1/hcrSDQf2aSQYTBBZqyZxbyiOtP4HmSW08jmEiIE oaRY3nhu4zqQKJO+9kW15o9NJcQ7QjizkzyJdB7H67ieX4pcrQ9U97sNWeF7o4zo9VUd DyRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=Egeo+IAz+pjR/4WodQ+ePreMvKKeWeF087eM7b85QpY=; b=VsAq2rTaZp0G3PlaH+RO660vdado+L8Xkx+aDpd1VmcN+ZyZEXklOyVwKyzCdSIye8 uNH2ILv65cuXu2o2/69NBO/8N41gLw8AOeyGEXQRtEuJLmQegxzOWDw47oFd9C1TXcie dKbzgy4WWqM2mNr+Q5idCFV2YX7TSogG7qmMSOMsyjZOaPT6a3D10blRhNa1TJp11sGg tnw5oLKQ3kCGIoLdp8rYGhu7VaRWdKkQYL5ESZmTxf2MivY6X29ZwfsUayLNeejmMe4b LiablMwQEZ7NCNVORb1F0nTA8zrXWcD1Rc8JCGWs/QMIyr0L6qFcvrZ71HalIRY4DO9w eWRg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h82si24952559pfa.196.2017.11.26.20.24.45; Sun, 26 Nov 2017 20:24:46 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751367AbdK0EYn (ORCPT + 28 others); 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 Received: from localhost.localdomain (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by smtp2.provo.novell.com with ESMTP (TLS encrypted); Sun, 26 Nov 2017 21:24:27 -0700 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 Precedence: bulk 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(-) -- 2.13.6 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);