Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp3136707iog; Mon, 27 Jun 2022 09:53:04 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uwGkgAH2tvveS131s2xV3u0XUsP9XyodVEMX2Vn+BrdONNslcAygs0Fuq8JEVvn2Di6/+r X-Received: by 2002:aa7:c783:0:b0:435:2a52:3388 with SMTP id n3-20020aa7c783000000b004352a523388mr17332266eds.164.1656348784358; Mon, 27 Jun 2022 09:53:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656348784; cv=none; d=google.com; s=arc-20160816; b=mN261Iq79Zjcoco+HEfOYYYfFphX6xDbcLXIZNa6CJWRnmWhLCXVHsodVa6gThQE4O b9xlRqZsNZMr3V+aMEECjSCy/T7FDaf/Ptq8DpaBmGnrr3iMDdUsuToHd/Cn9BUKBbq+ enSuB7rUhblXWdDkgcKfsJXRrhgNmbcrwgoY1C968TEwy5nk2GlA+8aDMpihimfH/BRD k40AGQYUYmRSZWOA4hLnyqpnjJ8hWdfQdS6c10adw9LaYorCgMbgdADE/wljCrwTB/PK ebU5MGEKJGComRsRhpWXZ9iYgf1SYrGx6eUX1gaWUB329FnHSNSe/uJJEbJNupvEnk9Y oczA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=2X0YMR4doGI5s4MFYhx72Aqlx/HSr/zz0dnGpOBKJrI=; b=bzzRueP4+2KiXxXylKdYPq2XVnwuASU904mxPGNgZyVIWWE/xL2RYyIWGcQG2VwHVP eWtZq5UfCiwD5gzHJueU1DLuZnIhxzGOEnWdaz8Ai1JCBuuD9Z8qRTb5hBDbRaM3Lc4S pB24h02x+pNJubn/EbwOFHjiGtWb2wcPtZjDM/9dz4d4LoKeSoZbsNUhwOXrQSbVATyj sciyvIeju4dJxKEN2+JyrMopXVJ5lWojpnL/X8NSCIbHPnombB8mjC/S38O7owKg8SW9 4Ls5dmvk0w98j0Yyj0J11+H4vCkseNbXQ+puc4DRz+XxBi3QxZyVF9XG/wh/AA9YtTLM RAYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=eo1IOeTJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z8-20020a05640235c800b004356c132626si37383edc.620.2022.06.27.09.52.38; Mon, 27 Jun 2022 09:53:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=eo1IOeTJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239304AbiF0QjA (ORCPT + 99 others); Mon, 27 Jun 2022 12:39:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38306 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234772AbiF0Qi7 (ORCPT ); Mon, 27 Jun 2022 12:38:59 -0400 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70D7718361 for ; Mon, 27 Jun 2022 09:38:58 -0700 (PDT) Received: by mail-wm1-x333.google.com with SMTP id n185so5769304wmn.4 for ; Mon, 27 Jun 2022 09:38:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=2X0YMR4doGI5s4MFYhx72Aqlx/HSr/zz0dnGpOBKJrI=; b=eo1IOeTJvZiZniGYJFFgAk698L+00MlWQOrG2gWirsUWOqoesM22S/XvZRZWJAMyKK i9JzzAUR+049lxrM/++AAAMKJ2+KcXVwuEPUheYreeiKEVybhSe+gjvvt2m0ro/+VgCj BmLs/lMSb6pqsjaRd0YT5nINZNC3sstCSO9hkwfvFrWyAUEQZgZp2tHM/PctFwr4Pmp3 EwDJb5tDrb99wryofOaorvPD/qJt1pmIodVoH1sUASx1hZw57aDSVrZoWBbBmA7AwwPm FACK3P8s8SMel7DWA8oxiHJWtEokPH5KTX2b5h5s4NFH2+zAFFX6tL5LpGJFy+NxqGJw vTfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=2X0YMR4doGI5s4MFYhx72Aqlx/HSr/zz0dnGpOBKJrI=; b=pEJ6+gAlYl2LPjnDi+KqDXDhHtIYMvFsdtF3R/wHWEnXH7dp1ChuYMlIbtuitr2DGt WBHklU76T4iTCObqahHGBKc+zl7dfWza0AdvsARJ5riy1AHNum6UtDW/sHBmpCUbaJei V+QbeRDnYCnCfNTdmBgrXpBnSjCAO3Z6sL1h+H51hqM8Nl3+9Chb5D7a+fqg2H+RJQoV yNfDobQRXS5Rmrj3P0dHKdpv6hfiXs8EMcR6dXXBpsCCungFP8w+9jK1jzTdIjI2YqVn 8JZrLCyCMopO7abIdEMllrr1QjT+mmydqYr1b1jBgs7oxttKgNUy8FqSdl4LCiy9AAxH LkuQ== X-Gm-Message-State: AJIora8yH7Is+lW8LsrdJilJSGq9MqfqqWXiJHPcrAWvj/S+DwG1GFtz 4/6rz5K8q5583ENkn+di9/Xs0NhIHh5y2Dci6FLZuQ== X-Received: by 2002:a7b:c10c:0:b0:3a0:439d:6d66 with SMTP id w12-20020a7bc10c000000b003a0439d6d66mr14029728wmi.149.1656347936902; Mon, 27 Jun 2022 09:38:56 -0700 (PDT) MIME-Version: 1.0 References: <20220615130901.1151397-1-german.gomez@arm.com> <20220615130901.1151397-2-german.gomez@arm.com> In-Reply-To: <20220615130901.1151397-2-german.gomez@arm.com> From: Ian Rogers Date: Mon, 27 Jun 2022 09:38:44 -0700 Message-ID: Subject: Re: [PATCH] perf test: Add test for branch stack sampling To: German Gomez Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org, Anshuman Khandual , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 15, 2022 at 6:09 AM German Gomez wrote: > > Add a self test for branch stack sampling, to check that we get the > expected branch types, and filters behave as expected. > > Suggested-by: Anshuman Khandual > Signed-off-by: German Gomez Love tests, thanks! There are already shell tests that compile C code but they do it by having the C code within the shell test, for example: https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/tests/shell/pipe_test.sh?h=perf/core#n14 Having it this way I thinks means the tests can run properly when installed, as we don't install non-sh files: https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/Makefile.perf?h=perf/core#n1016 Thanks, Ian > --- > tools/perf/tests/shell/lib/brstack/main.h | 16 +++++ > tools/perf/tests/shell/lib/brstack/test.c | 24 +++++++ > tools/perf/tests/shell/test_brstack.sh | 86 +++++++++++++++++++++++ > 3 files changed, 126 insertions(+) > create mode 100644 tools/perf/tests/shell/lib/brstack/main.h > create mode 100644 tools/perf/tests/shell/lib/brstack/test.c > create mode 100755 tools/perf/tests/shell/test_brstack.sh > > diff --git a/tools/perf/tests/shell/lib/brstack/main.h b/tools/perf/tests/shell/lib/brstack/main.h > new file mode 100644 > index 000000000..94d2665ec > --- /dev/null > +++ b/tools/perf/tests/shell/lib/brstack/main.h > @@ -0,0 +1,16 @@ > +// SPDX-License-Identifier: GPL-2.0 > +#define BENCH_RUNS 99999 > + > +void bench(void); > + > +int main(void) > +{ > + int cnt = 0; > + > + while (1) { > + if ((cnt++) > BENCH_RUNS) > + break; > + bench(); /* call */ > + } /* branch (uncond) */ > + return 0; > +} > diff --git a/tools/perf/tests/shell/lib/brstack/test.c b/tools/perf/tests/shell/lib/brstack/test.c > new file mode 100644 > index 000000000..8a2308901 > --- /dev/null > +++ b/tools/perf/tests/shell/lib/brstack/test.c > @@ -0,0 +1,24 @@ > +// SPDX-License-Identifier: GPL-2.0 > +#include "main.h" > + > +int cnt; > + > +void bar(void) > +{ > +} /* return */ > + > +void foo(void) > +{ > + bar(); /* call */ > +} /* return */ > + > +void bench(void) > +{ > + void (*foo_ind)(void) = foo; > + > + if ((cnt++) % 3) /* branch (cond) */ > + foo(); /* call */ > + > + bar(); /* call */ > + foo_ind(); /* call (ind) */ > +} > diff --git a/tools/perf/tests/shell/test_brstack.sh b/tools/perf/tests/shell/test_brstack.sh > new file mode 100755 > index 000000000..2b1a1b20a > --- /dev/null > +++ b/tools/perf/tests/shell/test_brstack.sh > @@ -0,0 +1,86 @@ > +#!/bin/sh > +# Check branch stack sampling > + > +# SPDX-License-Identifier: GPL-2.0 > +# German Gomez , 2022 > + > +set -e > + > +# we need a C compiler to build the test programs > +# so bail if none is found > +if ! [ -x "$(command -v cc)" ]; then > + echo "failed: no compiler, install gcc" > + exit 2 > +fi > + > +# skip the test if the hardware doesn't support branch stack sampling > +perf record -b -o- -- true > /dev/null || exit 2 > + > +TMPDIR=$(mktemp -d /tmp/__perf_test.program.XXXXX) > + > +cleanup() { > + rm -rf $TMPDIR > +} > + > +trap cleanup exit term int > + > +test_user_branches() { > + echo > + echo "Testing user branch stack sampling" > + echo > + > + cc -fno-inline -g "$(dirname $0)/lib/brstack/test.c" -o $TMPDIR/a.out > + > + perf record -o $TMPDIR/perf.data -q --branch-filter any,save_type,u -- $TMPDIR/a.out > + perf script -i $TMPDIR/perf.data --fields brstacksym | xargs -n1 > $TMPDIR/perf.script > + > + # example of branch entries: > + # foo+0x14/bar+0x40/P/-/-/0/CALL > + > + set -x > + egrep -m1 "^bench\+[^ ]*/foo\+[^ ]*/IND_CALL$" $TMPDIR/perf.script > + egrep -m1 "^foo\+[^ ]*/bar\+[^ ]*/CALL$" $TMPDIR/perf.script > + egrep -m1 "^bench\+[^ ]*/foo\+[^ ]*/CALL$" $TMPDIR/perf.script > + egrep -m1 "^bench\+[^ ]*/bar\+[^ ]*/CALL$" $TMPDIR/perf.script > + egrep -m1 "^bar\+[^ ]*/foo\+[^ ]*/RET$" $TMPDIR/perf.script > + egrep -m1 "^foo\+[^ ]*/bench\+[^ ]*/RET$" $TMPDIR/perf.script > + egrep -m1 "^bench\+[^ ]*/bench\+[^ ]*/COND$" $TMPDIR/perf.script > + egrep -m1 "^main\+[^ ]*/main\+[^ ]*/UNCOND$" $TMPDIR/perf.script > + set +x > + > + # some branch types are still not being tested: > + # IND COND_CALL COND_RET SYSCALL SYSRET IRQ SERROR NO_TX > +} > + > +test_filter() { > + local filter=$1 > + local expect=$2 > + > + echo > + echo "Testing branch stack filtering permutation ($filter,$expect)" > + echo > + > + cc -fno-inline -g "$(dirname $0)/lib/brstack/test.c" -o $TMPDIR/a.out > + > + perf record -o $TMPDIR/perf.data -q --branch-filter $filter,save_type,u -- $TMPDIR/a.out > + perf script -i $TMPDIR/perf.data --fields brstack | xargs -n1 > $TMPDIR/perf.script > + > + # fail if we find any branch type that doesn't match any of the expected ones > + # also consider UNKNOWN branch types (-) > + if egrep -vm1 "^[^ ]*/($expect|-|( *))$" $TMPDIR/perf.script; then > + return 1 > + fi > +} > + > +test_user_branches > + > +# first argument is the argument passed to "--branch-stack ,save_type,u" > +# second argument are the expected branch types for the given filter > +test_filter "any_call" "CALL|IND_CALL|COND_CALL|SYSCALL|IRQ|FAULT_DATA|FAULT_INST" > +test_filter "call" "CALL|SYSCALL" > +test_filter "cond" "COND" > +test_filter "any_ret" "RET|COND_RET|SYSRET|ERET" > + > +test_filter "call,cond" "CALL|SYSCALL|COND" > +test_filter "any_call,cond" "CALL|IND_CALL|COND_CALL|IRQ|FAULT_DATA|FAULT_INST|SYSCALL|COND" > +test_filter "cond,any_call,any_ret" "COND|CALL|IND_CALL|COND_CALL|SYSCALL|IRQ|FAULT_DATA|FAULT_INST|RET|COND_RET|SYSRET|ERET" > -- > 2.25.1 >