From nobody Thu Dec 18 14:28:12 2025 Received: from mail-oa1-f74.google.com (mail-oa1-f74.google.com [209.85.160.74]) (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 BAD6E22A4E3 for ; Wed, 16 Apr 2025 04:51:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779093; cv=none; b=jybxhdLWda/iYjLGq6qGCxSlwWBvo+E9VWH5cepvGitE/tAIAix+JbtFYizvCPKNIDDPxE59cqQT7Chqz+p2iCqCQILmiX0kdNGU7Xp89GE7HvBEBi44meKCGSe2gVEqtir2HQ+etiBq0ZAwl+zMNmmlpFvQVXQS/agZuVmovSU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779093; c=relaxed/simple; bh=ZwxKnyUfUV0KIPz5wQuJqwrVzZbHY49PRIsq+cMua94=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=aOQlA44t07lKcfNkGBOmAb9Rf4mqoDSNUachU+OgUSbQ2PxVk0mgbt6B/KCqr/vQOMwH3YslsNIedC1SYpnwsTTQz/oCmGueKw1dxoMa6vxL5OW+a3AUeXinbCu1n+sfB2zrl5bMeFaU1hWNB6B042mrPExT4XjUVqo9mwbriTA= 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=N2/WkBBH; arc=none smtp.client-ip=209.85.160.74 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="N2/WkBBH" Received: by mail-oa1-f74.google.com with SMTP id 586e51a60fabf-2c2c24379a1so5128839fac.2 for ; Tue, 15 Apr 2025 21:51:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744779091; x=1745383891; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=sBniwiC500TqZjUMG4Z3tEUwBUd0CH31SK3V5EQvH9Q=; b=N2/WkBBHOxRWm8Xzo4cPxXuVGZcRpxBm4V+9kGMUhOrBftSlSqg3VflanbuuMPFX9T Vx/l9nNzyspPdXlYdqtZ69S6+OKlcmjrb5zvu/nbMf5+2QBmPSjPsO/Bc6UQuQ9wiTUI TNyAtThcQMfSRM/INzbGJAR+sY+AdhckHBnm5N6I75m1mx/vJlXf6o2o1qeMMhtKy18H 2gczlv71iyBA3XkJ4Urkl0UycC2i3+JKCphtU3nJu4GRkOzo+1hF1jilWnAwRA4/1y9A 1vNrMT8HXfnSBZtYqLk6Zki83e9LBAKGscFH9cponm9ZJYIQAUr6JMU1wjldxjMAWSaC rTrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744779091; x=1745383891; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sBniwiC500TqZjUMG4Z3tEUwBUd0CH31SK3V5EQvH9Q=; b=rAKUd5G5ciwlYaq+/kdmYxufluQwTTIKq4V7hJnfJhaE7f3qpmJ2bW1aYocljQrokG qE/GaaLlrqu03Fc6kVo5fzTDRw0yhRHcyTWyWZFOlRDCUgapGFD2eRfL4XNBmdKRdk9F cpHHD6aNnyLCpfjxcJpO/0OBKD1m9vht2RBLdBzS5oFNytCQHreOcM3cgDp9cfne53j5 6WkZomT86v8+RSWgj6/gldhRoKS44oqJG63CYA8SmopWoJofR5spKMz9eGFyRcJhWycx OahZi9OsD5uwxTsaefGbfMFFpZtKqnycOCn8sgu6QNTzRa34G4BcUa1ZG7OIReY5st9E xkHg== X-Forwarded-Encrypted: i=1; AJvYcCX3iGHDasKuKJG4VUdxT3aUT94deA61wonCRStzxBi/9tKyXBr+niBYSmzXlXB9KaVLbUJtSmVwrL6n0jA=@vger.kernel.org X-Gm-Message-State: AOJu0YwkBmz1RJ/Lc58wiAOAkWSpu1taoLmjZy9D80aabHCVPdHvVUbh npvruLby47s+8pnVzjT9U2/cm8j3JFJlvm4rUAiyeG7pQW3PsyxkoHw1gfnLWtbUocSG8rwrGJq LAERpCA== X-Google-Smtp-Source: AGHT+IEsRYI4T/m7sG748mm1Mxc9g9jBdukTo0REHINqNYfxE6TEmhEymq6x+5eUJUx1ONIUaITBGVALTkq8 X-Received: from oabnw21.prod.google.com ([2002:a05:6870:bb15:b0:288:7c1b:bc]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6871:a582:b0:2c6:7f82:d38c with SMTP id 586e51a60fabf-2d4d2cdf444mr151241fac.31.1744779090757; Tue, 15 Apr 2025 21:51:30 -0700 (PDT) Date: Tue, 15 Apr 2025 21:51:14 -0700 In-Reply-To: <20250416045117.876775-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250416045117.876775-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.777.g153de2bbd5-goog Message-ID: <20250416045117.876775-2-irogers@google.com> Subject: [PATCH v8 1/4] perf record: Skip don't fail for events that don't open From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Ze Gao , Weilin Wang , Dominique Martinet , Jean-Philippe Romain , Junhao He , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Aditya Bodkhe , Leo Yan , Thomas Falcon , Atish Patra Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Whilst for many tools it is an expected behavior that failure to open a perf event is a failure, ARM decided to name PMU events the same as legacy events and then failed to rename such events on a server uncore SLC PMU. As perf's default behavior when no PMU is specified is to open the event on all PMUs that advertise/"have" the event, this yielded failures when trying to make the priority of legacy and sysfs/json events uniform - something requested by RISC-V and ARM. A legacy event user on ARM hardware may find their event opened on an uncore PMU which for perf record will fail. Arnaldo suggested skipping such events which this patch implements. Rather than have the skipping conditional on running on ARM, the skipping is done on all architectures as such a fundamental behavioral difference could lead to problems with tools built/depending on perf. An example of perf record failing to open events on x86 is: ``` $ perf record -e data_read,cycles,LLC-prefetch-read -a sleep 0.1 Error: Failure to open event 'data_read' on PMU 'uncore_imc_free_running_0' which = will be removed. The sys_perf_event_open() syscall returned with 22 (Invalid argument) for e= vent (data_read). "dmesg | grep -i perf" may provide additional information. Error: Failure to open event 'data_read' on PMU 'uncore_imc_free_running_1' which = will be removed. The sys_perf_event_open() syscall returned with 22 (Invalid argument) for e= vent (data_read). "dmesg | grep -i perf" may provide additional information. Error: Failure to open event 'LLC-prefetch-read' on PMU 'cpu' which will be remove= d. The LLC-prefetch-read event is not supported. [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 2.188 MB perf.data (87 samples) ] $ perf report --stats Aggregated stats: TOTAL events: 17255 MMAP events: 284 ( 1.6%) COMM events: 1961 (11.4%) EXIT events: 1 ( 0.0%) FORK events: 1960 (11.4%) SAMPLE events: 87 ( 0.5%) MMAP2 events: 12836 (74.4%) KSYMBOL events: 83 ( 0.5%) BPF_EVENT events: 36 ( 0.2%) FINISHED_ROUND events: 2 ( 0.0%) ID_INDEX events: 1 ( 0.0%) THREAD_MAP events: 1 ( 0.0%) CPU_MAP events: 1 ( 0.0%) TIME_CONV events: 1 ( 0.0%) FINISHED_INIT events: 1 ( 0.0%) cycles stats: SAMPLE events: 87 ``` If all events fail to open then the perf record will fail: ``` $ perf record -e LLC-prefetch-read true Error: Failure to open event 'LLC-prefetch-read' on PMU 'cpu' which will be remove= d. The LLC-prefetch-read event is not supported. Error: Failure to open any events for recording ``` As an evlist may have dummy events that open when all command line events fail we ignore dummy events when detecting if at least some events open. This still permits the dummy event on its own to be used as a permission check: ``` $ perf record -e dummy true [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.046 MB perf.data ] ``` but allows failure when a dummy event is implicilty inserted or when there are insufficient permissions to open it: ``` $ perf record -e LLC-prefetch-read -a true Error: Failure to open event 'LLC-prefetch-read' on PMU 'cpu' which will be remove= d. The LLC-prefetch-read event is not supported. Error: Failure to open any events for recording ``` As the first parsed event in an evlist is marked as tracking, removing this event can remove tracking from the evlist, removing mmap events and breaking symbolization. To avoid this, if a tracking event is removed then the next event has tracking added. The issue with legacy events is that on RISC-V they want the driver to not have mappings from legacy to non-legacy config encodings for each vendor/model due to size, complexity and difficulty to update. It was reported that on ARM Apple-M? CPUs the legacy mapping in the driver was broken and the sysfs/json events should always take precedent, however, it isn't clear this is still the case. It is the case that without working around this issue a legacy event like cycles without a PMU can encode differently than when specified with a PMU - the non-PMU version favoring legacy encodings, the PMU one avoiding legacy encodings. Legacy events are also case sensitive while sysfs/json events are not. The patch removes events and then adjusts the idx value for each evsel. This is done so that the dense xyarrays used for file descriptors, etc. don't contain broken entries. As event opening happens relatively late in the record process, use of the idx value before the open will have become corrupted, so it is expected there are latent bugs hidden behind this change - the change is best effort. As the only vendor that has broken event names is ARM, this will principally effect ARM users. They will also experience warning messages like those above because of the uncore PMU advertising legacy event names. Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Ian Rogers Prior versions without adding the tracking data was: Tested-by: James Clark Tested-by: Leo Yan Tested-by: Atish Patra --- tools/perf/builtin-record.c | 63 +++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index ba20bf7c011d..6f59a419ec5d 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -962,7 +962,6 @@ static int record__config_tracking_events(struct record= *rec) */ if (opts->target.initial_delay || target__has_cpu(&opts->target) || perf_pmus__num_core_pmus() > 1) { - /* * User space tasks can migrate between CPUs, so when tracing * selected CPUs, sideband for all CPUs is still needed. @@ -1367,8 +1366,23 @@ static int record__open(struct record *rec) struct perf_session *session =3D rec->session; struct record_opts *opts =3D &rec->opts; int rc =3D 0; + bool skipped =3D false; + bool removed_tracking =3D false; =20 evlist__for_each_entry(evlist, pos) { + if (removed_tracking) { + /* + * Normally the head of the list has tracking enabled + * for sideband data like mmaps. If this event is + * removed, make sure to add tracking to the next + * processed event. + */ + if (!pos->tracking) { + pos->tracking =3D true; + evsel__config(pos, opts, &callchain_param); + } + removed_tracking =3D false; + } try_again: if (evsel__open(pos, pos->core.cpus, pos->core.threads) < 0) { if (evsel__fallback(pos, &opts->target, errno, msg, sizeof(msg))) { @@ -1382,15 +1396,52 @@ static int record__open(struct record *rec) pos =3D evlist__reset_weak_group(evlist, pos, true); goto try_again; } - rc =3D -errno; evsel__open_strerror(pos, &opts->target, errno, msg, sizeof(msg)); - ui__error("%s\n", msg); - goto out; + ui__error("Failure to open event '%s' on PMU '%s' which will be removed= .\n%s\n", + evsel__name(pos), evsel__pmu_name(pos), msg); + if (pos->tracking) + removed_tracking =3D true; + pos->skippable =3D true; + skipped =3D true; + } else { + pos->supported =3D true; } - - pos->supported =3D true; } =20 + if (skipped) { + struct evsel *tmp; + int idx =3D 0; + bool evlist_empty =3D true; + + /* Remove evsels that failed to open and update indices. */ + evlist__for_each_entry_safe(evlist, tmp, pos) { + if (pos->skippable) { + evlist__remove(evlist, pos); + continue; + } + + /* + * Note, dummy events may be command line parsed or + * added by the tool. We care about supporting `perf + * record -e dummy` which may be used as a permission + * check. Dummy events that are added to the command + * line and opened along with other events that fail, + * will still fail as if the dummy events were tool + * added events for the sake of code simplicity. + */ + if (!evsel__is_dummy_event(pos)) + evlist_empty =3D false; + } + evlist__for_each_entry(evlist, pos) { + pos->core.idx =3D idx++; + } + /* If list is empty then fail. */ + if (evlist_empty) { + ui__error("Failure to open any events for recording.\n"); + rc =3D -1; + goto out; + } + } if (symbol_conf.kptr_restrict && !evlist__exclude_kernel(evlist)) { pr_warning( "WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n" --=20 2.49.0.777.g153de2bbd5-goog From nobody Thu Dec 18 14:28:12 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 3A230229B17 for ; Wed, 16 Apr 2025 04:51:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779095; cv=none; b=bgUHYxjxBKUu6uGbAkgMWNA29t+vyZDhY8ns6RltL5s7Tfopkal9wg4ZaKUJpsLSjvEApMCepU4A9W+ST04xxT3lZQcjw7bDVLqvZRH9quDISDv54jeR2ksVnvSro9nl420KGrJXlb7DqgM/cmVIPEzN/W4CM8lXtB/O7Q3zQmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779095; c=relaxed/simple; bh=Z3OcvrkiJ0XoTxWGo9t5E9tNKRTzp3qvFm/E7TCGt6w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=l1tZrWBVKQSloMrN2dotYz7oH9PWDNvzunZJLPDRhh6ySOx1KUoUdiepe1kdG2MlqWRLeaiUEimWQBhQYetOeYTu+BOZvB1ewp2BIVOTlsOmwyvDuYc8SbFR+rb7YUJfheoC80cI0QCtRkvfnejDU2DkG7gehSBlcbdQTdXV+yQ= 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=Yp4wF3oy; arc=none smtp.client-ip=209.85.214.202 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Yp4wF3oy" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-22c31b55ac6so7541455ad.0 for ; Tue, 15 Apr 2025 21:51:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744779092; x=1745383892; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=g3ShVOfpgDEvI1032RF4ZcQ0fL2biVXBJPOL411ra/g=; b=Yp4wF3oyEzX4EXIW7iByUEHhhELGUoqd6yqrEr8s5RRzOTtFtRvi+fa5duPwsrnbwC BtOok3SYRIqzPYakwde7y2sTzhkeULtlTAe9EK/KsXt7ibzKxhojXQYv7hmyt6ruiBb6 88AFTXulPEyFldSl8JR6MBf5veBWygmcMJZMhswMVq6hDy7SVqEPDRqKCnaa41v/7mmw 7Z5M+BmRtl9q8thT8woDbLTJVDlof5Wq2RK7xqIMlksQaiL0cZdspLpOR/6B6FO8Ejtm cjBo6s4v1CK58hDim5hq/Ou9nyzaYy8Dhponzod6ov5Z8idJX0QBGgC9nfNoxSSpdmDa wqfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744779092; x=1745383892; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=g3ShVOfpgDEvI1032RF4ZcQ0fL2biVXBJPOL411ra/g=; b=CPPsPi2UbS1fMTDKdbTf1ZlF0u2jXYpGzpfu0SO535eMauUqIiZWrjEUYYofy0bU9f bs/iv62n6IZ2g+zazltVYvoBTXZsSXSJiTqc2E9/SJDNWpYVyXce4oSLfoWFxlmD4Syn pz/rPMU2+b3Y9Cu0TN5xbscSi/3OBpmoLlIfokCSt9c3QYX5msH+1toq74EWWBJP7Y5O 5NK6JeBWYUD7ghGsxZosf3sx+lVpc1r9qPpCGeMNdfEyrLGUaSF1vESD/X2xooPOg+Ww gVC1daKAL1Z3zrhYvpmPMXLQr79MQQ2yRi3RAS5DZxPiZX2r1/ZwS8RVb0SvHFbEd1L+ f28w== X-Forwarded-Encrypted: i=1; AJvYcCVa4Dl+pnfEGQet8k0Ul41qVFpHD9sgpf2i3CTfAZ9FWBVC1qtVH0BLutoAIsu6JXlakeoKQz/YSLQrn24=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0Lp+l0N619bvNlfijbQGRjdCIIxrOevF7UCvZvh5fy0s7TwpK sSY51+FU0c+Lm1ERt+xlT2i44Viy9wEDj1WgONg1EaKjvk9pbcMeBuDCNmnbB7kBLuDb/o15MKc qcpRGJQ== X-Google-Smtp-Source: AGHT+IFg1pHHx9ZpaAAazdww9/od6FLTiU3dXw8OsrGkutfRWjSeeDsX06Fai87Cf6iqpTkL2kh696d3z8K8 X-Received: from plpn4.prod.google.com ([2002:a17:902:9684:b0:220:c367:eb6d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ea0c:b0:224:10a2:cad5 with SMTP id d9443c01a7336-22c358c4fa9mr7419335ad.10.1744779092450; Tue, 15 Apr 2025 21:51:32 -0700 (PDT) Date: Tue, 15 Apr 2025 21:51:15 -0700 In-Reply-To: <20250416045117.876775-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250416045117.876775-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.777.g153de2bbd5-goog Message-ID: <20250416045117.876775-3-irogers@google.com> Subject: [PATCH v8 2/4] perf parse-events: Reapply "Prefer sysfs/JSON hardware events over legacy" From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Ze Gao , Weilin Wang , Dominique Martinet , Jean-Philippe Romain , Junhao He , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Aditya Bodkhe , Leo Yan , Thomas Falcon , Atish Patra Cc: Beeman Strong , Arnaldo Carvalho de Melo Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Originally posted and merged from: https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com This reverts commit 4f1b067359ac8364cdb7f9fda41085fa85789d0f although the patch is now smaller due to related fixes being applied in commit 22a4db3c3603 ("perf evsel: Add alternate_hw_config and use in evsel__match"). The original commit message was: It was requested that RISC-V be able to add events to the perf tool so the PMU driver didn't need to map legacy events to config encodings: https://lore.kernel.org/lkml/20240217005738.3744121-1-atishp@rivosinc.com/ This change makes the priority of events specified without a PMU the same as those specified with a PMU, namely sysfs and JSON events are checked first before using the legacy encoding. The hw_term is made more generic as a hardware_event that encodes a pair of string and int value, allowing parse_events_multi_pmu_add to fall back on a known encoding when the sysfs/JSON adding fails for core events. As this covers PE_VALUE_SYM_HW, that token is removed and related code simplified. Signed-off-by: Ian Rogers Reviewed-by: Kan Liang Tested-by: Atish Patra Tested-by: James Clark Tested-by: Leo Yan Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Beeman Strong Cc: Ingo Molnar Cc: Jiri Olsa Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/parse-events.c | 27 +++++++++--- tools/perf/util/parse-events.l | 76 +++++++++++++++++----------------- tools/perf/util/parse-events.y | 60 ++++++++++++++++++--------- 3 files changed, 99 insertions(+), 64 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 5152fd5a6ead..f4236570aa4c 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1551,8 +1551,8 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, struct list_head *list =3D NULL; struct perf_pmu *pmu =3D NULL; YYLTYPE *loc =3D loc_; - int ok =3D 0; - const char *config; + int ok =3D 0, core_ok =3D 0; + const char *tmp; struct parse_events_terms parsed_terms; =20 *listp =3D NULL; @@ -1565,15 +1565,15 @@ int parse_events_multi_pmu_add(struct parse_events_= state *parse_state, return ret; } =20 - config =3D strdup(event_name); - if (!config) + tmp =3D strdup(event_name); + if (!tmp) goto out_err; =20 if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - config, /*num=3D*/1, /*novalue=3D*/true, + tmp, /*num=3D*/1, /*novalue=3D*/true, loc, /*loc_val=3D*/NULL) < 0) { - zfree(&config); + zfree(&tmp); goto out_err; } list_add_tail(&term->list, &parsed_terms.terms); @@ -1604,6 +1604,8 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf); strbuf_release(&sb); ok++; + if (pmu->is_core) + core_ok++; } } =20 @@ -1617,9 +1619,22 @@ int parse_events_multi_pmu_add(struct parse_events_s= tate *parse_state, pr_debug("%s -> fake/%s/\n", event_name, sb.buf); strbuf_release(&sb); ok++; + core_ok++; } } =20 + if (hw_config !=3D PERF_COUNT_HW_MAX && !core_ok) { + /* + * The event wasn't found on core PMUs but it has a hardware + * config version to try. + */ + if (!parse_events_add_numeric(parse_state, list, + PERF_TYPE_HARDWARE, hw_config, + const_parsed_terms, + /*wildcard=3D*/true)) + ok++; + } + out_err: parse_events_terms__exit(&parsed_terms); if (ok) diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 7ed86e3e34e3..324b7dc8a0d3 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -117,12 +117,12 @@ do { \ yyless(0); \ } while (0) =20 -static int sym(yyscan_t scanner, int type, int config) +static int sym(yyscan_t scanner, int config) { YYSTYPE *yylval =3D parse_events_get_lval(scanner); =20 - yylval->num =3D (type << 16) + config; - return type =3D=3D PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW; + yylval->num =3D config; + return PE_VALUE_SYM_SW; } =20 static int term(yyscan_t scanner, enum parse_events__term_type type) @@ -133,13 +133,13 @@ static int term(yyscan_t scanner, enum parse_events__= term_type type) return PE_TERM; } =20 -static int hw_term(yyscan_t scanner, int config) +static int hw(yyscan_t scanner, int config) { YYSTYPE *yylval =3D parse_events_get_lval(scanner); char *text =3D parse_events_get_text(scanner); =20 - yylval->hardware_term.str =3D strdup(text); - yylval->hardware_term.num =3D PERF_TYPE_HARDWARE + config; + yylval->hardware_event.str =3D strdup(text); + yylval->hardware_event.num =3D config; return PE_TERM_HW; } =20 @@ -335,16 +335,16 @@ aux-output { return term(yyscanner, PARSE_EVENTS__TE= RM_TYPE_AUX_OUTPUT); } aux-action { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_ACTION); } aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMP= LE_SIZE); } metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); } -cpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES)= ; } -stalled-cycles-frontend|idle-cycles-frontend { return hw_term(yyscanner, P= ERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } -stalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PER= F_COUNT_HW_STALLED_CYCLES_BACKEND); } -instructions { return hw_term(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } -cache-references { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_REFERE= NCES); } -cache-misses { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } -branch-instructions|branches { return hw_term(yyscanner, PERF_COUNT_HW_B= RANCH_INSTRUCTIONS); } -branch-misses { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_MISSES)= ; } -bus-cycles { return hw_term(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } -ref-cycles { return hw_term(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } +cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); } +stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_C= OUNT_HW_STALLED_CYCLES_FRONTEND); } +stalled-cycles-backend|idle-cycles-backend { return hw(yyscanner, PERF_COU= NT_HW_STALLED_CYCLES_BACKEND); } +instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } +cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES)= ; } +cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } +branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH= _INSTRUCTIONS); } +branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } +bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } +ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } r{num_raw_hex} { return str(yyscanner, PE_RAW); } r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } , { return ','; } @@ -390,28 +390,28 @@ r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } <> { BEGIN(INITIAL); } } =20 -cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUN= T_HW_CPU_CYCLES); } -stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_= TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } -stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TY= PE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } -instructions { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW= _INSTRUCTIONS); } -cache-references { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT= _HW_CACHE_REFERENCES); } -cache-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW= _CACHE_MISSES); } -branch-instructions|branches { return sym(yyscanner, PERF_TYPE_HARDWARE,= PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } -branch-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_H= W_BRANCH_MISSES); } -bus-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_B= US_CYCLES); } -ref-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_R= EF_CPU_CYCLES); } -cpu-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CP= U_CLOCK); } -task-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_T= ASK_CLOCK); } -page-faults|faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COU= NT_SW_PAGE_FAULTS); } -minor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW= _PAGE_FAULTS_MIN); } -major-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW= _PAGE_FAULTS_MAJ); } -context-switches|cs { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_CO= UNT_SW_CONTEXT_SWITCHES); } -cpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PE= RF_COUNT_SW_CPU_MIGRATIONS); } -alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT= _SW_ALIGNMENT_FAULTS); } -emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT= _SW_EMULATION_FAULTS); } -dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY= ); } -bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_B= PF_OUTPUT); } -cgroup-switches { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT= _SW_CGROUP_SWITCHES); } +cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); } +stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_C= OUNT_HW_STALLED_CYCLES_FRONTEND); } +stalled-cycles-backend|idle-cycles-backend { return hw(yyscanner, PERF_COU= NT_HW_STALLED_CYCLES_BACKEND); } +instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } +cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES)= ; } +cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } +branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH= _INSTRUCTIONS); } +branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } +bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } +ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } +cpu-clock { return sym(yyscanner, PERF_COUNT_SW_CPU_CLOCK); } +task-clock { return sym(yyscanner, PERF_COUNT_SW_TASK_CLOCK); } +page-faults|faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); } +minor-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); } +major-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } +context-switches|cs { return sym(yyscanner, PERF_COUNT_SW_CONTEXT_SWITC= HES); } +cpu-migrations|migrations { return sym(yyscanner, PERF_COUNT_SW_CPU_MIGR= ATIONS); } +alignment-faults { return sym(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS= ); } +emulation-faults { return sym(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS= ); } +dummy { return sym(yyscanner, PERF_COUNT_SW_DUMMY); } +bpf-output { return sym(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); } +cgroup-switches { return sym(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES)= ; } =20 {lc_type} { return str(yyscanner, PE_LEGACY_CACHE); } {lc_type}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); } diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index f888cbb076d6..d2ef1890007e 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -55,7 +55,7 @@ static void free_list_evsel(struct list_head* list_evsel) %} =20 %token PE_START_EVENTS PE_START_TERMS -%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM +%token PE_VALUE PE_VALUE_SYM_SW PE_TERM %token PE_EVENT_NAME %token PE_RAW PE_NAME %token PE_MODIFIER_EVENT PE_MODIFIER_BP PE_BP_COLON PE_BP_SLASH @@ -65,11 +65,9 @@ static void free_list_evsel(struct list_head* list_evsel) %token PE_DRV_CFG_TERM %token PE_TERM_HW %type PE_VALUE -%type PE_VALUE_SYM_HW %type PE_VALUE_SYM_SW %type PE_MODIFIER_EVENT %type PE_TERM -%type value_sym %type PE_RAW %type PE_NAME %type PE_LEGACY_CACHE @@ -85,6 +83,7 @@ static void free_list_evsel(struct list_head* list_evsel) %type opt_pmu_config %destructor { parse_events_terms__delete ($$); } %type event_pmu +%type event_legacy_hardware %type event_legacy_symbol %type event_legacy_cache %type event_legacy_mem @@ -102,8 +101,8 @@ static void free_list_evsel(struct list_head* list_evse= l) %destructor { free_list_evsel ($$); } %type tracepoint_name %destructor { free ($$.sys); free ($$.event); } -%type PE_TERM_HW -%destructor { free ($$.str); } +%type PE_TERM_HW +%destructor { free ($$.str); } =20 %union { @@ -118,10 +117,10 @@ static void free_list_evsel(struct list_head* list_ev= sel) char *sys; char *event; } tracepoint_name; - struct hardware_term { + struct hardware_event { char *str; u64 num; - } hardware_term; + } hardware_event; } %% =20 @@ -264,6 +263,7 @@ PE_EVENT_NAME event_def event_def =20 event_def: event_pmu | + event_legacy_hardware | event_legacy_symbol | event_legacy_cache sep_dc | event_legacy_mem sep_dc | @@ -306,24 +306,45 @@ PE_NAME sep_dc $$ =3D list; } =20 -value_sym: -PE_VALUE_SYM_HW +event_legacy_hardware: +PE_TERM_HW opt_pmu_config +{ + /* List of created evsels. */ + struct list_head *list =3D NULL; + int err =3D parse_events_multi_pmu_add(_parse_state, $1.str, $1.num, $2, = &list, &@1); + + free($1.str); + parse_events_terms__delete($2); + if (err) + PE_ABORT(err); + + $$ =3D list; +} | -PE_VALUE_SYM_SW +PE_TERM_HW sep_dc +{ + struct list_head *list; + int err; + + err =3D parse_events_multi_pmu_add(_parse_state, $1.str, $1.num, NULL, &l= ist, &@1); + free($1.str); + if (err) + PE_ABORT(err); + $$ =3D list; +} =20 event_legacy_symbol: -value_sym '/' event_config '/' +PE_VALUE_SYM_SW '/' event_config '/' { struct list_head *list; - int type =3D $1 >> 16; - int config =3D $1 & 255; int err; - bool wildcard =3D (type =3D=3D PERF_TYPE_HARDWARE || type =3D=3D PERF_TYP= E_HW_CACHE); =20 list =3D alloc_list(); if (!list) YYNOMEM; - err =3D parse_events_add_numeric(_parse_state, list, type, config, $3, wi= ldcard); + err =3D parse_events_add_numeric(_parse_state, list, + /*type=3D*/PERF_TYPE_SOFTWARE, /*config=3D*/$1, + $3, /*wildcard=3D*/false); parse_events_terms__delete($3); if (err) { free_list_evsel(list); @@ -332,18 +353,17 @@ value_sym '/' event_config '/' $$ =3D list; } | -value_sym sep_slash_slash_dc +PE_VALUE_SYM_SW sep_slash_slash_dc { struct list_head *list; - int type =3D $1 >> 16; - int config =3D $1 & 255; - bool wildcard =3D (type =3D=3D PERF_TYPE_HARDWARE || type =3D=3D PERF_TYP= E_HW_CACHE); int err; =20 list =3D alloc_list(); if (!list) YYNOMEM; - err =3D parse_events_add_numeric(_parse_state, list, type, config, /*head= _config=3D*/NULL, wildcard); + err =3D parse_events_add_numeric(_parse_state, list, + /*type=3D*/PERF_TYPE_SOFTWARE, /*config=3D*/$1, + /*head_config=3D*/NULL, /*wildcard=3D*/false); if (err) PE_ABORT(err); $$ =3D list; --=20 2.49.0.777.g153de2bbd5-goog From nobody Thu Dec 18 14:28:12 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 4A0EE22A804 for ; Wed, 16 Apr 2025 04:51:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779097; cv=none; b=T8RLcESF2b9XzedQKLjCFRV00C8c4wN+9p0N/CT6Kj9Fe4tB0sGk6/8KYc7aUfIIEzVxV7fEH+RZMmiAjwNkKqYAwr5z4jJma2Z09y7zEwFMes/K7djkmN2LFx/WG7GwaVYy6JtqDG6RoupvREYOuNWR+UPxJvofxedjWEBHoPY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779097; c=relaxed/simple; bh=+02A8xjTJSay0AmeM/5FcWc3Udtw6E2swW89rzUzsJw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Z1AWByRNWqHZuHOGAS1LZKFVVxOdUwQuQ2qu8E69Sxbm8G2NNvoiTxrQfk2VW0irwJ7nDsn1/GYGOrpTteVo13KGBGDMQVJ5AhGkO/t17GLsXGlfJRCb8BfRTfh1Wih4HIdlCeIAiedoQMi4UlUTsyXHE5hh7ZsBBiQwcIDLrTw= 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=JCZ5VbKo; arc=none smtp.client-ip=209.85.216.73 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="JCZ5VbKo" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3032ea03448so5987692a91.2 for ; Tue, 15 Apr 2025 21:51:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744779094; x=1745383894; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=h7+NEHtGwUKznWHoYGvIc99VKsCsRILkozJ+tQcf7Wk=; b=JCZ5VbKo1IiVkhLyIbkfjZr8Jq08VO8td3qXxcJeEbbT7i1PIADQwoyJsvMampiVNy ZFsOupEOTfIYlnzgCPnk9J/4h5rQYEVNisNOiv3Q+tb2bm+asbSPX5NPaObic0xM3DQQ fHjqEP+TIF9+6EZoq8wAqKO1Ebv+z9JkHLbsJmkvRMW9UboBF9o53r0OZNB09UDuCE/m aPiGq+AH8KZIWlqtwAW8e0rQQj1X3wtC6Lbg0Mibb6j075z8qw/NbTyCw8GsPmCdcGbq 0jvV5geWtKYb2QsAa/P/k90bUGhp9YhCWsoM2P5AjOwM0DYV0vuWcQfbWf31Gntk2Bay k+aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744779094; x=1745383894; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=h7+NEHtGwUKznWHoYGvIc99VKsCsRILkozJ+tQcf7Wk=; b=Io5ApVYc8up4Q6nX2uxo6us7mjEGMb3npKa8LoTw+vh6RCqLS3YWfguEHO/YDab/tM s0SNALML0E9PlpXdt81Ehm7nGDuEsDS0RtgQBd7HFZcMTioK6ika9SmaI0o357/UDQqB /oDUHG3yOCXXUlv+9hZkPC9EmB5ZsQaRWkO7BTCH7UILsYY0bpuYfue0hiw9OqcwN57D CBbKw/ruTeGgPKcu2Ph5Mly/NuwXe/XhngaOVCaOJVI1yyD3denWf0k5Gcw9nHgMgrFN csY9OoYyR7leu3OvvZBsByaBqLeO8FDqqyd1v28NI16P33dOfeLrLLRqpOzvCmjabrQ/ iNpA== X-Forwarded-Encrypted: i=1; AJvYcCVLdOATvR4w1bWY7GigwsOI+gUsKmI/UpZOzuckIuza8+A7MfuQWqwKvLBdKSWx8Sw1Z6n4nSgXWnR/myM=@vger.kernel.org X-Gm-Message-State: AOJu0YwgioHt+eqYaJrMibbZA4mWgM1vgmH2bDwkI1LSyUWKrnsWqOkH XS+GLfzXEKZQiapXSEO/x0IKSXG4202g/qbdeRYVh4oo9wzF4bctvGt4VMscCfmqYxqZddjFTbU CSy48gA== X-Google-Smtp-Source: AGHT+IFYHuTziH5y/f7XYexO/oNO5b7ZwIk5bPJYuWDGfkU3Z1cpF7YWz5g/x+0yBHrrQ14ip0gkN69NemSa X-Received: from pjbsm16.prod.google.com ([2002:a17:90b:2e50:b0:301:2a0f:b03d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:582e:b0:2fe:afbc:cd53 with SMTP id 98e67ed59e1d1-3086415e8c4mr544184a91.28.1744779094442; Tue, 15 Apr 2025 21:51:34 -0700 (PDT) Date: Tue, 15 Apr 2025 21:51:16 -0700 In-Reply-To: <20250416045117.876775-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250416045117.876775-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.777.g153de2bbd5-goog Message-ID: <20250416045117.876775-4-irogers@google.com> Subject: [PATCH v8 3/4] perf parse-events: Allow software events to be terms From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Ze Gao , Weilin Wang , Dominique Martinet , Jean-Philippe Romain , Junhao He , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Aditya Bodkhe , Leo Yan , Thomas Falcon , Atish Patra Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow legacy software events to be specified as, for example, software/cpu-clock/u for consistency in parsing with hardware events. Rename the type for hardware_event to legacy_event given its new dual role. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 20 +++++++++++--- tools/perf/util/parse-events.h | 3 ++- tools/perf/util/parse-events.l | 48 ++++++++++++++++++++++------------ tools/perf/util/parse-events.y | 43 ++++++++++++++++++++++-------- tools/perf/util/pmu.c | 9 ++++--- 5 files changed, 86 insertions(+), 37 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index f4236570aa4c..21506fcf0bfa 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -805,6 +805,7 @@ const char *parse_events__term_type_str(enum parse_even= ts__term_type term_type) [PARSE_EVENTS__TERM_TYPE_RAW] =3D "raw", [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] =3D "legacy-cache", [PARSE_EVENTS__TERM_TYPE_HARDWARE] =3D "hardware", + [PARSE_EVENTS__TERM_TYPE_SOFTWARE] =3D "software", }; if ((unsigned int)term_type >=3D __PARSE_EVENTS__TERM_TYPE_NR) return "unknown term"; @@ -854,6 +855,7 @@ config_term_avail(enum parse_events__term_type term_typ= e, struct parse_events_er case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_SOFTWARE: default: if (!err) return false; @@ -985,6 +987,7 @@ do { \ case PARSE_EVENTS__TERM_TYPE_USER: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_SOFTWARE: default: parse_events_error__handle(err, term->err_term, strdup(parse_events__term_type_str(term->type_term)), @@ -1037,7 +1040,8 @@ static int config_term_pmu(struct perf_event_attr *at= tr, term->no_value =3D true; } } - if (term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_HARDWARE) { + if (term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_HARDWARE || + term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_SOFTWARE) { struct perf_pmu *pmu =3D perf_pmus__find_by_type(attr->type); =20 if (!pmu) { @@ -1057,10 +1061,15 @@ static int config_term_pmu(struct perf_event_attr *= attr, term->no_value =3D true; term->alternate_hw_config =3D true; } else { - attr->type =3D PERF_TYPE_HARDWARE; attr->config =3D term->val.num; - if (perf_pmus__supports_extended_type()) - attr->config |=3D (__u64)pmu->type << PERF_PMU_TYPE_SHIFT; + if (term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_HARDWARE) { + attr->type =3D PERF_TYPE_HARDWARE; + if (perf_pmus__supports_extended_type()) + attr->config |=3D (__u64)pmu->type << PERF_PMU_TYPE_SHIFT; + + } else { + attr->type =3D PERF_TYPE_SOFTWARE; + } } return 0; } @@ -1108,6 +1117,7 @@ static int config_term_tracepoint(struct perf_event_a= ttr *attr, case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_SOFTWARE: default: if (err) { parse_events_error__handle(err, term->err_term, @@ -1242,6 +1252,7 @@ do { \ case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_SOFTWARE: default: break; } @@ -1296,6 +1307,7 @@ static int get_config_chgs(struct perf_pmu *pmu, stru= ct parse_events_terms *head case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_SOFTWARE: default: break; } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index e176a34ab088..c0a594827f4f 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -80,7 +80,8 @@ enum parse_events__term_type { PARSE_EVENTS__TERM_TYPE_RAW, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE, PARSE_EVENTS__TERM_TYPE_HARDWARE, -#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_HARDWARE + 1) + PARSE_EVENTS__TERM_TYPE_SOFTWARE, +#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_SOFTWARE + 1) }; =20 struct parse_events_term { diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 324b7dc8a0d3..a670d23ea9cc 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -117,12 +117,14 @@ do { \ yyless(0); \ } while (0) =20 -static int sym(yyscan_t scanner, int config) +static int sw(yyscan_t scanner, int config) { YYSTYPE *yylval =3D parse_events_get_lval(scanner); + char *text =3D parse_events_get_text(scanner); =20 - yylval->num =3D config; - return PE_VALUE_SYM_SW; + yylval->legacy_event.str =3D strdup(text); + yylval->legacy_event.num =3D config; + return PE_TERM_SW; } =20 static int term(yyscan_t scanner, enum parse_events__term_type type) @@ -138,8 +140,8 @@ static int hw(yyscan_t scanner, int config) YYSTYPE *yylval =3D parse_events_get_lval(scanner); char *text =3D parse_events_get_text(scanner); =20 - yylval->hardware_event.str =3D strdup(text); - yylval->hardware_event.num =3D config; + yylval->legacy_event.str =3D strdup(text); + yylval->legacy_event.num =3D config; return PE_TERM_HW; } =20 @@ -345,6 +347,18 @@ branch-instructions|branches { return hw(yyscanner, = PERF_COUNT_HW_BRANCH_INSTR branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } +cpu-clock { return sw(yyscanner, PERF_COUNT_SW_CPU_CLOCK); } +task-clock { return sw(yyscanner, PERF_COUNT_SW_TASK_CLOCK); } +page-faults|faults { return sw(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); } +minor-faults { return sw(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); } +major-faults { return sw(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } +context-switches|cs { return sw(yyscanner, PERF_COUNT_SW_CONTEXT_SWITCH= ES); } +cpu-migrations|migrations { return sw(yyscanner, PERF_COUNT_SW_CPU_MIGRA= TIONS); } +alignment-faults { return sw(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS)= ; } +emulation-faults { return sw(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS)= ; } +dummy { return sw(yyscanner, PERF_COUNT_SW_DUMMY); } +bpf-output { return sw(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); } +cgroup-switches { return sw(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES);= } r{num_raw_hex} { return str(yyscanner, PE_RAW); } r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } , { return ','; } @@ -400,18 +414,18 @@ branch-instructions|branches { return hw(yyscanner,= PERF_COUNT_HW_BRANCH_INSTR branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } -cpu-clock { return sym(yyscanner, PERF_COUNT_SW_CPU_CLOCK); } -task-clock { return sym(yyscanner, PERF_COUNT_SW_TASK_CLOCK); } -page-faults|faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); } -minor-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); } -major-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } -context-switches|cs { return sym(yyscanner, PERF_COUNT_SW_CONTEXT_SWITC= HES); } -cpu-migrations|migrations { return sym(yyscanner, PERF_COUNT_SW_CPU_MIGR= ATIONS); } -alignment-faults { return sym(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS= ); } -emulation-faults { return sym(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS= ); } -dummy { return sym(yyscanner, PERF_COUNT_SW_DUMMY); } -bpf-output { return sym(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); } -cgroup-switches { return sym(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES)= ; } +cpu-clock { return sw(yyscanner, PERF_COUNT_SW_CPU_CLOCK); } +task-clock { return sw(yyscanner, PERF_COUNT_SW_TASK_CLOCK); } +page-faults|faults { return sw(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); } +minor-faults { return sw(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); } +major-faults { return sw(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } +context-switches|cs { return sw(yyscanner, PERF_COUNT_SW_CONTEXT_SWITCH= ES); } +cpu-migrations|migrations { return sw(yyscanner, PERF_COUNT_SW_CPU_MIGRA= TIONS); } +alignment-faults { return sw(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS)= ; } +emulation-faults { return sw(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS)= ; } +dummy { return sw(yyscanner, PERF_COUNT_SW_DUMMY); } +bpf-output { return sw(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); } +cgroup-switches { return sw(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES);= } =20 {lc_type} { return str(yyscanner, PE_LEGACY_CACHE); } {lc_type}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); } diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index d2ef1890007e..4992a5bf3c44 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -55,7 +55,7 @@ static void free_list_evsel(struct list_head* list_evsel) %} =20 %token PE_START_EVENTS PE_START_TERMS -%token PE_VALUE PE_VALUE_SYM_SW PE_TERM +%token PE_VALUE PE_TERM %token PE_EVENT_NAME %token PE_RAW PE_NAME %token PE_MODIFIER_EVENT PE_MODIFIER_BP PE_BP_COLON PE_BP_SLASH @@ -63,9 +63,8 @@ static void free_list_evsel(struct list_head* list_evsel) %token PE_PREFIX_MEM %token PE_ERROR %token PE_DRV_CFG_TERM -%token PE_TERM_HW +%token PE_TERM_HW PE_TERM_SW %type PE_VALUE -%type PE_VALUE_SYM_SW %type PE_MODIFIER_EVENT %type PE_TERM %type PE_RAW @@ -101,8 +100,9 @@ static void free_list_evsel(struct list_head* list_evse= l) %destructor { free_list_evsel ($$); } %type tracepoint_name %destructor { free ($$.sys); free ($$.event); } -%type PE_TERM_HW -%destructor { free ($$.str); } +%type PE_TERM_HW +%type PE_TERM_SW +%destructor { free ($$.str); } =20 %union { @@ -117,10 +117,10 @@ static void free_list_evsel(struct list_head* list_ev= sel) char *sys; char *event; } tracepoint_name; - struct hardware_event { + struct legacy_event { char *str; u64 num; - } hardware_event; + } legacy_event; } %% =20 @@ -334,16 +334,17 @@ PE_TERM_HW sep_dc } =20 event_legacy_symbol: -PE_VALUE_SYM_SW '/' event_config '/' +PE_TERM_SW '/' event_config '/' { struct list_head *list; int err; =20 + free($1.str); list =3D alloc_list(); if (!list) YYNOMEM; err =3D parse_events_add_numeric(_parse_state, list, - /*type=3D*/PERF_TYPE_SOFTWARE, /*config=3D*/$1, + /*type=3D*/PERF_TYPE_SOFTWARE, /*config=3D*/$1.num, $3, /*wildcard=3D*/false); parse_events_terms__delete($3); if (err) { @@ -353,16 +354,17 @@ PE_VALUE_SYM_SW '/' event_config '/' $$ =3D list; } | -PE_VALUE_SYM_SW sep_slash_slash_dc +PE_TERM_SW sep_slash_slash_dc { struct list_head *list; int err; =20 + free($1.str); list =3D alloc_list(); if (!list) YYNOMEM; err =3D parse_events_add_numeric(_parse_state, list, - /*type=3D*/PERF_TYPE_SOFTWARE, /*config=3D*/$1, + /*type=3D*/PERF_TYPE_SOFTWARE, /*config=3D*/$1.num, /*head_config=3D*/NULL, /*wildcard=3D*/false); if (err) PE_ABORT(err); @@ -615,6 +617,11 @@ PE_TERM_HW { $$ =3D $1.str; } +| +PE_TERM_SW +{ + $$ =3D $1.str; +} =20 event_term: PE_RAW @@ -696,6 +703,20 @@ PE_TERM_HW $$ =3D term; } | +PE_TERM_SW +{ + struct parse_events_term *term; + int err =3D parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_SOFTWAR= E, + $1.str, $1.num & 255, /*novalue=3D*/false, + &@1, /*loc_val=3D*/NULL); + + if (err) { + free($1.str); + PE_ABORT(err); + } + $$ =3D term; +} +| PE_TERM '=3D' name_or_raw { struct parse_events_term *term; diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index b7ebac5ab1d1..ac1149658d9b 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1429,7 +1429,7 @@ static int pmu_config_term(const struct perf_pmu *pmu, break; case PARSE_EVENTS__TERM_TYPE_USER: /* Not hardcoded. */ return -EINVAL; - case PARSE_EVENTS__TERM_TYPE_NAME ... PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_NAME ... PARSE_EVENTS__TERM_TYPE_SOFTWARE: /* Skip non-config terms. */ break; default: @@ -1810,10 +1810,11 @@ int perf_pmu__for_each_format(struct perf_pmu *pmu,= void *state, pmu_format_call =20 /* * max-events and driver-config are missing above as are the internal - * types user, metric-id, raw, legacy cache and hardware. Assert against - * the enum parse_events__term_type so they are kept in sync. + * types user, metric-id, raw, legacy cache, hardware and + * software. Assert against the enum parse_events__term_type so they are + * kept in sync. */ - _Static_assert(ARRAY_SIZE(terms) =3D=3D __PARSE_EVENTS__TERM_TYPE_NR - 6, + _Static_assert(ARRAY_SIZE(terms) =3D=3D __PARSE_EVENTS__TERM_TYPE_NR - 7, "perf_pmu__for_each_format()'s terms must be kept in sync with en= um parse_events__term_type"); list_for_each_entry(format, &pmu->format, list) { perf_pmu_format__load(pmu, format); --=20 2.49.0.777.g153de2bbd5-goog From nobody Thu Dec 18 14:28:12 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 35D4D22B5A1 for ; Wed, 16 Apr 2025 04:51:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779098; cv=none; b=XdyhrD9DZaoOsh5FVqYXSCeFhZOu26XcyOEFgUO5ccZPQ0lP91cPFrsKw2JXojjcEFnriefrLdDzLhe6Hdg4SqaZjAdpK8etTD6pyP7DULMfsb2MWDpHnamuKjbALHNQc8lc+W8M9rgk3CikTnugOLkF39sOIlDDZK8TwwgZ0mY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744779098; c=relaxed/simple; bh=ZOTsHlfTpSL/Ly5DC6zov/N/ZrnqIeX3TnDUs6l3nhc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Mg8OFC55HHmOGkpp/5w8cMAYMRX39Ord2CySEj1KHSHz9GxcH4iqkORUD12XrP2Ba7tDg5kqkEeUs9cRzwAQzBmCw29uF0JXTO8xGSwfTt6sEiYybUfkehruXYVtLdBT4bNgsvK48fkATIBhJuysZFQoEUTNt8P6muObDGngDgM= 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=ALyIc9lm; arc=none smtp.client-ip=209.85.215.202 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ALyIc9lm" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-af91804dd0bso3889528a12.2 for ; Tue, 15 Apr 2025 21:51:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744779096; x=1745383896; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=qWGXJXdrT9sF0I7mA7+F4IJQ0dt51AALQlFzat3VGFk=; b=ALyIc9lmsya7hbSYBGhFkjjikTAy914pDgFnU+vAidHMd4d2elxqc8EAMz5nYh3BGI iqwNP0vXImDIjM51BSBBRre96DBO/MpOr/s4yM2HicNqHJZdI2pCehr3heRjT/h7g/4D ugtGFhMY2axdl86/xFeRmsDQS9A1ZmifdHJUaI1igchCciM6PfsdmGY3xP1l+E3RzuoD w1wE+F8CTxS/m+GFsVUc2VkKbkGiRF8KSpoSZ3rEqAmW7Lz0GaUjEOpArdqUhulv5oas ovZu9CYtDxSocOeINqhTCg6uOwFZn+HvvbN4oDHgqhoVem5sWyG3flp4VUnoWcfYqPhC ESrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744779096; x=1745383896; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=qWGXJXdrT9sF0I7mA7+F4IJQ0dt51AALQlFzat3VGFk=; b=qoCzTbEuLxpIiBXJgkPP3Hm/2akn1I9qbf3huwSIhltpGlIObZLmGyY7aeZj4wkWI2 8HpzV9iwFKFVzmFGSHGkUh+ZZ+5+aEsOkbJmzfn4oILhCZGgLqAj3U26l8UG6jwq3Z7F bYwiVfei06YN2c/lEhb0rb+ZW7u50FeUeMWZ2OAu+MW0B1wQI8oSre4zefgMUpm9TQlc Y2tlr+lAfIKgzci4az1Tnnr3N1XHEYmuDqUFfJXiFJL6QUAw/GOfcjFhisfIuU6N/Jjy M2sgy2ulzvgRazKcYytmYK+nY3XqsdzjgX0vA1ahb7MQsquu4UHp7qOZkmPYzQx3DmJW 0YWg== X-Forwarded-Encrypted: i=1; AJvYcCXPfl3qNspwVtwM7bMK/hwQq7FN4vj4wwpkQO8VWy1+pRt8a69fkxVgoTtOjFEQaISjYRu1DjTzJ8xvcz8=@vger.kernel.org X-Gm-Message-State: AOJu0YwJxijR6GYnPOTCkvWyLGcnSeU2RKIXgeNlCf8dywH0+SfU0a3z uaP2kYwH07Gv3bBbyFtdtxHg63d/iZeO+oukL18kuQGGNTIV6lT/zdnRuY7wV2mqRG/JlNIPGga 7AjxN3Q== X-Google-Smtp-Source: AGHT+IFzs+p393a7mxlM3r7qnHxaFIdEo/RP9id0OjOQIRti4PH7xmLH1y5HCxIonfQ1rdoHNlT/H3fbkkEy X-Received: from pjzz8.prod.google.com ([2002:a17:90b:58e8:b0:2fa:15aa:4d2b]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:6c4:b0:2fe:84d6:cdf9 with SMTP id 98e67ed59e1d1-3086415d88emr495438a91.26.1744779096558; Tue, 15 Apr 2025 21:51:36 -0700 (PDT) Date: Tue, 15 Apr 2025 21:51:17 -0700 In-Reply-To: <20250416045117.876775-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250416045117.876775-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.777.g153de2bbd5-goog Message-ID: <20250416045117.876775-5-irogers@google.com> Subject: [PATCH v8 4/4] perf perf_api_probe: Avoid scanning all PMUs, try software PMU first From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Ze Gao , Weilin Wang , Dominique Martinet , Jean-Philippe Romain , Junhao He , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Aditya Bodkhe , Leo Yan , Thomas Falcon , Atish Patra Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add PMU names when geting events to probe. The first is only ever used but by not specifying a PMU name perf_api_probe will load all the PMUs. Signed-off-by: Ian Rogers --- tools/perf/util/perf_api_probe.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/tools/perf/util/perf_api_probe.c b/tools/perf/util/perf_api_pr= obe.c index 1de3b69cdf4a..a910cde4d78b 100644 --- a/tools/perf/util/perf_api_probe.c +++ b/tools/perf/util/perf_api_probe.c @@ -59,10 +59,10 @@ static int perf_do_probe_api(setup_probe_fn_t fn, struc= t perf_cpu cpu, const cha =20 static bool perf_probe_api(setup_probe_fn_t fn) { - const char *try[] =3D {"cycles:u", "instructions:u", "cpu-clock:u", NULL}; + struct perf_pmu *pmu; struct perf_cpu_map *cpus; struct perf_cpu cpu; - int ret, i =3D 0; + int ret =3D 0; =20 cpus =3D perf_cpu_map__new_online_cpus(); if (!cpus) @@ -70,12 +70,23 @@ static bool perf_probe_api(setup_probe_fn_t fn) cpu =3D perf_cpu_map__cpu(cpus, 0); perf_cpu_map__put(cpus); =20 - do { - ret =3D perf_do_probe_api(fn, cpu, try[i++]); - if (!ret) - return true; - } while (ret =3D=3D -EAGAIN && try[i]); - + ret =3D perf_do_probe_api(fn, cpu, "software/cpu-clock/u"); + if (!ret) + return true; + + pmu =3D perf_pmus__scan_core(/*pmu=3D*/NULL); + if (pmu) { + const char *try[] =3D {"cycles", "instructions", NULL}; + char buf[256]; + int i =3D 0; + + while (ret =3D=3D -EAGAIN && try[i]) { + snprintf(buf, sizeof(buf), "%s/%s/u", pmu->name, try[i++]); + ret =3D perf_do_probe_api(fn, cpu, buf); + if (!ret) + return true; + } + } return false; } =20 --=20 2.49.0.777.g153de2bbd5-goog