Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1189648ybh; Sun, 19 Jul 2020 11:15:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwqC1/WlyGnrWOYtUSB0kE4u+RpIQJHwS0SdKIzKGhNXF2XNp+6gqbyr9LEwQ902/Gr+voI X-Received: by 2002:a17:906:5e0b:: with SMTP id n11mr17941840eju.15.1595182530035; Sun, 19 Jul 2020 11:15:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595182530; cv=none; d=google.com; s=arc-20160816; b=FGNNVkYW5yvGwDKnGfuU5SW2sMRUEN0eP1IcZ3em/rRZjC/CTlGOPoBMXV+4EziQff Ha/gKlza8yOneQGVFPCW1sJVfE7Gdll1v3FEqYQ1gWUyyi1tBISRJMHgOMDrbx1+QUmV qXZRHqB0br1hDXwbqBQpNkTXH9mjXvraxTiCxaaDJjwqnJ+Q9rdE+ovbeKCS5Bkwsgwb Vh8rsBYipEilmsMODgh/B/KItYzj+v0lRaDlD99fVvW6TcuNjcq2Eby/ULVhjWcaq0Fv 9MQWeUc6QLkX9D10+YI117cGSRa5KCsPHMLJqwR3jFiS1bhZ85rH9UTI9xn1tp1FkB7h ncDw== 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=g3fz8d6BN849Xi7XvSiNZgp9IRBd+83BTecJRZQtGMg=; b=qk6ky7cEer4eDy2vrPq5QjO2xa8DjXVPhoQLFVeXZnolEN7i5Y5E93pYvfg+UbGL/E EpvBaJlpWT0XuP+hidXJIRZAj/ISAnXAR6ycLmKKliX8dZnQCVFSQl2+IjojLxZWQtAZ 6+oIha/CfClS1jZ/AsMdx701JbFzMXUR8X6MDj2h6ARJJCSyVRJIV0My7//ZrQYCblUy 1J1QjCmxgXoCI62lLpTFYR7Du2BG8EpTTKrFukjcd/5Puo72JoZhzq7f5ESUNRtaA3ek fWlOpjtyWke+cRAXgHkH+CC6nqdFjTCb0a9Hoesx8LA3vNodDV/6NE+rxwWndAFIobYp zEJA== 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 qp2si9684010ejb.598.2020.07.19.11.15.06; Sun, 19 Jul 2020 11:15:30 -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 S1726890AbgGSSOM convert rfc822-to-8bit (ORCPT + 99 others); Sun, 19 Jul 2020 14:14:12 -0400 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:49640 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726714AbgGSSOL (ORCPT ); Sun, 19 Jul 2020 14:14:11 -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-481-p9atM9NlOvGJkcfVR9Furw-1; Sun, 19 Jul 2020 14:14:04 -0400 X-MC-Unique: p9atM9NlOvGJkcfVR9Furw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 366C410059AA; Sun, 19 Jul 2020 18:14:02 +0000 (UTC) Received: from krava.redhat.com (unknown [10.40.192.53]) by smtp.corp.redhat.com (Postfix) with ESMTP id 57CF2872E1; Sun, 19 Jul 2020 18:13:59 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: Ian Rogers , lkml , Ingo Molnar , Namhyung Kim , Alexander Shishkin , Peter Zijlstra , Michael Petlan , Andi Kleen , Kajol Jain , John Garry , "Paul A. Clarke" , Stephane Eranian Subject: [PATCH 11/19] perf metric: Compute referenced metrics Date: Sun, 19 Jul 2020 20:13:12 +0200 Message-Id: <20200719181320.785305-12-jolsa@kernel.org> In-Reply-To: <20200719181320.785305-1-jolsa@kernel.org> References: <20200719181320.785305-1-jolsa@kernel.org> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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. Acked-by: Ian Rogers Signed-off-by: Jiri Olsa --- 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