From nobody Wed Feb 11 06:53:49 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D348AC761A6 for ; Tue, 4 Apr 2023 13:37:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234786AbjDDNhE (ORCPT ); Tue, 4 Apr 2023 09:37:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235056AbjDDNhB (ORCPT ); Tue, 4 Apr 2023 09:37:01 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F97C3C0F for ; Tue, 4 Apr 2023 06:36:44 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id n15-20020a170902f60f00b001a273a4a685so10905553plg.15 for ; Tue, 04 Apr 2023 06:36:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680615404; h=to:from:subject:mime-version:message-id:date:from:to:cc:subject :date:message-id:reply-to; bh=cppqNuJqNfjI/fjE8JP7DNjn6r/mL5/pt3t5XxOPExA=; b=ehl5iEHVTIAEgtle7mTcCY2z3CyGMUn61IFUNizPHnQ6LhTrCkW2IP/z8bFv7OCKFC EsTwGxi616l/ek9+ml/5uO2ZA6UbVQESfOAviP4Eh4GWgyE/g7s+j7GRoq+IRSlr0ZFw RBMfkz79TSxP56t9QJr25B/STQo92SI8xoL+9xvxiWNOmiVPbsQMxGrNuPbHg+IOBqhp ly7Bar6GvzQArnAt53AQe1p78LihAAF0v4PWHPQtGxSRwA6VjFAVdKXrlxhMhYEvxYYN LId3mQGsuOWmaPw0655bS2PsZLAcf592syinv7VYb52oc6y+F6x6droyl0BK++NL5jKc hH1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680615404; h=to:from:subject:mime-version:message-id:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=cppqNuJqNfjI/fjE8JP7DNjn6r/mL5/pt3t5XxOPExA=; b=0OcUed+lSZw981HyFcCgMNKdehtcbQ/VedPfyAIBSruKUTB4XHwgQqXMWSafQRV27g 80Hoiql1YitSlhGOHgCE8HVgUEIN1hnMpv5fAU6L2OVWgPBHJgP1fwYT5hZHT0U7uWJn 6mQuEhrLjeO/KrE8D3ASxlwHHmkCcGd09JUnjl1sc5TqKfkRArWc1V2iACkh5JRnNRmV PHi1brP/Qds8xeI+0azvatvloqzGHg5MfA3BL5qPZQhxQNr6Sm3usRLaOL5CnARG/7MT mM8+e11auR3z27STCV8U0d6JbvBoEIpYntZ5DJY2swaWAoAA+bGOYX4fBqoM+zKJQPpQ xDDg== X-Gm-Message-State: AAQBX9dP0GSshL2n9kn9jcYifZkUF+n5dmWwE8bCLcyqU+pX8y9nOCEx ETRE/ZALjlNO1UnGkiyEZe1dvOlqQ0c4 X-Google-Smtp-Source: AKy350YAaDcmQVOcsIWil/7wHmUuytQoOyVBbAh0m+2nMYSO28buvvy6EHMK/Y/2H468iywCtYaZ89KWqbpB X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9dc:a977:817d:341]) (user=irogers job=sendgmr) by 2002:aa7:8887:0:b0:62d:ccc4:2e03 with SMTP id z7-20020aa78887000000b0062dccc42e03mr1297193pfe.4.1680615404097; Tue, 04 Apr 2023 06:36:44 -0700 (PDT) Date: Tue, 4 Apr 2023 06:36:30 -0700 Message-Id: <20230404133630.1985739-1-irogers@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Subject: [PATCH v2] perf pmu: Make parser reentrant From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , James Clark , Suzuki Poulouse , Sean Christopherson , Ravi Bangoria , Rob Herring , Leo Yan , German Gomez , Jing Zhang , Gaosheng Cui , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" By default bison uses global state for compatibility with yacc. Make the parser reentrant so that it may be used in asynchronous and multithreaded situations. Signed-off-by: Ian Rogers --- tools/perf/util/pmu.c | 24 ++++++++++++++++++------ tools/perf/util/pmu.h | 2 +- tools/perf/util/pmu.l | 17 ++++++++++++----- tools/perf/util/pmu.y | 5 ++++- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 78a407b42ad1..f603cdabf797 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -24,6 +24,8 @@ #include "evsel.h" #include "pmu.h" #include "pmus.h" +#include "pmu-bison.h" +#include "pmu-flex.h" #include "parse-events.h" #include "print-events.h" #include "header.h" @@ -57,9 +59,6 @@ struct perf_pmu_format { struct list_head list; }; =20 -int perf_pmu_parse(struct list_head *list, char *name); -extern FILE *perf_pmu_in; - static bool hybrid_scanned; =20 static struct perf_pmu *perf_pmu__find2(int dirfd, const char *name); @@ -81,6 +80,8 @@ int perf_pmu__format_parse(int dirfd, struct list_head *h= ead) while (!ret && (evt_ent =3D readdir(format_dir))) { char *name =3D evt_ent->d_name; int fd; + void *scanner; + FILE *file; =20 if (!strcmp(name, ".") || !strcmp(name, "..")) continue; @@ -91,9 +92,20 @@ int perf_pmu__format_parse(int dirfd, struct list_head *= head) if (fd < 0) break; =20 - perf_pmu_in =3D fdopen(fd, "r"); - ret =3D perf_pmu_parse(head, name); - fclose(perf_pmu_in); + file =3D fdopen(fd, "r"); + if (!file) + break; + + ret =3D perf_pmu_lex_init(&scanner); + if (ret) { + fclose(file); + break; + } + + perf_pmu_set_in(file, scanner); + ret =3D perf_pmu_parse(head, name, scanner); + perf_pmu_lex_destroy(scanner); + fclose(file); } =20 closedir(format_dir); diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 32c3a75bca0e..d53618c65c92 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -206,7 +206,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct = list_head *head_terms, struct perf_pmu_info *info); struct list_head *perf_pmu__alias(struct perf_pmu *pmu, struct list_head *head_terms); -void perf_pmu_error(struct list_head *list, char *name, char const *msg); +void perf_pmu_error(struct list_head *list, char *name, void *scanner, cha= r const *msg); =20 int perf_pmu__new_format(struct list_head *list, char *name, int config, unsigned long *bits); diff --git a/tools/perf/util/pmu.l b/tools/perf/util/pmu.l index 58b4926cfaca..67b247be693b 100644 --- a/tools/perf/util/pmu.l +++ b/tools/perf/util/pmu.l @@ -1,4 +1,6 @@ %option prefix=3D"perf_pmu_" +%option reentrant +%option bison-bridge =20 %{ #include @@ -6,16 +8,21 @@ #include "pmu.h" #include "pmu-bison.h" =20 -static int value(int base) +char *perf_pmu_get_text(yyscan_t yyscanner); +YYSTYPE *perf_pmu_get_lval(yyscan_t yyscanner); + +static int value(yyscan_t scanner, int base) { + YYSTYPE *yylval =3D perf_pmu_get_lval(scanner); + char *text =3D perf_pmu_get_text(scanner); long num; =20 errno =3D 0; - num =3D strtoul(perf_pmu_text, NULL, base); + num =3D strtoul(text, NULL, base); if (errno) return PP_ERROR; =20 - perf_pmu_lval.num =3D num; + yylval->num =3D num; return PP_VALUE; } =20 @@ -25,7 +32,7 @@ num_dec [0-9]+ =20 %% =20 -{num_dec} { return value(10); } +{num_dec} { return value(yyscanner, 10); } config { return PP_CONFIG; } - { return '-'; } : { return ':'; } @@ -35,7 +42,7 @@ config { return PP_CONFIG; } =20 %% =20 -int perf_pmu_wrap(void) +int perf_pmu_wrap(void *scanner __maybe_unused) { return 1; } diff --git a/tools/perf/util/pmu.y b/tools/perf/util/pmu.y index e675d79a0274..dff4e892ac4d 100644 --- a/tools/perf/util/pmu.y +++ b/tools/perf/util/pmu.y @@ -1,6 +1,8 @@ - +%define api.pure full %parse-param {struct list_head *format} %parse-param {char *name} +%parse-param {void *scanner} +%lex-param {void* scanner} =20 %{ =20 @@ -78,6 +80,7 @@ PP_VALUE =20 void perf_pmu_error(struct list_head *list __maybe_unused, char *name __maybe_unused, + void *scanner __maybe_unused, char const *msg __maybe_unused) { } --=20 2.40.0.348.gf938b09366-goog