Message ID | 20240229001806.4158429-5-irogers@google.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-85896-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2097:b0:108:e6aa:91d0 with SMTP id gs23csp89521dyb; Wed, 28 Feb 2024 16:20:30 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCWrgdIzelWDc3TS01UXmacRaOY08+JCzBPuBtJc8XcsPDz0ezBJS3Lc0xpmi7tmDJrB8uYnjJUnK7mxr75djtN5vf9MCw== X-Google-Smtp-Source: AGHT+IGRDS14/VIslFZnk3Q7MbbRn9AvUh5Ct+eQj0BmjsC179RtqYxVKlai5uM4SLP/Z8gwPiuX X-Received: by 2002:a05:6870:c38e:b0:21e:b695:dff5 with SMTP id g14-20020a056870c38e00b0021eb695dff5mr496774oao.20.1709166029897; Wed, 28 Feb 2024 16:20:29 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709166029; cv=pass; d=google.com; s=arc-20160816; b=b6+gGsyBgjopKZRBUc+OcjRLfDcGlgqWR8V/mM7dC1ddXijRjDSgYvPQBUTrHpPcvu s1AckBlFj+Vg5KHEL7K7Re2SozYKE4lFuztfaOTT+/vCmiZW3qQa+mKFSqTiPR/4xzX7 YYdPol8FwqOVRjetK+jTjd7cV3gCXovZ1DWz6pgPbpzQJTsEa73GSKj/VZ+VlfeGQXlB hU/HA8EaxmVk0pomADUZaUBT/OYEuBPR1A00/1LExiIqis6NIH5sBbtJJZNJDxpfDdod ldob02PBxcAgpHdDM31HxM1VtZjhbOfVNLa+jqMUzsxViUTsFUgIhK9ph9w5r9nYVxnP WXMw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=to:from:subject:references:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:in-reply-to:date :dkim-signature; bh=c0JvchFYB4X0MvBleracqYs3OMeU4l9tJWCec7y6q3w=; fh=5AZBbrzX2ukluy/8lTHjwMkDFHuf1eFJY7O5Gwgz8qo=; b=qawWUqk3UvPaOtrqn35dgE0VN7PKDDX3TrB86nTV9Hvky21cIMbl/Ml6iLoQNPxnm+ GSCV6GhQoDRa8ytFQs1rst+z6dCAm9rRi3Q0qDRwA/Orur5dT960zta+G4riKmX0ZxW6 Kd4TQXyAkJDUINuPjecFyxgG+NQQWPONEFFIb4vrRqRmAQPMi6sWOkw/UGk9clnoTjIn ihFD6Df4jUBsnBkw9+nOJKwiUuLbCsR/aVbgrkZtYiyjWILdG9DWPf2RmfLwhEZYF0Hm ei+kj8zrVmxxfV/OcAjj0HpCh0td/SoP5G6xQvhZkTbA003FpyS4yy9vOXqCs+LJq07m zDkA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=kU4+lA1v; arc=pass (i=1 spf=pass spfdomain=flex--irogers.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-85896-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-85896-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id n27-20020aa7985b000000b006e4e40f5e2dsi98515pfq.242.2024.02.28.16.20.29 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 16:20:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-85896-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=kU4+lA1v; arc=pass (i=1 spf=pass spfdomain=flex--irogers.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-85896-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-85896-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 177AC28457F for <ouuuleilei@gmail.com>; Thu, 29 Feb 2024 00:20:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E523445959; Thu, 29 Feb 2024 00:18:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kU4+lA1v" Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4323E3E47F for <linux-kernel@vger.kernel.org>; Thu, 29 Feb 2024 00:18:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709165915; cv=none; b=da/YsWPvyzlm0rvQ+C8YacVNfwQDsnkZgswM1skVaADXpjfGqaQALfYjY6ytwen/tcizFXYoLjfuiRc6HICZ+M0PCpsv2dnGPTHrTkq7JOW5JL4CN143Zhuq7dnb2QJhK04GJXlPLhD7ewji760J+XfxqZVo7gX+8fw2L5a2rwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709165915; c=relaxed/simple; bh=OmwxBjnIGvz+HpCZV0zi77V/88wRlOeFcpNY7K4ifsw=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=tp5WdOTgo80WuINC2zFWM2G0R71jzi21azvGFIZWb5y9HNuDj3JydjTgN454VsBjL5+OXoU0Zsd2+ViCW0aehCXBezW6XLz5thzdKjss3nqIPymCbh7jFl0mtAR9Y+C9oApJ8vyQoU8L5J/djh8gP5B5U6N9hQh4nv4w0sTfYJQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kU4+lA1v; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dcbee93a3e1so605319276.3 for <linux-kernel@vger.kernel.org>; Wed, 28 Feb 2024 16:18:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1709165913; x=1709770713; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=c0JvchFYB4X0MvBleracqYs3OMeU4l9tJWCec7y6q3w=; b=kU4+lA1vHpZlDtSYyQVmEqdMYtzbTNAl9JAhc+YlQASrTBVwKHTrDpbRrDRvzkd1wa 5m15EGPbVBtoxxaQolL5ls7vXYVOt5lyf7taw91lUTMd7bRN9/PjhnKC6sYb9SfOR7TS UpPOYIwwGN7+KlWO0liZAJyZ+Coxt64rYyNxFUYDQI78mcsmQS25tOrECNYq0Rc5u+/t R3LwjWQgVX5QajjMz1jS07+mbgVTi0cfLBz8Xx2P5pHO3QMeBccy0emf+Q/bpufeoMbW 4KdsmNplZXb3Ec/vJEhmhQ0ajrMnf3axysXmdEebjbFGBtKRLDgB+vnH/LwHekB1kO2R es7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709165913; x=1709770713; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=c0JvchFYB4X0MvBleracqYs3OMeU4l9tJWCec7y6q3w=; b=BzlrI/RxzYmPQMXcFhRIUUsYeRfgrVOlFhvUFZ7FLTiEV7hLFvIv50p+nCex8SAWOu zyj5ia/gCabcT/heaxj8Ce9bD5OSEJ6jjePzmauFl3ZtsrypXm7fKAYvq6lAaRBbLQNb tiHIPuobn9p6CJIdWNWCYKwn8WPIV7CM6WeOGrc5aaXNsZGfVxA0lZNDdpncla7FyGiL ytA2zlO9h6T/MZ0f/9HNC+LS+Ys9AUZfFd0biqr9BrBZDMbbEqpbU6ko+1/vadaHqxlc B6KoeiIoJe0b3R7TsuVIHJ8a8sBpLiIDZLvy0LdXL97+6yGCCJuuLz7bNJuKedRP1bJ9 VBpA== X-Forwarded-Encrypted: i=1; AJvYcCX3FF8++yJWmH3oO5z407akRWZwyDy6iSCVzLsNW18U7xZGBPGQjv7Az8qohcsPlALuSinceIQpaOrq6qUramid7SU1ztM31iVdaBLN X-Gm-Message-State: AOJu0YyG3p4AGo8wqwrqPyBgEcEZHiKXYi8uONWpsWZmZ+yagmSda33k r7KIJfh7G6iIN3ptuaK9oicxT8hGFAtKMceSndSvPBPh+EdYfKHbI1sv17GQdhAQBEH6agetxm6 5dkdo+g== X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:77dc:144c:334e:e2dd]) (user=irogers job=sendgmr) by 2002:a05:6902:1244:b0:dc6:e20f:80cb with SMTP id t4-20020a056902124400b00dc6e20f80cbmr44028ybu.3.1709165913274; Wed, 28 Feb 2024 16:18:33 -0800 (PST) Date: Wed, 28 Feb 2024 16:17:49 -0800 In-Reply-To: <20240229001806.4158429-1-irogers@google.com> Message-Id: <20240229001806.4158429-5-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> Mime-Version: 1.0 References: <20240229001806.4158429-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.278.ge034bb2e1d-goog Subject: [PATCH v1 04/20] perf jevents: Add tsx metric group for Intel models From: Ian Rogers <irogers@google.com> To: Perry Taylor <perry.taylor@intel.com>, Samantha Alt <samantha.alt@intel.com>, Caleb Biggers <caleb.biggers@intel.com>, Weilin Wang <weilin.wang@intel.com>, Edward Baker <edward.baker@intel.com>, Andi Kleen <ak@linux.intel.com>, Peter Zijlstra <peterz@infradead.org>, Ingo Molnar <mingo@redhat.com>, Arnaldo Carvalho de Melo <acme@kernel.org>, Namhyung Kim <namhyung@kernel.org>, Mark Rutland <mark.rutland@arm.com>, Alexander Shishkin <alexander.shishkin@linux.intel.com>, Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>, Adrian Hunter <adrian.hunter@intel.com>, John Garry <john.g.garry@oracle.com>, Kan Liang <kan.liang@linux.intel.com>, Jing Zhang <renyu.zj@linux.alibaba.com>, Thomas Richter <tmricht@linux.ibm.com>, James Clark <james.clark@arm.com>, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Stephane Eranian <eranian@google.com> Content-Type: text/plain; charset="UTF-8" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1792190478951509028 X-GMAIL-MSGID: 1792190478951509028 |
Series |
Python generated Intel metrics
|
|
Commit Message
Ian Rogers
Feb. 29, 2024, 12:17 a.m. UTC
Allow duplicated metric to be dropped from json files.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/pmu-events/intel_metrics.py | 51 ++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
Comments
On 2024-02-28 7:17 p.m., Ian Rogers wrote: > Allow duplicated metric to be dropped from json files. > > Signed-off-by: Ian Rogers <irogers@google.com> > --- > tools/perf/pmu-events/intel_metrics.py | 51 ++++++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py > index 20c25d142f24..1096accea2aa 100755 > --- a/tools/perf/pmu-events/intel_metrics.py > +++ b/tools/perf/pmu-events/intel_metrics.py > @@ -7,6 +7,7 @@ import argparse > import json > import math > import os > +from typing import Optional > > parser = argparse.ArgumentParser(description="Intel perf json generator") > parser.add_argument("-metricgroups", help="Generate metricgroups data", action='store_true') > @@ -77,10 +78,60 @@ def Smi() -> MetricGroup: > ]) > > > +def Tsx() -> Optional[MetricGroup]: > + if args.model not in [ > + 'alderlake', > + 'cascadelakex', > + 'icelake', > + 'icelakex', > + 'rocketlake', > + 'sapphirerapids', > + 'skylake', > + 'skylakex', > + 'tigerlake',> + ]: Can we get ride of the model list? Otherwise, we have to keep updating the list. > + return None > +> + pmu = "cpu_core" if args.model == "alderlake" else "cpu" Is it possible to change the check to the existence of the "cpu" PMU here? has_pmu("cpu") ? "cpu" : "cpu_core" > + cycles = Event('cycles') > + cycles_in_tx = Event(f'{pmu}/cycles\-t/') > + transaction_start = Event(f'{pmu}/tx\-start/') > + cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') > + metrics = [ > + Metric('tsx_transactional_cycles', > + 'Percentage of cycles within a transaction region.', > + Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), > + '100%'), > + Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', > + Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, > + has_event(cycles_in_tx), > + 0), > + '100%'), > + Metric('tsx_cycles_per_transaction', > + 'Number of cycles within a transaction divided by the number of transactions.', > + Select(cycles_in_tx / transaction_start, > + has_event(cycles_in_tx), > + 0), > + "cycles / transaction"), > + ] > + if args.model != 'sapphirerapids': Add the "tsx_cycles_per_elision" metric only if has_event(f'{pmu}/el\-start/')? Thanks, Kan > + elision_start = Event(f'{pmu}/el\-start/') > + metrics += [ > + Metric('tsx_cycles_per_elision', > + 'Number of cycles within a transaction divided by the number of elisions.', > + Select(cycles_in_tx / elision_start, > + has_event(elision_start), > + 0), > + "cycles / elision"), > + ] > + return MetricGroup('transaction', metrics) > + > + > all_metrics = MetricGroup("", [ > Idle(), > Rapl(), > Smi(), > + Tsx(), > ]) > > if args.metricgroups:
On Thu, Feb 29, 2024 at 1:15 PM Liang, Kan <kan.liang@linux.intel.com> wrote: > > > > On 2024-02-28 7:17 p.m., Ian Rogers wrote: > > Allow duplicated metric to be dropped from json files. > > > > Signed-off-by: Ian Rogers <irogers@google.com> > > --- > > tools/perf/pmu-events/intel_metrics.py | 51 ++++++++++++++++++++++++++ > > 1 file changed, 51 insertions(+) > > > > diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py > > index 20c25d142f24..1096accea2aa 100755 > > --- a/tools/perf/pmu-events/intel_metrics.py > > +++ b/tools/perf/pmu-events/intel_metrics.py > > @@ -7,6 +7,7 @@ import argparse > > import json > > import math > > import os > > +from typing import Optional > > > > parser = argparse.ArgumentParser(description="Intel perf json generator") > > parser.add_argument("-metricgroups", help="Generate metricgroups data", action='store_true') > > @@ -77,10 +78,60 @@ def Smi() -> MetricGroup: > > ]) > > > > > > +def Tsx() -> Optional[MetricGroup]: > > + if args.model not in [ > > + 'alderlake', > > + 'cascadelakex', > > + 'icelake', > > + 'icelakex', > > + 'rocketlake', > > + 'sapphirerapids', > > + 'skylake', > > + 'skylakex', > > + 'tigerlake',> + ]: > > Can we get ride of the model list? Otherwise, we have to keep updating > the list. Do we expect the list to update? :-) The issue is the events are in sysfs and not the json. If we added the tsx events to json then this list wouldn't be necessary, but it also would mean the events would be present in "perf list" even when TSX is disabled. > > + return None > > +> + pmu = "cpu_core" if args.model == "alderlake" else "cpu" > > Is it possible to change the check to the existence of the "cpu" PMU > here? has_pmu("cpu") ? "cpu" : "cpu_core" The "Unit" on "cpu" events in json always just blank. On hybrid it is either "cpu_core" or "cpu_atom", so I can make this something like: pmu = "cpu_core" if metrics.HasPmu("cpu_core") else "cpu" which would be a build time test. > > + cycles = Event('cycles') > > + cycles_in_tx = Event(f'{pmu}/cycles\-t/') > > + transaction_start = Event(f'{pmu}/tx\-start/') > > + cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') > > + metrics = [ > > + Metric('tsx_transactional_cycles', > > + 'Percentage of cycles within a transaction region.', > > + Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), > > + '100%'), > > + Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', > > + Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, > > + has_event(cycles_in_tx), > > + 0), > > + '100%'), > > + Metric('tsx_cycles_per_transaction', > > + 'Number of cycles within a transaction divided by the number of transactions.', > > + Select(cycles_in_tx / transaction_start, > > + has_event(cycles_in_tx), > > + 0), > > + "cycles / transaction"), > > + ] > > + if args.model != 'sapphirerapids': > > Add the "tsx_cycles_per_elision" metric only if > has_event(f'{pmu}/el\-start/')? It's a sysfs event, so this wouldn't work :-( Thanks, Ian > Thanks, > Kan > > > + elision_start = Event(f'{pmu}/el\-start/') > > + metrics += [ > > + Metric('tsx_cycles_per_elision', > > + 'Number of cycles within a transaction divided by the number of elisions.', > > + Select(cycles_in_tx / elision_start, > > + has_event(elision_start), > > + 0), > > + "cycles / elision"), > > + ] > > + return MetricGroup('transaction', metrics) > > + > > + > > all_metrics = MetricGroup("", [ > > Idle(), > > Rapl(), > > Smi(), > > + Tsx(), > > ]) > > > > if args.metricgroups:
On 2024-02-29 8:01 p.m., Ian Rogers wrote: > On Thu, Feb 29, 2024 at 1:15 PM Liang, Kan <kan.liang@linux.intel.com> wrote: >> >> >> >> On 2024-02-28 7:17 p.m., Ian Rogers wrote: >>> Allow duplicated metric to be dropped from json files. >>> >>> Signed-off-by: Ian Rogers <irogers@google.com> >>> --- >>> tools/perf/pmu-events/intel_metrics.py | 51 ++++++++++++++++++++++++++ >>> 1 file changed, 51 insertions(+) >>> >>> diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py >>> index 20c25d142f24..1096accea2aa 100755 >>> --- a/tools/perf/pmu-events/intel_metrics.py >>> +++ b/tools/perf/pmu-events/intel_metrics.py >>> @@ -7,6 +7,7 @@ import argparse >>> import json >>> import math >>> import os >>> +from typing import Optional >>> >>> parser = argparse.ArgumentParser(description="Intel perf json generator") >>> parser.add_argument("-metricgroups", help="Generate metricgroups data", action='store_true') >>> @@ -77,10 +78,60 @@ def Smi() -> MetricGroup: >>> ]) >>> >>> >>> +def Tsx() -> Optional[MetricGroup]: >>> + if args.model not in [ >>> + 'alderlake', >>> + 'cascadelakex', >>> + 'icelake', >>> + 'icelakex', >>> + 'rocketlake', >>> + 'sapphirerapids', >>> + 'skylake', >>> + 'skylakex', >>> + 'tigerlake',> + ]: >> >> Can we get ride of the model list? Otherwise, we have to keep updating >> the list. > > Do we expect the list to update? :-) Yes, at least for the meteorlake and graniterapids. They should be the same as alderlake and sapphirerapids. I'm not sure about the future platforms. Maybe we can have a if args.model in list here to include all the non-hybrid models which doesn't support TSX. I think the list should not be changed shortly. > The issue is the events are in > sysfs and not the json. If we added the tsx events to json then this > list wouldn't be necessary, but it also would mean the events would be > present in "perf list" even when TSX is disabled. I think there may an alternative way, to check the RTM events, e.g., RTM_RETIRED.START event. We only need to generate the metrics for the platform which supports the RTM_RETIRED.START event. > >>> + return None >>> +> + pmu = "cpu_core" if args.model == "alderlake" else "cpu" >> >> Is it possible to change the check to the existence of the "cpu" PMU >> here? has_pmu("cpu") ? "cpu" : "cpu_core" > > The "Unit" on "cpu" events in json always just blank. On hybrid it is > either "cpu_core" or "cpu_atom", so I can make this something like: > > pmu = "cpu_core" if metrics.HasPmu("cpu_core") else "cpu" > > which would be a build time test. Yes, I think using the "Unit" is good enough. > > >>> + cycles = Event('cycles') >>> + cycles_in_tx = Event(f'{pmu}/cycles\-t/') >>> + transaction_start = Event(f'{pmu}/tx\-start/') >>> + cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') >>> + metrics = [ >>> + Metric('tsx_transactional_cycles', >>> + 'Percentage of cycles within a transaction region.', >>> + Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), >>> + '100%'), >>> + Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', >>> + Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, >>> + has_event(cycles_in_tx), >>> + 0), >>> + '100%'), >>> + Metric('tsx_cycles_per_transaction', >>> + 'Number of cycles within a transaction divided by the number of transactions.', >>> + Select(cycles_in_tx / transaction_start, >>> + has_event(cycles_in_tx), >>> + 0), >>> + "cycles / transaction"), >>> + ] >>> + if args.model != 'sapphirerapids': >> >> Add the "tsx_cycles_per_elision" metric only if >> has_event(f'{pmu}/el\-start/')? > > It's a sysfs event, so this wouldn't work :-( The below is the definition of el-start in the kernel. EVENT_ATTR_STR(el-start, el_start, "event=0xc8,umask=0x1"); The corresponding event in the event list should be HLE_RETIRED.START "EventCode": "0xC8", "UMask": "0x01", "EventName": "HLE_RETIRED.START", I think we may check the HLE_RETIRED.START instead. If the HLE_RETIRED.START doesn't exist, I don't see a reason why the tsx_cycles_per_elision should be supported. Again, in the virtualization world, it's possible that the HLE_RETIRED.START exists in the event list but el_start isn't available in the sysfs. I think it has to be specially handle in the test as well. Thanks, Kan > > Thanks, > Ian > >> Thanks, >> Kan >> >>> + elision_start = Event(f'{pmu}/el\-start/') >>> + metrics += [ >>> + Metric('tsx_cycles_per_elision', >>> + 'Number of cycles within a transaction divided by the number of elisions.', >>> + Select(cycles_in_tx / elision_start, >>> + has_event(elision_start), >>> + 0), >>> + "cycles / elision"), >>> + ] >>> + return MetricGroup('transaction', metrics) >>> + >>> + >>> all_metrics = MetricGroup("", [ >>> Idle(), >>> Rapl(), >>> Smi(), >>> + Tsx(), >>> ]) >>> >>> if args.metricgroups: >
On Fri, Mar 1, 2024 at 6:52 AM Liang, Kan <kan.liang@linux.intel.com> wrote: > > > > On 2024-02-29 8:01 p.m., Ian Rogers wrote: > > On Thu, Feb 29, 2024 at 1:15 PM Liang, Kan <kan.liang@linux.intel.com> wrote: > >> > >> > >> > >> On 2024-02-28 7:17 p.m., Ian Rogers wrote: > >>> Allow duplicated metric to be dropped from json files. > >>> > >>> Signed-off-by: Ian Rogers <irogers@google.com> > >>> --- > >>> tools/perf/pmu-events/intel_metrics.py | 51 ++++++++++++++++++++++++++ > >>> 1 file changed, 51 insertions(+) > >>> > >>> diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py > >>> index 20c25d142f24..1096accea2aa 100755 > >>> --- a/tools/perf/pmu-events/intel_metrics.py > >>> +++ b/tools/perf/pmu-events/intel_metrics.py > >>> @@ -7,6 +7,7 @@ import argparse > >>> import json > >>> import math > >>> import os > >>> +from typing import Optional > >>> > >>> parser = argparse.ArgumentParser(description="Intel perf json generator") > >>> parser.add_argument("-metricgroups", help="Generate metricgroups data", action='store_true') > >>> @@ -77,10 +78,60 @@ def Smi() -> MetricGroup: > >>> ]) > >>> > >>> > >>> +def Tsx() -> Optional[MetricGroup]: > >>> + if args.model not in [ > >>> + 'alderlake', > >>> + 'cascadelakex', > >>> + 'icelake', > >>> + 'icelakex', > >>> + 'rocketlake', > >>> + 'sapphirerapids', > >>> + 'skylake', > >>> + 'skylakex', > >>> + 'tigerlake',> + ]: > >> > >> Can we get ride of the model list? Otherwise, we have to keep updating > >> the list. > > > > Do we expect the list to update? :-) > > Yes, at least for the meteorlake and graniterapids. They should be the > same as alderlake and sapphirerapids. I'm not sure about the future > platforms. > > Maybe we can have a if args.model in list here to include all the > non-hybrid models which doesn't support TSX. I think the list should not > be changed shortly. > > > The issue is the events are in > > sysfs and not the json. If we added the tsx events to json then this > > list wouldn't be necessary, but it also would mean the events would be > > present in "perf list" even when TSX is disabled. > > I think there may an alternative way, to check the RTM events, e.g., > RTM_RETIRED.START event. We only need to generate the metrics for the > platform which supports the RTM_RETIRED.START event. > > > > > >>> + return None > >>> +> + pmu = "cpu_core" if args.model == "alderlake" else "cpu" > >> > >> Is it possible to change the check to the existence of the "cpu" PMU > >> here? has_pmu("cpu") ? "cpu" : "cpu_core" > > > > The "Unit" on "cpu" events in json always just blank. On hybrid it is > > either "cpu_core" or "cpu_atom", so I can make this something like: > > > > pmu = "cpu_core" if metrics.HasPmu("cpu_core") else "cpu" > > > > which would be a build time test. > > Yes, I think using the "Unit" is good enough. > > > > > > >>> + cycles = Event('cycles') > >>> + cycles_in_tx = Event(f'{pmu}/cycles\-t/') > >>> + transaction_start = Event(f'{pmu}/tx\-start/') > >>> + cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') > >>> + metrics = [ > >>> + Metric('tsx_transactional_cycles', > >>> + 'Percentage of cycles within a transaction region.', > >>> + Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), > >>> + '100%'), > >>> + Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', > >>> + Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, > >>> + has_event(cycles_in_tx), > >>> + 0), > >>> + '100%'), > >>> + Metric('tsx_cycles_per_transaction', > >>> + 'Number of cycles within a transaction divided by the number of transactions.', > >>> + Select(cycles_in_tx / transaction_start, > >>> + has_event(cycles_in_tx), > >>> + 0), > >>> + "cycles / transaction"), > >>> + ] > >>> + if args.model != 'sapphirerapids': > >> > >> Add the "tsx_cycles_per_elision" metric only if > >> has_event(f'{pmu}/el\-start/')? > > > > It's a sysfs event, so this wouldn't work :-( > > The below is the definition of el-start in the kernel. > EVENT_ATTR_STR(el-start, el_start, "event=0xc8,umask=0x1"); > > The corresponding event in the event list should be HLE_RETIRED.START > "EventCode": "0xC8", > "UMask": "0x01", > "EventName": "HLE_RETIRED.START", > > I think we may check the HLE_RETIRED.START instead. If the > HLE_RETIRED.START doesn't exist, I don't see a reason why the > tsx_cycles_per_elision should be supported. > > Again, in the virtualization world, it's possible that the > HLE_RETIRED.START exists in the event list but el_start isn't available > in the sysfs. I think it has to be specially handle in the test as well. So we keep the has_event test on the sysfs event to handle the virtualization and disabled case. We use HLE_RETIRED.START to detect whether the model supports TSX. Should the event be the sysfs or json version? i.e. "MetricExpr": "(cycles\\-t / el\\-start if has_event(el\\-start) else 0)", or "MetricExpr": "(cycles\\-t / HLE_RETIRED.START if has_event(el\\-start) else 0)", I think I favor the former for some consistency with the has_event. Using HLE_RETIRED.START means the set of TSX models goes from: 'alderlake', 'cascadelakex', 'icelake', 'icelakex', 'rocketlake', 'sapphirerapids', 'skylake', 'skylakex', 'tigerlake', To: broadwell broadwellde broadwellx cascadelakex haswell haswellx icelake rocketlake skylake skylakex Using RTM_RETIRED.START it goes to: broadwell broadwellde broadwellx cascadelakex emeraldrapids graniterapids haswell haswellx icelake icelakex rocketlake sapphirerapids skylake skylakex tigerlake So I'm not sure it is working equivalently to what we have today, which may be good or bad. Here is what I think the code should look like: def Tsx() -> Optional[MetricGroup]: pmu = "cpu_core" if CheckPmu("cpu_core") else "cpu" cycles = Event('cycles') cycles_in_tx = Event(f'{pmu}/cycles\-t/') cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') try: # Test if the tsx event is present in the json, prefer the # sysfs version so that we can detect its presence at runtime. transaction_start = Event("RTM_RETIRED.START") transaction_start = Event(f'{pmu}/tx\-start/') except: return None elision_start = None try: # Elision start isn't supported by all models, but we'll not # generate the tsx_cycles_per_elision metric in that # case. Again, prefer the sysfs encoding of the event. elision_start = Event("HLE_RETIRED.START") elision_start = Event(f'{pmu}/el\-start/') except: pass return MetricGroup('transaction', [ Metric('tsx_transactional_cycles', 'Percentage of cycles within a transaction region.', Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), '100%'), Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, has_event(cycles_in_tx), 0), '100%'), Metric('tsx_cycles_per_transaction', 'Number of cycles within a transaction divided by the number of transactions.', Select(cycles_in_tx / transaction_start, has_event(cycles_in_tx), 0), "cycles / transaction"), Metric('tsx_cycles_per_elision', 'Number of cycles within a transaction divided by the number of elisions.', Select(cycles_in_tx / elision_start, has_event(elision_start), 0), "cycles / elision") if elision_start else None, ], description="Breakdown of transactional memory statistics") Wdyt? Thanks, Ian > Thanks, > Kan > > > > > Thanks, > > Ian > > > >> Thanks, > >> Kan > >> > >>> + elision_start = Event(f'{pmu}/el\-start/') > >>> + metrics += [ > >>> + Metric('tsx_cycles_per_elision', > >>> + 'Number of cycles within a transaction divided by the number of elisions.', > >>> + Select(cycles_in_tx / elision_start, > >>> + has_event(elision_start), > >>> + 0), > >>> + "cycles / elision"), > >>> + ] > >>> + return MetricGroup('transaction', metrics) > >>> + > >>> + > >>> all_metrics = MetricGroup("", [ > >>> Idle(), > >>> Rapl(), > >>> Smi(), > >>> + Tsx(), > >>> ]) > >>> > >>> if args.metricgroups: > >
On 2024-03-01 11:37 a.m., Ian Rogers wrote: > On Fri, Mar 1, 2024 at 6:52 AM Liang, Kan <kan.liang@linux.intel.com> wrote: >> >> >> >> On 2024-02-29 8:01 p.m., Ian Rogers wrote: >>> On Thu, Feb 29, 2024 at 1:15 PM Liang, Kan <kan.liang@linux.intel.com> wrote: >>>> >>>> >>>> >>>> On 2024-02-28 7:17 p.m., Ian Rogers wrote: >>>>> Allow duplicated metric to be dropped from json files. >>>>> >>>>> Signed-off-by: Ian Rogers <irogers@google.com> >>>>> --- >>>>> tools/perf/pmu-events/intel_metrics.py | 51 ++++++++++++++++++++++++++ >>>>> 1 file changed, 51 insertions(+) >>>>> >>>>> diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py >>>>> index 20c25d142f24..1096accea2aa 100755 >>>>> --- a/tools/perf/pmu-events/intel_metrics.py >>>>> +++ b/tools/perf/pmu-events/intel_metrics.py >>>>> @@ -7,6 +7,7 @@ import argparse >>>>> import json >>>>> import math >>>>> import os >>>>> +from typing import Optional >>>>> >>>>> parser = argparse.ArgumentParser(description="Intel perf json generator") >>>>> parser.add_argument("-metricgroups", help="Generate metricgroups data", action='store_true') >>>>> @@ -77,10 +78,60 @@ def Smi() -> MetricGroup: >>>>> ]) >>>>> >>>>> >>>>> +def Tsx() -> Optional[MetricGroup]: >>>>> + if args.model not in [ >>>>> + 'alderlake', >>>>> + 'cascadelakex', >>>>> + 'icelake', >>>>> + 'icelakex', >>>>> + 'rocketlake', >>>>> + 'sapphirerapids', >>>>> + 'skylake', >>>>> + 'skylakex', >>>>> + 'tigerlake',> + ]: >>>> >>>> Can we get ride of the model list? Otherwise, we have to keep updating >>>> the list. >>> >>> Do we expect the list to update? :-) >> >> Yes, at least for the meteorlake and graniterapids. They should be the >> same as alderlake and sapphirerapids. I'm not sure about the future >> platforms. >> >> Maybe we can have a if args.model in list here to include all the >> non-hybrid models which doesn't support TSX. I think the list should not >> be changed shortly. >> >>> The issue is the events are in >>> sysfs and not the json. If we added the tsx events to json then this >>> list wouldn't be necessary, but it also would mean the events would be >>> present in "perf list" even when TSX is disabled. >> >> I think there may an alternative way, to check the RTM events, e.g., >> RTM_RETIRED.START event. We only need to generate the metrics for the >> platform which supports the RTM_RETIRED.START event. >> >> >>> >>>>> + return None >>>>> +> + pmu = "cpu_core" if args.model == "alderlake" else "cpu" >>>> >>>> Is it possible to change the check to the existence of the "cpu" PMU >>>> here? has_pmu("cpu") ? "cpu" : "cpu_core" >>> >>> The "Unit" on "cpu" events in json always just blank. On hybrid it is >>> either "cpu_core" or "cpu_atom", so I can make this something like: >>> >>> pmu = "cpu_core" if metrics.HasPmu("cpu_core") else "cpu" >>> >>> which would be a build time test. >> >> Yes, I think using the "Unit" is good enough. >> >>> >>> >>>>> + cycles = Event('cycles') >>>>> + cycles_in_tx = Event(f'{pmu}/cycles\-t/') >>>>> + transaction_start = Event(f'{pmu}/tx\-start/') >>>>> + cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') >>>>> + metrics = [ >>>>> + Metric('tsx_transactional_cycles', >>>>> + 'Percentage of cycles within a transaction region.', >>>>> + Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), >>>>> + '100%'), >>>>> + Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', >>>>> + Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, >>>>> + has_event(cycles_in_tx), >>>>> + 0), >>>>> + '100%'), >>>>> + Metric('tsx_cycles_per_transaction', >>>>> + 'Number of cycles within a transaction divided by the number of transactions.', >>>>> + Select(cycles_in_tx / transaction_start, >>>>> + has_event(cycles_in_tx), >>>>> + 0), >>>>> + "cycles / transaction"), >>>>> + ] >>>>> + if args.model != 'sapphirerapids': >>>> >>>> Add the "tsx_cycles_per_elision" metric only if >>>> has_event(f'{pmu}/el\-start/')? >>> >>> It's a sysfs event, so this wouldn't work :-( >> >> The below is the definition of el-start in the kernel. >> EVENT_ATTR_STR(el-start, el_start, "event=0xc8,umask=0x1"); >> >> The corresponding event in the event list should be HLE_RETIRED.START >> "EventCode": "0xC8", >> "UMask": "0x01", >> "EventName": "HLE_RETIRED.START", >> >> I think we may check the HLE_RETIRED.START instead. If the >> HLE_RETIRED.START doesn't exist, I don't see a reason why the >> tsx_cycles_per_elision should be supported. >> >> Again, in the virtualization world, it's possible that the >> HLE_RETIRED.START exists in the event list but el_start isn't available >> in the sysfs. I think it has to be specially handle in the test as well. > > So we keep the has_event test on the sysfs event to handle the > virtualization and disabled case. We use HLE_RETIRED.START to detect > whether the model supports TSX. Yes. I think the JSON event always keeps the latest status of an event. If an event is deprecated someday, I don't think there is a reason to keep any metrics including the event. So we should use it to check whether to generate a metrics. The sysfs event tells if the current kernel support the event. It should be used to check whether a metrics should be used/enabled. > Should the event be the sysfs or json > version? i.e. > > "MetricExpr": "(cycles\\-t / el\\-start if > has_event(el\\-start) else 0)", > > or > > "MetricExpr": "(cycles\\-t / HLE_RETIRED.START if > has_event(el\\-start) else 0)", > > I think I favor the former for some consistency with the has_event. > Agree, the former looks good to me too. > Using HLE_RETIRED.START means the set of TSX models goes from: > 'alderlake', > 'cascadelakex', > 'icelake', > 'icelakex', > 'rocketlake', > 'sapphirerapids', > 'skylake', > 'skylakex', > 'tigerlake', > > To: > broadwell > broadwellde > broadwellx > cascadelakex > haswell > haswellx > icelake > rocketlake > skylake > skylakex > > Using RTM_RETIRED.START it goes to: > broadwell > broadwellde > broadwellx > cascadelakex > emeraldrapids > graniterapids > haswell > haswellx > icelake > icelakex > rocketlake > sapphirerapids > skylake > skylakex > tigerlake > > So I'm not sure it is working equivalently to what we have today, > which may be good or bad. Here is what I think the code should look > like: Yes, there should be some changes. But I think the changes should be good. For icelakex, the HLE_RETIRED.START has been deprecated. I don't see a reason why should perf keep the tsx_cycles_per_elision metric. For alderlake, TSX is deprecated. The perf should drop the related metrics as well. https://edc.intel.com/content/www/us/en/design/ipla/software-development-platforms/client/platforms/alder-lake-desktop/12th-generation-intel-core-processors-datasheet-volume-1-of-2/001/deprecated-technologies/ > > def Tsx() -> Optional[MetricGroup]: > pmu = "cpu_core" if CheckPmu("cpu_core") else "cpu" > cycles = Event('cycles') > cycles_in_tx = Event(f'{pmu}/cycles\-t/') > cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') > try: > # Test if the tsx event is present in the json, prefer the > # sysfs version so that we can detect its presence at runtime. > transaction_start = Event("RTM_RETIRED.START") > transaction_start = Event(f'{pmu}/tx\-start/') > except: > return None > > elision_start = None > try: > # Elision start isn't supported by all models, but we'll not > # generate the tsx_cycles_per_elision metric in that > # case. Again, prefer the sysfs encoding of the event. > elision_start = Event("HLE_RETIRED.START") > elision_start = Event(f'{pmu}/el\-start/') > except: > pass > > return MetricGroup('transaction', [ > Metric('tsx_transactional_cycles', > 'Percentage of cycles within a transaction region.', > Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), > '100%'), > Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted > transactions.', > Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, > has_event(cycles_in_tx), > 0), > '100%'), > Metric('tsx_cycles_per_transaction', > 'Number of cycles within a transaction divided by the > number of transactions.', > Select(cycles_in_tx / transaction_start, > has_event(cycles_in_tx), > 0), > "cycles / transaction"), > Metric('tsx_cycles_per_elision', > 'Number of cycles within a transaction divided by the > number of elisions.', > Select(cycles_in_tx / elision_start, > has_event(elision_start), > 0), > "cycles / elision") if elision_start else None, > ], description="Breakdown of transactional memory statistics") > > Wdyt? Looks good to me. Thanks, Kan > > Thanks, > Ian > >> Thanks, >> Kan >> >>> >>> Thanks, >>> Ian >>> >>>> Thanks, >>>> Kan >>>> >>>>> + elision_start = Event(f'{pmu}/el\-start/') >>>>> + metrics += [ >>>>> + Metric('tsx_cycles_per_elision', >>>>> + 'Number of cycles within a transaction divided by the number of elisions.', >>>>> + Select(cycles_in_tx / elision_start, >>>>> + has_event(elision_start), >>>>> + 0), >>>>> + "cycles / elision"), >>>>> + ] >>>>> + return MetricGroup('transaction', metrics) >>>>> + >>>>> + >>>>> all_metrics = MetricGroup("", [ >>>>> Idle(), >>>>> Rapl(), >>>>> Smi(), >>>>> + Tsx(), >>>>> ]) >>>>> >>>>> if args.metricgroups: >>>
diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py index 20c25d142f24..1096accea2aa 100755 --- a/tools/perf/pmu-events/intel_metrics.py +++ b/tools/perf/pmu-events/intel_metrics.py @@ -7,6 +7,7 @@ import argparse import json import math import os +from typing import Optional parser = argparse.ArgumentParser(description="Intel perf json generator") parser.add_argument("-metricgroups", help="Generate metricgroups data", action='store_true') @@ -77,10 +78,60 @@ def Smi() -> MetricGroup: ]) +def Tsx() -> Optional[MetricGroup]: + if args.model not in [ + 'alderlake', + 'cascadelakex', + 'icelake', + 'icelakex', + 'rocketlake', + 'sapphirerapids', + 'skylake', + 'skylakex', + 'tigerlake', + ]: + return None + + pmu = "cpu_core" if args.model == "alderlake" else "cpu" + cycles = Event('cycles') + cycles_in_tx = Event(f'{pmu}/cycles\-t/') + transaction_start = Event(f'{pmu}/tx\-start/') + cycles_in_tx_cp = Event(f'{pmu}/cycles\-ct/') + metrics = [ + Metric('tsx_transactional_cycles', + 'Percentage of cycles within a transaction region.', + Select(cycles_in_tx / cycles, has_event(cycles_in_tx), 0), + '100%'), + Metric('tsx_aborted_cycles', 'Percentage of cycles in aborted transactions.', + Select(max(cycles_in_tx - cycles_in_tx_cp, 0) / cycles, + has_event(cycles_in_tx), + 0), + '100%'), + Metric('tsx_cycles_per_transaction', + 'Number of cycles within a transaction divided by the number of transactions.', + Select(cycles_in_tx / transaction_start, + has_event(cycles_in_tx), + 0), + "cycles / transaction"), + ] + if args.model != 'sapphirerapids': + elision_start = Event(f'{pmu}/el\-start/') + metrics += [ + Metric('tsx_cycles_per_elision', + 'Number of cycles within a transaction divided by the number of elisions.', + Select(cycles_in_tx / elision_start, + has_event(elision_start), + 0), + "cycles / elision"), + ] + return MetricGroup('transaction', metrics) + + all_metrics = MetricGroup("", [ Idle(), Rapl(), Smi(), + Tsx(), ]) if args.metricgroups: