Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp967992ybg; Wed, 29 Jul 2020 02:21:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxW/ALGocC5xFYC7knAVlO/FWtAMrlHxXFofuloBj9XM1cibk43OJzSsB3ZTtdFEmR0lYwA X-Received: by 2002:a17:906:95cb:: with SMTP id n11mr23283497ejy.506.1596014480788; Wed, 29 Jul 2020 02:21:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596014480; cv=none; d=google.com; s=arc-20160816; b=i6Sk8fna4nEXctkqcdAY8oMvdX4NneAjDv85zqQu5ATBsyg7qp4D11ppRRHviAo8OI whSh+yGSuARjw7WEakejVnFxwZpPASs9RNtb3cXPhqWWqBlhKfUblClIP12FtXW4uNyS W+SjJUhVzcOahZYEzhNygIt/hBpMNp4sGA0k3FLNgk23xa8ycQLXRTcR/6hxH43IdsXF srEo7UzhNSHYzJdNjNbV9P9Qz/+suR6eSGlbmq5SGE0kXFcakY263bCKJy6X+YyYRQXy cc5Jv88QaJ11yoewCfLNq/5hJ39AC7+1tGEvurppZhO2ESjJjq2t4tYLZl4bjVdd8OEf EJVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=R3IWhokpouSp+khArnWhA8/Jpg88GqrvNzWiVe/VOJk=; b=V3vcwNlvTJjlo6Ud47GtUNxsaeyEfnZ6QwRZQ7RBfd2L4OeUNg69nLVldabr82pyYD eMitc8JXOkEiS8yNqtLvQbEqhS6xhIedUEr5SpAgn5jJxQdtQSsJFCu/ECmRyqN7qm45 SBgHU8AluxJ6JQU5hvAhXbkP658+iPPq2fhGZDWLgqHE0oLrOts7EQLVF2K34Po9AmG5 9cXMoMA194SdE7wvMdDm/c2qU+Kt2Pt/TGurEQB7GCCjUvz3hTbVEP1cLwcI1vJg8Jyo T43GoiirGC/doTpqXWeLasPD1ytZnaO6GoL7foyWvD1Ytn702Vm47NniPBQ9Jdjc6KWl IsOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k2si920854edl.300.2020.07.29.02.20.58; Wed, 29 Jul 2020 02:21:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728281AbgG2JUH convert rfc822-to-8bit (ORCPT + 99 others); Wed, 29 Jul 2020 05:20:07 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:40726 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728195AbgG2JUG (ORCPT ); Wed, 29 Jul 2020 05:20:06 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-393-H4aIQLXRPBeTA11LrF0Y8Q-1; Wed, 29 Jul 2020 05:19:58 -0400 X-MC-Unique: H4aIQLXRPBeTA11LrF0Y8Q-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1D0751800D4A; Wed, 29 Jul 2020 09:19:56 +0000 (UTC) Received: from krava.redhat.com (unknown [10.40.193.247]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9A9116932D; Wed, 29 Jul 2020 09:19:52 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: Kajol Jain , Ian Rogers , Alexander Shishkin , Andi Kleen , John Garry , Michael Petlan , Namhyung Kim , Paul Clarke , Peter Zijlstra , Stephane Eranian , lkml , Ingo Molnar , Peter Zijlstra Subject: [PATCH 11/19] perf metric: Compute referenced metrics Date: Wed, 29 Jul 2020 11:19:00 +0200 Message-Id: <20200729091908.1378911-12-jolsa@kernel.org> In-Reply-To: <20200729091908.1378911-1-jolsa@kernel.org> References: <20200729091908.1378911-1-jolsa@kernel.org> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: kernel.org Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adding computation (expr__parse call) of referenced metric at the point when it needs to be resolved during the parent metric computation. Once the inner metric is computed, the result is stored and used if there's another usage of that metric. Signed-off-by: Jiri Olsa Reviewed-by: Kajol Jain Acked-by: Ian Rogers Cc: Alexander Shishkin Cc: Andi Kleen Cc: John Garry Cc: Michael Petlan Cc: Namhyung Kim Cc: Paul Clarke Cc: Peter Zijlstra Cc: Stephane Eranian Link: http://lore.kernel.org/lkml/20200719181320.785305-12-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/expr.c | 31 +++++++++++++++++++++++++++++++ tools/perf/util/expr.h | 3 +++ tools/perf/util/expr.y | 4 ++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c index d3997c2b4a90..a346ca590513 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -112,6 +112,7 @@ int expr__add_ref(struct expr_parse_ctx *ctx, struct metric_ref *ref) */ data_ptr->ref.metric_name = ref->metric_name; data_ptr->ref.metric_expr = ref->metric_expr; + data_ptr->ref.counted = false; data_ptr->is_ref = true; ret = hashmap__set(&ctx->ids, name, data_ptr, @@ -133,6 +134,34 @@ int expr__get_id(struct expr_parse_ctx *ctx, const char *id, return hashmap__find(&ctx->ids, id, (void **)data) ? 0 : -1; } +int expr__resolve_id(struct expr_parse_ctx *ctx, const char *id, + struct expr_id_data **datap) +{ + struct expr_id_data *data; + + if (expr__get_id(ctx, id, datap) || !*datap) { + pr_debug("%s not found\n", id); + return -1; + } + + data = *datap; + + pr_debug2("lookup: is_ref %d, counted %d, val %f: %s\n", + data->is_ref, data->ref.counted, data->val, id); + + if (data->is_ref && !data->ref.counted) { + data->ref.counted = true; + pr_debug("processing metric: %s ENTRY\n", id); + if (expr__parse(&data->val, ctx, data->ref.metric_expr, 1)) { + pr_debug("%s failed to count\n", id); + return -1; + } + pr_debug("processing metric: %s EXIT: %f\n", id, data->val); + } + + return 0; +} + void expr__del_id(struct expr_parse_ctx *ctx, const char *id) { struct expr_id_data *old_val = NULL; @@ -173,6 +202,8 @@ __expr__parse(double *val, struct expr_parse_ctx *ctx, const char *expr, void *scanner; int ret; + pr_debug2("parsing metric: %s\n", expr); + ret = expr_lex_init_extra(&scanner_ctx, &scanner); if (ret) return ret; diff --git a/tools/perf/util/expr.h b/tools/perf/util/expr.h index 81d04ff7f857..9ed208d93418 100644 --- a/tools/perf/util/expr.h +++ b/tools/perf/util/expr.h @@ -23,6 +23,7 @@ struct expr_id_data { struct { const char *metric_name; const char *metric_expr; + bool counted; } ref; }; @@ -42,6 +43,8 @@ int expr__add_id_val(struct expr_parse_ctx *ctx, const char *id, double val); int expr__add_ref(struct expr_parse_ctx *ctx, struct metric_ref *ref); int expr__get_id(struct expr_parse_ctx *ctx, const char *id, struct expr_id_data **data); +int expr__resolve_id(struct expr_parse_ctx *ctx, const char *id, + struct expr_id_data **datap); int expr__parse(double *final_val, struct expr_parse_ctx *ctx, const char *expr, int runtime); int expr__find_other(const char *expr, const char *one, diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y index 0d4f5d324be7..d34b370391c6 100644 --- a/tools/perf/util/expr.y +++ b/tools/perf/util/expr.y @@ -88,11 +88,11 @@ expr: NUMBER | ID { struct expr_id_data *data; - if (expr__get_id(ctx, $1, &data) || !data) { - pr_debug("%s not found\n", $1); + if (expr__resolve_id(ctx, $1, &data)) { free($1); YYABORT; } + $$ = data->val; free($1); } -- 2.25.4