Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp2021037pxu; Sun, 13 Dec 2020 10:49:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJx3fBA+0sOq954+PcCzKsEpOU5thqaFMmhpGwYed1wtSNB7cJwfa7FpIwQ2nRxWYof8HI69 X-Received: by 2002:a17:906:aac1:: with SMTP id kt1mr4678102ejb.329.1607885388313; Sun, 13 Dec 2020 10:49:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607885388; cv=none; d=google.com; s=arc-20160816; b=j1NOEhPo/luxOFxCQz4/9Q39CJ/FpTWyIONO0NJbXpFEaQSkeI8oLfbIrx3Oaf6E5X 8mBOQb4BwJnTs93gf1PaR1Zi1PWZ9S5RkJphElFKF3Tx8/3IBki7FPu2v5Ett8L0Ii1u Ndu1h3EzYMUalQNx4vVZs+l3O6paiVZBhGzOlgudEttFzyPE+6HAvIaM16XZ0Q4a23Ro +lZvmvO9ldit412tIsD9qi8OrNn/q5bvn9OKugEEIMy234ZeZajstr4Y6TCxjk/FsrRT W5skq8+02/96pLCAVDcpSITaKTzAUnYOk6B7M90qfZWXL5rUP0kVMAm1GESBcRLRu+iB o2VA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=ze/9Zkt8R24ns/8+wNJn9TWMC3k3FFhUo5aO++jYCAY=; b=JeU0VyzIcnmJR3vDCsOt0aT1T8mWgR/tpCbRJ97PSkwkHjcjp/TRudW6EGWpzOi6q9 pmcwqjUtKPFh0+d6ZaS7dkwoL2s4bvtzc2nJ/A3iDbJMl+C016mUfkW8XsQfTdTChAOI gAXL+A/AcvGpwPzu6aZgDwsrR4JuSPHT6NB1wSiE0+LJBT/DpG0ctxpiPAcg1gkK4TC9 p+LIsJZ3dcPt3MCFz3sYrqGR4E/agRZ5TSu/Q9nADJTGLBu/+pl5V41Nqc4NXxBRzFKH hyck1WFrMMYzVJCNsZLpTAsb5Kw07VhTqe3pRrZnZt9ca0qp+WYf2qiDPWVOLry0dwp4 p3zQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Mp/v1TY2"; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c24si8988355edj.459.2020.12.13.10.49.25; Sun, 13 Dec 2020 10:49:48 -0800 (PST) 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; dkim=pass header.i=@linaro.org header.s=google header.b="Mp/v1TY2"; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2406940AbgLMNk7 (ORCPT + 99 others); Sun, 13 Dec 2020 08:40:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2406886AbgLMNjt (ORCPT ); Sun, 13 Dec 2020 08:39:49 -0500 Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BD44EC0613D3 for ; Sun, 13 Dec 2020 05:39:02 -0800 (PST) Received: by mail-wm1-x343.google.com with SMTP id w206so7432308wma.0 for ; Sun, 13 Dec 2020 05:39:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ze/9Zkt8R24ns/8+wNJn9TWMC3k3FFhUo5aO++jYCAY=; b=Mp/v1TY2c4Di7zHhRHW/scVQLU5eBqmdCtkqeVrvYB+7H7iB3PYjKPnFYM9jVlD6t8 LxMgn5vSUFpqBNn1zAj/ij4q3rTaUTvBetn4WzMwtmLrxBjizo7DhoDqxrSjdBM3qjTK M5m6g7cg976ddMvEt0FVfjqLijGj7NRcU9edeLpALY2GozAEZ7vyQeuG60Mc5e2X99sw 7MkYfmi1RuAUhmiZFciSajRbB/LsqdlO+3H6e6O8RQiHKv8i4epwWR9HTHtnPskprGWZ NuKw62xgLEkGEebwlhk8pcMzENbCDW4nlDxtj+38Iop8NLbplyo5mUeDGA4UF63Agz2K kGMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ze/9Zkt8R24ns/8+wNJn9TWMC3k3FFhUo5aO++jYCAY=; b=ZDjY9GE170AJgtNkHtj2z3slRLiQ33r8Ky9EO97WyeFyfhtbBeaLH+0tjQaWxBPhB9 Zz/PubTsQjvwEAl3Quk7hPyHRsYiHJ1ov7J5Abxcx2tqIJOaywe0O/rRCGLoz4R2M1Yz zmXPix1+OY/CIbPi0T8PsQCm7AX1i0NQYmTzyrfKLn63MMd3vIs6b0LfinLvUqrG+RTM a51bdPGRYInoUmCjfPot5pz68XdoxyTBNGi5OUigUZHFSAlkzBWhJmnRtmaT8KQQu675 VAZ3IgP17edCA1U6+bFuSCkU9NUdbITiDkHjGQk0Wy5y+9ASdqVzyJhj8citPGKlaH++ oSRA== X-Gm-Message-State: AOAM530lmOdja/5PneXydlijVKwx2kdNM+cMl944mvChKjnBBSUnZgYQ yy/f9gTDtP8225m78f5C1fuN+Q== X-Received: by 2002:a7b:c4d5:: with SMTP id g21mr23162412wmk.92.1607866741471; Sun, 13 Dec 2020 05:39:01 -0800 (PST) Received: from hackbox2.linaro.org ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id l7sm25180387wme.4.2020.12.13.05.38.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Dec 2020 05:39:00 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Jiri Olsa , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Namhyung Kim , Andi Kleen , Ian Rogers , Kan Liang , Joe Mario , David Ahern , Don Zickus , Al Grant , James Clark , linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 01/11] perf c2c: Add dimensions for total load hit Date: Sun, 13 Dec 2020 13:38:40 +0000 Message-Id: <20201213133850.10070-2-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201213133850.10070-1-leo.yan@linaro.org> References: <20201213133850.10070-1-leo.yan@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Arm SPE trace data doesn't support HITM, but we still want to explore "perf c2c" tool to analyze cache false sharing. If without HITM tag, the tool cannot give out accurate result for cache false sharing, a candidate solution is to sort the total load operations and connect with the threads info, e.g. if multiple threads hit the same cache line for many times, this can give out the hint that it's likely to cause cache false sharing issue. Unlike having HITM tag, the proposed solution is not accurate and might introduce false positive reporting, but it's a pragmatic approach for detecting false sharing if memory event doesn't support HITM. To sort with the cache line hit, this patch adds dimensions for total load hit and the associated percentage calculation. Signed-off-by: Leo Yan --- tools/perf/builtin-c2c.c | 112 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index c5babeaa3b38..3d5a2dc8b4fd 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -615,6 +615,47 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused, return tot_hitm_left - tot_hitm_right; } +#define TOT_LD_HIT(stats) \ + ((stats)->ld_fbhit + \ + (stats)->ld_l1hit + \ + (stats)->ld_l2hit + \ + (stats)->ld_llchit + \ + (stats)->lcl_hitm + \ + (stats)->rmt_hitm + \ + (stats)->rmt_hit) + +static int tot_ld_hit_entry(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct c2c_hist_entry *c2c_he; + int width = c2c_width(fmt, hpp, he->hists); + unsigned int tot_hit; + + c2c_he = container_of(he, struct c2c_hist_entry, he); + tot_hit = TOT_LD_HIT(&c2c_he->stats); + + return scnprintf(hpp->buf, hpp->size, "%*u", width, tot_hit); +} + +static int64_t tot_ld_hit_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left, + struct hist_entry *right) +{ + struct c2c_hist_entry *c2c_left; + struct c2c_hist_entry *c2c_right; + uint64_t tot_hit_left; + uint64_t tot_hit_right; + + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); + + tot_hit_left = TOT_LD_HIT(&c2c_left->stats); + tot_hit_right = TOT_LD_HIT(&c2c_right->stats); + + return tot_hit_left - tot_hit_right; +} + #define STAT_FN_ENTRY(__f) \ static int \ __f ## _entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, \ @@ -860,6 +901,58 @@ percent_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused, return per_left - per_right; } +static double percent_tot_ld_hit(struct c2c_hist_entry *c2c_he) +{ + struct c2c_hists *hists; + int tot = 0, st = 0; + + hists = container_of(c2c_he->he.hists, struct c2c_hists, hists); + + st = TOT_LD_HIT(&c2c_he->stats); + tot = TOT_LD_HIT(&hists->stats); + + return tot ? (double) st * 100 / tot : 0; +} + +static int +percent_tot_ld_hit_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct c2c_hist_entry *c2c_he; + int width = c2c_width(fmt, hpp, he->hists); + char buf[10]; + double per; + + c2c_he = container_of(he, struct c2c_hist_entry, he); + per = percent_tot_ld_hit(c2c_he); + return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); +} + +static int +percent_tot_ld_hit_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + return percent_color(fmt, hpp, he, percent_tot_ld_hit); +} + +static int64_t +percent_tot_ld_hit_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left, struct hist_entry *right) +{ + struct c2c_hist_entry *c2c_left; + struct c2c_hist_entry *c2c_right; + double per_left; + double per_right; + + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); + + per_left = percent_tot_ld_hit(c2c_left); + per_right = percent_tot_ld_hit(c2c_right); + + return per_left - per_right; +} + static struct c2c_stats *he_stats(struct hist_entry *he) { struct c2c_hist_entry *c2c_he; @@ -1412,6 +1505,14 @@ static struct c2c_dimension dim_ld_rmthit = { .width = 8, }; +static struct c2c_dimension dim_tot_ld_hit = { + .header = HEADER_BOTH("Load Hit", "Total"), + .name = "tot_ld_hit", + .cmp = tot_ld_hit_cmp, + .entry = tot_ld_hit_entry, + .width = 8, +}; + static struct c2c_dimension dim_tot_recs = { .header = HEADER_BOTH("Total", "records"), .name = "tot_recs", @@ -1460,6 +1561,15 @@ static struct c2c_dimension dim_percent_lcl_hitm = { .width = 7, }; +static struct c2c_dimension dim_percent_tot_ld_hit = { + .header = HEADER_BOTH("Load Hit", "Pct"), + .name = "percent_tot_ld_hit", + .cmp = percent_tot_ld_hit_cmp, + .entry = percent_tot_ld_hit_entry, + .color = percent_tot_ld_hit_color, + .width = 8, +}; + static struct c2c_dimension dim_percent_stores_l1hit = { .header = HEADER_SPAN("-- Store Refs --", "L1 Hit", 1), .name = "percent_stores_l1hit", @@ -1615,11 +1725,13 @@ static struct c2c_dimension *dimensions[] = { &dim_ld_l2hit, &dim_ld_llchit, &dim_ld_rmthit, + &dim_tot_ld_hit, &dim_tot_recs, &dim_tot_loads, &dim_percent_hitm, &dim_percent_rmt_hitm, &dim_percent_lcl_hitm, + &dim_percent_tot_ld_hit, &dim_percent_stores_l1hit, &dim_percent_stores_l1miss, &dim_dram_lcl, -- 2.17.1