From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753353AbcD1Qnv (ORCPT ); Thu, 28 Apr 2016 12:43:51 -0400 Received: from www.linutronix.de ([62.245.132.108]:58931 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753270AbcD1Qns (ORCPT ); Thu, 28 Apr 2016 12:43:48 -0400 Message-Id: <20160428163525.940638456@linutronix.de> User-Agent: quilt/0.63-1 Date: Thu, 28 Apr 2016 16:42:13 -0000 From: Thomas Gleixner To: LKML Cc: Peter Zijlstra , Ingo Molnar , Linus Torvalds , Andrew Morton , Sebastian Andrzej Siewior , Darren Hart , Michael Kerrisk , Davidlohr Bueso , Chris Mason , "Carlos O'Donell" , Torvald Riegel , Eric Dumazet Subject: [patch 7/7] perf/bench/futex-hash: Support preallocate hash table References: <20160428161742.363543816@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=perf-bench-futex-hash-Support-preallocate-hash-table.patch X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001,URIBL_BLOCKED=0.001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Instead of using the default hash size on the first allocation it is possible to allocate a specific number of slots upfront. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Thomas Gleixner --- tools/perf/bench/futex-hash.c | 16 ++++++++++++++-- tools/perf/bench/futex.h | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) --- a/tools/perf/bench/futex-hash.c +++ b/tools/perf/bench/futex-hash.c @@ -30,6 +30,7 @@ static unsigned int nsecs = 10; static unsigned int nfutexes = 1024; static bool fshared = false, done = false, silent = false; static int futex_flag = 0; +static unsigned int prealloc; static int numa_node = -1; struct timeval start, end, runtime; @@ -51,6 +52,7 @@ static const struct option options[] = { OPT_UINTEGER('f', "futexes", &nfutexes, "Specify amount of futexes per 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_UINTEGER('p', "prealloc",&prealloc, "Specify number of preallocated hash slots"), #ifdef CONFIG_NUMA OPT_INTEGER( 'n', "numa", &numa_node, "Specify the NUMA node"), #endif @@ -138,6 +140,7 @@ int bench_futex_hash(int argc, const cha unsigned int i, ncpus; pthread_attr_t thread_attr; struct worker *worker = NULL; + char *prealloc_str = NULL; char *node_str = NULL; unsigned int cpunum; @@ -192,11 +195,20 @@ int bench_futex_hash(int argc, const cha if (!fshared) futex_flag = FUTEX_PRIVATE_FLAG; - printf("Run summary [PID %d]: %d threads%s, each operating on %d [%s] futexes for %d secs.\n\n", + if (prealloc) { + ret = futex_preallocate(prealloc); + if (ret < 0) + err(EXIT_FAILURE, "futex_prealloate"); + ret = asprintf(&prealloc_str, " P %u %d", prealloc, ret); + if (ret < 0) + err(EXIT_FAILURE, "futex_preallocate, asprintf"); + } + + printf("Run summary [PID %d]: %d threads%s, each operating on %d [%s%s] futexes for %d secs.\n\n", getpid(), nthreads, node_str ? : "", nfutexes, fshared ? "shared":"private", - nsecs); + prealloc_str ? : "", nsecs); init_stats(&throughput_stats); pthread_mutex_init(&thread_lock, NULL); --- a/tools/perf/bench/futex.h +++ b/tools/perf/bench/futex.h @@ -101,4 +101,9 @@ static inline int pthread_attr_setaffini } #endif +static inline int futex_preallocate(u_int32_t hash_size) +{ + return futex(0, FUTEX_PREALLOC_HASH, hash_size, NULL, NULL, 0, 0); +} + #endif /* _FUTEX_H */