Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp289288ybh; Sun, 12 Jul 2020 06:31:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwMeK2jmqmvxCkF9KlwSyGvjKVIHk0tg1kzpEfHSl0/gTILKL8kM2LJmd1LYwDCJbn8mtzU X-Received: by 2002:aa7:db06:: with SMTP id t6mr82649197eds.369.1594560670974; Sun, 12 Jul 2020 06:31:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594560670; cv=none; d=google.com; s=arc-20160816; b=OHknevVzbk6gHApaO4WI+bWcsh2X3fxvyApfdCi2wbXIlRXbCIsMjm+R/myezk4lEX ZFGWfzl6nBMR7Ydg3Sq46qvpt4eCFtC1a1+SBV/P4horeykABuwu7PAvYqFRDuL8OX23 qZYPVAxR8BTI+zTPxILS0tcT2ld+qDwdcLM098/PxRI3C+cXCfHy8H6+WNg0kwaYzsJg 9ph6yEYLbPhYY7B8BOFi2wrdRY+kkcf8tGQqg5QjRt7fUH6F31jGWe5WSW+iPOdbsMFF ntJuiNijZPr9EfdSlYUsePJ1jJpQIELFVXfURsdX58+SihQy0d6UpQ9IpJPXCb2LHN+g LYkw== 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=hnIXe++uDq08ouqtUiWsv0kyNU/WuiN16EhTy03Q40I=; b=P7wJOMPFKNsPLVtLGwI3/kin4KgC504uJ8JwExQji49aVs+ALDkTQnq2YBezFABNlh 43ICMuEQAEpsfJGd9PB6u3yBwfjr77nGVIkl8hKIQxjVDoFSL5Hay3bYWy+N/vRZ7oks UZapbl8+5LtrBzqkRwI9pFOb6U6VpxaXuiOixeSM2e8Gy0h9Xd3/zsn1DWrjcIKoqTQE wceZ6j+chb3hOtWg34pUEbdBo0cXK5kRpiiXsZr5zYphkNNQo5FdcyJXzuBfGfjhirXe SlUOYKA3LOgRQhTq0E7e4rnlZSnCY7z1J9Is/luhAXc40ux5GSXv/Zut0s2y5R/OrnxI 5gYQ== 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 d4si8002035edv.535.2020.07.12.06.30.48; Sun, 12 Jul 2020 06:31:10 -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 S1729050AbgGLN1h convert rfc822-to-8bit (ORCPT + 99 others); Sun, 12 Jul 2020 09:27:37 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:49370 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729009AbgGLN1Z (ORCPT ); Sun, 12 Jul 2020 09:27:25 -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-363-P2ZGzDMpNgqqGRBC6hUiDA-1; Sun, 12 Jul 2020 09:27:20 -0400 X-MC-Unique: P2ZGzDMpNgqqGRBC6hUiDA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 941B31800D42; Sun, 12 Jul 2020 13:27:18 +0000 (UTC) Received: from krava.redhat.com (unknown [10.40.192.78]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7610C7EFB6; Sun, 12 Jul 2020 13:27:15 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: lkml , Ingo Molnar , Namhyung Kim , Alexander Shishkin , Peter Zijlstra , Michael Petlan , Andi Kleen , Kajol Jain , John Garry , "Paul A. Clarke" , Stephane Eranian , Ian Rogers Subject: [PATCH 12/18] perf metric: Compute referenced metrics Date: Sun, 12 Jul 2020 15:26:28 +0200 Message-Id: <20200712132634.138901-13-jolsa@kernel.org> In-Reply-To: <20200712132634.138901-1-jolsa@kernel.org> References: <20200712132634.138901-1-jolsa@kernel.org> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 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 'master' 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 --- 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 6bf8a21f5c53..2784df38f8c2 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -91,6 +91,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, @@ -110,6 +111,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; @@ -150,6 +179,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 d19e66915228..b6d1fba64eaa 100644 --- a/tools/perf/util/expr.h +++ b/tools/perf/util/expr.h @@ -25,6 +25,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