Received: by 2002:a25:2c96:0:0:0:0:0 with SMTP id s144csp1639379ybs; Mon, 25 May 2020 23:13:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxT2PXmNE42gBkP+DyX/H73lmoVFTKRInTCRoaUDuXVICB6nqHFffyKhlSL4p85CWyMxzb2 X-Received: by 2002:a05:6402:17a3:: with SMTP id j3mr19046989edy.137.1590473622463; Mon, 25 May 2020 23:13:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590473622; cv=none; d=google.com; s=arc-20160816; b=XpSTQRauqp/QneXyXtc26rEeQkXsenBOJFXN0gpppfvpFAwsUgb5ZEgrvuNwERxGVW 6eFraWs2ZiTwBJGmH0IclEOxNAskn+hstUGFYuzuYnsyfb8YSBrp+kvEKgAIip4elTx/ YSAm+7ppDulYZLXaEWzjHY/by4pkqCH6kkUD2NdzvBY6wQrczxSom8ibQzxACzdGRnHF Kh92lU8JJMOmhvo2bwjshlqAcUsBmnawRF1MCsjlz3yljeZdx10Sjhi7UAuqGCOR3DYm NuBZLt85vu2tgVnfTVhi5MXlCXAWJ6fnq1ZZ1e3CCAynt79N6sMqSQ+DVavNa4bWZx6S WaJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:ironport-sdr:ironport-sdr; bh=D8oRkoXmmsM0jCc2pF+k5GBJCWJFVGPOMXOGJ2r2/7U=; b=g3GrPm/dHYD7gmQz/b8gx+SJ4Wk6rmuyj8bBp779sW5/f4Hi2vS5kEwpnm/jC+YOfv p4ZN4mm7UqyBb7e8TyvXGk7TaAgTOZCuZe3sfYwV2xBOAFxDp0mlO319BPEuC4xkR7eR ZxBstCLYAKBRo41AyF7iKod9KGZAterdfvejfzCg8Kld4iHbyaDyBjjcEPpvnCBuYaui Fnom4neOKPwfQfKkmZ3MoVPVFqV1QaGWD2nfekYRskDURPSjvq5Cup1tS8DrwSwtLqEb 6VMecj1/w0768/fTCBV+3LjfC4XRIX2lB7pNfBB154TWxlg+amp39quR1orkBYQDKLSv OEmg== 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o25si12467867edz.324.2020.05.25.23.13.20; Mon, 25 May 2020 23:13:42 -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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727930AbgEZGLe (ORCPT + 99 others); Tue, 26 May 2020 02:11:34 -0400 Received: from mga06.intel.com ([134.134.136.31]:16985 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726207AbgEZGLd (ORCPT ); Tue, 26 May 2020 02:11:33 -0400 IronPort-SDR: TNwp6ajPHhTpaYSMe0gLPQrqQ2M4bJ4ov8CRDIzcwuP7x/gMmZDMTKo61kU6BSuYhhtVVd+vKu p20DzdcYSS1A== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 May 2020 23:11:33 -0700 IronPort-SDR: 3XFxiPD/Dyg7BStCDWzlg3WK4DHEBBn4kHYURDJk64fh1bXkZYjktUJAT1Ik97uoJOfJP/PYpS GdEdn2GQvWFQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,436,1583222400"; d="scan'208";a="291068671" Received: from kbl-ppc.sh.intel.com ([10.239.159.118]) by fmsmga004.fm.intel.com with ESMTP; 25 May 2020 23:11:30 -0700 From: Jin Yao To: acme@kernel.org, jolsa@kernel.org, peterz@infradead.org, mingo@redhat.com, alexander.shishkin@linux.intel.com Cc: Linux-kernel@vger.kernel.org, ak@linux.intel.com, kan.liang@intel.com, yao.jin@intel.com, Jin Yao Subject: [PATCH v4 3/7] perf util: Compare two streams Date: Tue, 26 May 2020 14:09:16 +0800 Message-Id: <20200526060920.26490-4-yao.jin@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200526060920.26490-1-yao.jin@linux.intel.com> References: <20200526060920.26490-1-yao.jin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Stream is the branch history which is aggregated by the branch records from perf samples. Now we only support the callchain as stream. If the callchain entries of one stream are fully matched with the callchain entries of another stream, we think two streams are matched. For example, cycles: 1, hits: 26.80% cycles: 1, hits: 27.30% ----------------------- ----------------------- main div.c:39 main div.c:39 main div.c:44 main div.c:44 Above two streams are matched (we don't consider the case that source code is changed). The matching logic is, compare the chain string first. If it's not matched, fallback to dso address comparison. Signed-off-by: Jin Yao --- tools/perf/util/callchain.c | 54 +++++++++++++++++++++++++++++++++++++ tools/perf/util/callchain.h | 4 +++ 2 files changed, 58 insertions(+) diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 2775b752f2fa..d356e73c5622 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -1613,3 +1613,57 @@ void callchain_param_setup(u64 sample_type) callchain_param.record_mode = CALLCHAIN_FP; } } + +static bool chain_match(struct callchain_list *base_chain, + struct callchain_list *pair_chain) +{ + enum match_result match; + + match = match_chain_strings(base_chain->srcline, + pair_chain->srcline); + if (match != MATCH_ERROR) + return match == MATCH_EQ; + + match = match_chain_dso_addresses(base_chain->ms.map, + base_chain->ip, + pair_chain->ms.map, + pair_chain->ip); + + return match == MATCH_EQ; +} + +bool callchain_cnode_matched(struct callchain_node *base_cnode, + struct callchain_node *pair_cnode) +{ + struct callchain_list *base_chain, *pair_chain; + bool match = false; + + pair_chain = list_first_entry(&pair_cnode->val, + struct callchain_list, + list); + + list_for_each_entry(base_chain, &base_cnode->val, list) { + if (&pair_chain->list == &pair_cnode->val) + return false; + + if (!base_chain->srcline || !pair_chain->srcline) { + pair_chain = list_next_entry(pair_chain, list); + continue; + } + + match = chain_match(base_chain, pair_chain); + if (!match) + return false; + + pair_chain = list_next_entry(pair_chain, list); + } + + /* + * Say chain1 is ABC, chain2 is ABCD, we consider they are + * not fully matched. + */ + if (pair_chain && (&pair_chain->list != &pair_cnode->val)) + return false; + + return match; +} diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h index fe36a9e5ccd1..ad27fc8c7948 100644 --- a/tools/perf/util/callchain.h +++ b/tools/perf/util/callchain.h @@ -298,4 +298,8 @@ int callchain_branch_counts(struct callchain_root *root, u64 *abort_count, u64 *cycles_count); void callchain_param_setup(u64 sample_type); + +bool callchain_cnode_matched(struct callchain_node *base_cnode, + struct callchain_node *pair_cnode); + #endif /* __PERF_CALLCHAIN_H */ -- 2.17.1