From nobody Wed Dec 17 01:09:38 2025 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.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 D97B815C9 for ; Thu, 18 Jul 2024 00:30:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262649; cv=none; b=rgkRMenmoFuQQtWgnUs+xmF2z5KtRVzNN+eQEO65KSz5IBXIFfiHTIcgXdGF3erxgn6vP+NC2E+GZyWRHHj7+vPykXoOSoV0Qh4zoQEG4jkDtkXBbUNFzpzFtYOjPOplOsD+fgk79hQcstwvWd8KINVUgkWvIpwU3EI9EoFSE1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262649; c=relaxed/simple; bh=wsjyhZb/PdOtvGe00zDU9jMHxWauNU8sJZPK/PLxFSE=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=V70r0Z0+XsZ4MV/MYHBA+Tj1SdXs0gUYuzj8Bd+yaWR9rczIQzfJVYtB6gqpjFp8kAQ/8vVNwu0GVVJrug7erG5VIT5M1S2IXiqGPHFQ02nX2oB1JexSXe0/Ge9BlNty/kFMHWF7z51RNxfi/jeg5GdlduRcCZGFkJv9uzx+zK0= 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=UHFb7VYu; arc=none smtp.client-ip=209.85.128.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="UHFb7VYu" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-664ccf0659cso6022977b3.1 for ; Wed, 17 Jul 2024 17:30:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721262643; x=1721867443; 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=VIiZO/q4iRQZ7Xs1eg6KNaj9S7BXW+wk4oVE8PU2qN4=; b=UHFb7VYut2l2O7epFhM3AsZumfNy6wZpNH5qK6kzlfiw2cUaqEdEjOGiKw4T7YKGpi cGaIckt0uGBP2NwabwXEtTm3ErGp6+jwi1c0+M9n2qFQWDf2QS0EvihJdQDYiIxIp7ui zn0VjJp+Ff6xrGWH+Xe6AJO9KukX/FjIMW91osmQeeKRuQfaTL6h3w7e5/chK0g+PJvH ICpYQKth7DebUggOIFH2bTh0s0O+bKeYCOPPqroAUKR2a+J1gwBF5HRaX6yu/hfva42E d2Br9hBJTV9gses6ehtBb9XDnHSLVBjAwQOUAQhAPiq+FoE3lZDwLd0Df5Py+I8G28r0 HuKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721262643; x=1721867443; 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=VIiZO/q4iRQZ7Xs1eg6KNaj9S7BXW+wk4oVE8PU2qN4=; b=DUP1BTfI8yq5sLr99LktZ5++QQuJNfQULd46yca96eMiEUZoYuQbDBeFIB01AQHUmH Ugmb17g/AjEZ/Aluf7axNbkktmCpncsh2wMZDqt+dOOSqhLEc/IqwlkvrWb+/UEq3dc9 0PpbtasMwulABzXJepfnrb9sOyeL0KivzwrEEgN6eMwI5g8pVdJiZQ8gY9/G4Vpes+jL CL1lUzuBWWQqYQip7hBqguq2nNAGQWtRkMmSOyleSW3rKtRX4bBpVXh5gOKkV4ylO3+T eI0P6KMrgM5QluCxnOJTTe66E2lQxjwQQ3Q7EXVY4wHTVYwr1QmjlqqbKHLxwbAENqL0 BNdw== X-Forwarded-Encrypted: i=1; AJvYcCWFS6mTKDRDtswaOXB0SWS9LW89WfaQ4WZwqHmQFi1/RqvKVNT4AUW0hsMnaHh+8NEUKym+IiVkMK8a1+5f2yT9+45mwQmZl6p3jM1W X-Gm-Message-State: AOJu0YxwB4x/Ewk3v9UmY6QnuxwQ2iBIavxguTle0m/D3E8kQ8NvLZH9 XXSm7Y2Ax9StOj3+xyGeMc8kTcIHLCHfZxOpeNeT2CEk+FefQZNLSRU1/E5loTVDXkpxvTQ4NV+ z8dG2BQ== X-Google-Smtp-Source: AGHT+IFfCMOuGXsHSEr3d5WA2QSbUr56wtI1HaSDAsFZY391lNM3yJUpfl5fvsNEbjBjgupdMCKJtKHa3hdn X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:940b:9044:fa83:4060]) (user=irogers job=sendgmr) by 2002:a81:c704:0:b0:62d:1142:83a5 with SMTP id 00721157ae682-666044aeb61mr165797b3.8.1721262642639; Wed, 17 Jul 2024 17:30:42 -0700 (PDT) Date: Wed, 17 Jul 2024 17:30:20 -0700 In-Reply-To: <20240718003025.1486232-1-irogers@google.com> Message-Id: <20240718003025.1486232-2-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240718003025.1486232-1-irogers@google.com> X-Mailer: git-send-email 2.45.2.1089.g2a221341d9-goog Subject: [PATCH v2 1/6] perf pmu: Merge boolean sysfs event option parsing 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 , Bjorn Helgaas , Jonathan Corbet , James Clark , Ravi Bangoria , Dominique Martinet , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Dhananjay Ugwekar , ananth.narayan@amd.com, gautham.shenoy@amd.com, kprateek.nayak@amd.com, sandipan.das@amd.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Merge perf_pmu__parse_per_pkg and perf_pmu__parse_snapshot that do the same parsing except for the file suffix used. Signed-off-by: Ian Rogers --- tools/perf/util/pmu.c | 47 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 986166bc7c78..5148b6639dd3 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -367,8 +367,8 @@ static int perf_pmu__parse_unit(struct perf_pmu *pmu, s= truct perf_pmu_alias *ali return -1; } =20 -static int -perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct perf_pmu_alias *alias) +static bool perf_pmu__parse_event_source_bool(const char *pmu_name, const = char *event_name, + const char *suffix) { char path[PATH_MAX]; size_t len; @@ -376,37 +376,36 @@ perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct = perf_pmu_alias *alias) =20 len =3D perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); if (!len) - return 0; - scnprintf(path + len, sizeof(path) - len, "%s/events/%s.per-pkg", pmu->na= me, alias->name); + return false; + + scnprintf(path + len, sizeof(path) - len, "%s/events/%s.%s", pmu_name, ev= ent_name, suffix); =20 fd =3D open(path, O_RDONLY); if (fd =3D=3D -1) - return -1; + return false; =20 - close(fd); +#ifndef NDEBUG + { + char buf[8]; =20 - alias->per_pkg =3D true; - return 0; + len =3D read(fd, buf, sizeof(buf)); + assert(len =3D=3D 1 || len =3D=3D 2); + assert(buf[0] =3D=3D '1'); + } +#endif + + close(fd); + return true; } =20 -static int perf_pmu__parse_snapshot(struct perf_pmu *pmu, struct perf_pmu_= alias *alias) +static void perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct perf_pmu_= alias *alias) { - char path[PATH_MAX]; - size_t len; - int fd; - - len =3D perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); - if (!len) - return 0; - scnprintf(path + len, sizeof(path) - len, "%s/events/%s.snapshot", pmu->n= ame, alias->name); - - fd =3D open(path, O_RDONLY); - if (fd =3D=3D -1) - return -1; + alias->per_pkg =3D perf_pmu__parse_event_source_bool(pmu->name, alias->na= me, "per-pkg"); +} =20 - alias->snapshot =3D true; - close(fd); - return 0; +static void perf_pmu__parse_snapshot(struct perf_pmu *pmu, struct perf_pmu= _alias *alias) +{ + alias->snapshot =3D perf_pmu__parse_event_source_bool(pmu->name, alias->n= ame, "snapshot"); } =20 /* Delete an alias entry. */ --=20 2.45.2.1089.g2a221341d9-goog From nobody Wed Dec 17 01:09:38 2025 Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.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 52000B66F for ; Thu, 18 Jul 2024 00:30:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262647; cv=none; b=D+sXIUbng0mSHMuGAlANlbJTjc1Ay5MdcrOei52r4mdHxtD85Ib/809WgvESpDJ5OPBzno2PXH5pFvnNGwtlSkNbMJP99Sh0WPbRObdgfUvw8f/muQVz9HqBc/XdgdVxPY/5Dh0fU74izNv8Jnl0p6gZhsxEfG6jinN1jtBSEr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262647; c=relaxed/simple; bh=vuwys3K/PQPhgggx+tj8r4FNVlkm6yntFgCi4rPb+vk=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=X8nZYiaH4Xxi87tx/69JtK+4zM2I4FUhpZVIz4k+PFJi7Ea3xf/nwK51ZSK6q6aDzBJaz206CRnYYQXdA1ZdGSdziKztnChF9w9SDP7VRydOh3p2F+a1Y2VgefnosqH0uLBfh4TrRZL5FzrhmKYrItzHNYTfLlXQeVgaWooFMWs= 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=SmQ6Q7kF; arc=none smtp.client-ip=209.85.128.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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SmQ6Q7kF" Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-664fc7c4e51so4578097b3.3 for ; Wed, 17 Jul 2024 17:30:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721262645; x=1721867445; 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=N65oyWVRY7b5fCUl5B9UBHpg82AXZoHzAgm4Amx1vhc=; b=SmQ6Q7kFybY3+Z1WUdWKVEgmtxoRg6dYVXerQD9MiIDKy5yycR9xaB6LYdR2XYKbZZ YQqz0qn1Bbja7YGEAIAKPMp2ZauPMQjL5OrS/BBn+RbOBi/5H1IzRq0BsIFzdnvRtAze 2pWAsWbDxitOLKl5nsA482gNPtZGuM9QPgluslKOxtXZ74wIjgFG7MFpR1NORP60g+jV MdraloXqz8GhqP9EFov6RBTjRBqS+xHLyHQHs3y1plDbyktcIE1NLLrkLYAXahxkM2hI io/DTAr6aerNPqK6CRqQ3dmGylDllKSRVeGjWwYCvaXGucEyfd5OaTzsU2n9Dw6ICTVO m4vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721262645; x=1721867445; 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=N65oyWVRY7b5fCUl5B9UBHpg82AXZoHzAgm4Amx1vhc=; b=nVKtoyPdNfojjbbbhyIz3Ov9O4XNlowQyrGDxseMBVei9urX3gnvLgJ83ZhxzXnCjF Ov1qmKGyL+b304hOiPWJK38Yei/V17psSQLGR+MBM/TAKq6k2dP9QH+jAowSdaq9mPQd fx1Ha8sdjRrOQNnx5AJvKzf9QuwoWHoaNM1Z6GQkoLnM7Z1YNEyiA1t2Z82rTctLoWOp QImbWSMQVxCN1m17JaCYF72tJuczTpifnFuedMMZyY4JrtHfJ7nGOtpjb4Xlwhf7+Ja2 dlGBXc1b8J8I29HZxR2zx8lzYF79uCv60Xpbl4hsuTGQeZh4nFItK0CQjOh+Ar/Syrzn swdg== X-Forwarded-Encrypted: i=1; AJvYcCVraFT/zrk96ZqE5CLhkukodkPSjdhhQjXcuPIydfxU56HnmyG5ZAceZdDYxej/5DwB7SBo6eK/WxV58nAfPLk1qfn6VtZVh1UuVxNI X-Gm-Message-State: AOJu0Yx+ULPOs7/OVfQoC7HneqWer58lf5UhJ+wRHo99yRFqGFccDtDW aO66TVYy8RLOk8HE38Py35DknsAFeCtDQDHvQKpdrNWIe6MXqiP+r4ZK7weAl2qPhBNWUnXBMHN hxpYytQ== X-Google-Smtp-Source: AGHT+IHIMq5cuOtpe99i9/VfABCqMAYjXYL4ce0yS7sypzVC8xSF817NvE8VUA6yYx0BwM0GPvB3U/eqWK0+ X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:940b:9044:fa83:4060]) (user=irogers job=sendgmr) by 2002:a05:690c:fce:b0:666:e184:4dfe with SMTP id 00721157ae682-666e1845003mr78227b3.6.1721262645328; Wed, 17 Jul 2024 17:30:45 -0700 (PDT) Date: Wed, 17 Jul 2024 17:30:21 -0700 In-Reply-To: <20240718003025.1486232-1-irogers@google.com> Message-Id: <20240718003025.1486232-3-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240718003025.1486232-1-irogers@google.com> X-Mailer: git-send-email 2.45.2.1089.g2a221341d9-goog Subject: [PATCH v2 2/6] perf parse-events: Pass cpu_list as a perf_cpu_map in __add_event 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 , Bjorn Helgaas , Jonathan Corbet , James Clark , Ravi Bangoria , Dominique Martinet , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Dhananjay Ugwekar , ananth.narayan@amd.com, gautham.shenoy@amd.com, kprateek.nayak@amd.com, sandipan.das@amd.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Previously the cpu_list is a string and typically no cpu_list is passed to __add_event. Wanting to make events have their cpus distinct from the PMU means that in more occassions we want to pass a cpu_list. If we're reading this from sysfs it is easier to read a perf_cpu_map than allocate and pass around strings that will later be parsed. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 321586fb5556..43501eb56336 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -227,12 +227,12 @@ __add_event(struct list_head *list, int *idx, bool init_attr, const char *name, const char *metric_id, struct perf_pmu *pmu, struct list_head *config_terms, bool auto_merge_stats, - const char *cpu_list) + struct perf_cpu_map *cpu_list) { struct evsel *evsel; - struct perf_cpu_map *cpus =3D pmu ? perf_cpu_map__get(pmu->cpus) : - cpu_list ? perf_cpu_map__new(cpu_list) : NULL; + struct perf_cpu_map *cpus =3D perf_cpu_map__is_empty(cpu_list) && pmu ? p= mu->cpus : cpu_list; =20 + cpus =3D perf_cpu_map__get(cpus); if (pmu) perf_pmu__warn_invalid_formats(pmu); =20 @@ -305,16 +305,17 @@ static int add_event_tool(struct list_head *list, int= *idx, .type =3D PERF_TYPE_SOFTWARE, .config =3D PERF_COUNT_SW_DUMMY, }; - const char *cpu_list =3D NULL; + struct perf_cpu_map *cpu_list =3D NULL; =20 if (tool_event =3D=3D PERF_TOOL_DURATION_TIME) { /* Duration time is gathered globally, pretend it is only on CPU0. */ - cpu_list =3D "0"; + cpu_list =3D perf_cpu_map__new("0"); } evsel =3D __add_event(list, idx, &attr, /*init_attr=3D*/true, /*name=3D*/= NULL, /*metric_id=3D*/NULL, /*pmu=3D*/NULL, /*config_terms=3D*/NULL, /*auto_merge_stats=3D*/false, cpu_list); + perf_cpu_map__put(cpu_list); if (!evsel) return -ENOMEM; evsel->tool_event =3D tool_event; --=20 2.45.2.1089.g2a221341d9-goog From nobody Wed Dec 17 01:09:38 2025 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.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 781B5C148 for ; Thu, 18 Jul 2024 00:30:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262650; cv=none; b=qdfFLizH+uOxVqOAMeflDnwSJWSSE1Lc2GndkiWHYjAmCV48j9/ygRBcK5T3O9cyD1jgSK8GZLxIPwv26NBo/65PlZ7brFSVyvBI4m4g/IapQPkcrx6//B48/uxQX5EREWJDl95U5ORkz7J5DiuW4vtijyLGrOiK+eylGkOJtm4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262650; c=relaxed/simple; bh=80YyIwk/8VkjU4yqstE1PlbqioOpSQzgF7vZUjQSVCE=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=LCQpbqjEapOcGWXvMQIiTiL6SZgqdKFmc4Kg2tKSUdJ+hne08frSXtPz/n/+2YihTE25QH/THje+LD55pJPOn3WZfEs+eEMerR5g+fRUDOGTI42KuxFwCIa3AFwcDKemYr3ovY8okwr5ZAdmTEH0DrKIFOk6zpRjI57Uy7FL7Bo= 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=XPGSTcs9; arc=none smtp.client-ip=209.85.128.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="XPGSTcs9" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-6522c6e5ed9so6052447b3.0 for ; Wed, 17 Jul 2024 17:30:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721262647; x=1721867447; 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=gDSkmz2B6LUpQkGELdRI3zhIL2uXO0hylwMkxD4wWcI=; b=XPGSTcs9oEovpu+c75CYIvQFf+5TEJG2W6tRXaI+Q+LBja+qjrQFzf6fQKM7a/aI6k 96QS5xevZdD24OcjipZ23N15Xi0ER8aBSnMIp9OZ3XU6b3JH3zDv6LLN9TNiLDa/kfjC F6VaelwvWa7AXexWXLWPjyIB/Ac7y+Ud3s1BWPpgScnxn/SMChEg4QKmwobCu/a4K2oH anWGmkjIVhRiXY75y2CD2wQsPTTbn5tYeFtzk62synIx7q2hAjBX6lOH1gpgZ6euETPm GiAZRFhPgLg7jtsiCEWJxFuMX2K8lQVD9sZjbXipWxx5z0+SSM8zVoCyfYe5C/dTIODA rhkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721262647; x=1721867447; 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=gDSkmz2B6LUpQkGELdRI3zhIL2uXO0hylwMkxD4wWcI=; b=XhRJZInH68UVbd7QX56kAwWtToE9LSYJrQ5AgzbZV3IezlEzWvrrPibJpdRJJ+dcZp A57/xiBcY5ZHwbbotcGD/L2BktGJuFUkn8AGxAsxciBUf05BGqfVP7j9me4f25LGFSWo x5ny2VjoWf1mqe7gsy3eME435YTanogDnK3uG5mw53yhJnM8sjfVOK8Na/3KFMbaiS38 v7SokrV5ivntLzMxwGjYyFfy7kSI/ywOJVb/uNw2TRzxOAhJv2RQzlo++0B+U9QZ5zRD AScgnD5mdH0WGeiVq85/R6zAJnL74WKsM5UkYwlHkIEpOoU4WpIwW/WurdnyqrgKuHNM C5kA== X-Forwarded-Encrypted: i=1; AJvYcCV2vpFYQNfly3n0TPspfk64KrRvc/aqG1uch3+QJ6I7nF9fUj/1+9T44WtqaDC5mfz4vnyNxtsl1Zjkp004mfAD8ExfQng0Vqi3y5dQ X-Gm-Message-State: AOJu0YynGibsKl2aiGomaCCMdmca1/f436JUpdEmi+x/xT9r+PqojtrC 6Hclo+7uxKcekYZajCfP8X6ahi8DZHsZSYKN5MgpueZiEFDqgJu9TjXFj4B4IDs029MQgi1+aF9 oMPybjA== X-Google-Smtp-Source: AGHT+IH1DzVbGdCGf8iHYG86fAS44PcWG5nVWkwtb0soiT/pdpCH02hy1TkeYGYlcEMSjompVQrf1VmgRxIm X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:940b:9044:fa83:4060]) (user=irogers job=sendgmr) by 2002:a25:a2c4:0:b0:e03:39fb:5729 with SMTP id 3f1490d57ef6-e05fedaf378mr1994276.10.1721262647487; Wed, 17 Jul 2024 17:30:47 -0700 (PDT) Date: Wed, 17 Jul 2024 17:30:22 -0700 In-Reply-To: <20240718003025.1486232-1-irogers@google.com> Message-Id: <20240718003025.1486232-4-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240718003025.1486232-1-irogers@google.com> X-Mailer: git-send-email 2.45.2.1089.g2a221341d9-goog Subject: [PATCH v2 3/6] perf pmu: Add support for event.cpus files in sysfs 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 , Bjorn Helgaas , Jonathan Corbet , James Clark , Ravi Bangoria , Dominique Martinet , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Dhananjay Ugwekar , ananth.narayan@amd.com, gautham.shenoy@amd.com, kprateek.nayak@amd.com, sandipan.das@amd.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If an event file exists in sysfs, check if a event.cpus file exists and read a perf_cpu_map from it if it does. This allows particular events to have a different set of CPUs compared to the PMU. One scenario where this could be useful is when a PMU is set up with a cpumask/events per SMT thread but some events record for all SMT threads. Programming an event on each SMT thread will cause unnecessary counters to be programmed and the aggregate value to be too large. Another scenario where this could be useful if when a PMU has historically had a cpumask at the package level, but now newer per die, core or CPU information is available. Additional context for the motivation is in these patches and conversation: https://lore.kernel.org/lkml/20240711102436.4432-1-Dhananjay.Ugwekar@amd.co= m/ Signed-off-by: Ian Rogers --- .../sysfs-bus-event_source-devices-events | 14 ++++++ tools/perf/util/parse-events.c | 45 ++++++++++--------- tools/perf/util/pmu.c | 44 +++++++++++++++++- tools/perf/util/pmu.h | 1 + 4 files changed, 82 insertions(+), 22 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-event= s b/Documentation/ABI/testing/sysfs-bus-event_source-devices-events index e7efeab2ee83..d8e3a4dd3ba7 100644 --- a/Documentation/ABI/testing/sysfs-bus-event_source-devices-events +++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-events @@ -70,6 +70,20 @@ Description: Per-pmu performance monitoring events speci= fic to the running syste This is referred to as "event parameterization". Event parameters have the format 'param=3D?'. =20 +What: /sys/bus/event_source/devices//events/.cpus +Date: 2024/07/17 +Contact: Linux kernel mailing list +Description: Perf event CPUs + + A list of CPUs on which a the perf event should be + opened by default. This is an event specific variant + of /sys/bus/event_source/devices//cpumask. + + Examples (each of these lines would be in a separate file): + + 0,2,4,6 + 0-7 + What: /sys/bus/event_source/devices//events/.unit Date: 2014/02/24 Contact: Linux kernel mailing list diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 43501eb56336..b181f83c9678 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1425,12 +1425,13 @@ static int parse_events_add_pmu(struct parse_events= _state *parse_state, bool auto_merge_stats) { struct perf_event_attr attr; - struct perf_pmu_info info; + struct perf_pmu_info info =3D {}; struct evsel *evsel; struct parse_events_error *err =3D parse_state->error; LIST_HEAD(config_terms); struct parse_events_terms parsed_terms; bool alias_rewrote_terms =3D false; + int ret =3D 0; =20 if (verbose > 1) { struct strbuf sb; @@ -1465,8 +1466,7 @@ static int parse_events_add_pmu(struct parse_events_s= tate *parse_state, =20 parse_events_terms__init(&parsed_terms); if (const_parsed_terms) { - int ret =3D parse_events_terms__copy(const_parsed_terms, &parsed_terms); - + ret =3D parse_events_terms__copy(const_parsed_terms, &parsed_terms); if (ret) return ret; } @@ -1474,15 +1474,15 @@ static int parse_events_add_pmu(struct parse_events= _state *parse_state, =20 /* Configure attr/terms with a known PMU, this will set hardcoded terms. = */ if (config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu= )) { - parse_events_terms__exit(&parsed_terms); - return -EINVAL; + ret =3D -EINVAL; + goto out_err; } =20 /* Look for event names in the terms and rewrite into format based terms.= */ if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, &parsed_terms, &info, &alias_rewrote_terms, err)) { - parse_events_terms__exit(&parsed_terms); - return -EINVAL; + ret =3D -EINVAL; + goto out_err; } =20 if (verbose > 1) { @@ -1497,13 +1497,13 @@ static int parse_events_add_pmu(struct parse_events= _state *parse_state, /* Configure attr/terms again if an alias was expanded. */ if (alias_rewrote_terms && config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu= )) { - parse_events_terms__exit(&parsed_terms); - return -EINVAL; + ret =3D -EINVAL; + goto out_err; } =20 if (get_config_terms(&parsed_terms, &config_terms)) { - parse_events_terms__exit(&parsed_terms); - return -ENOMEM; + ret =3D -ENOMEM; + goto out_err; } =20 /* @@ -1512,24 +1512,23 @@ static int parse_events_add_pmu(struct parse_events= _state *parse_state, */ if (pmu->perf_event_attr_init_default && get_config_chgs(pmu, &parsed_terms, &config_terms)) { - parse_events_terms__exit(&parsed_terms); - return -ENOMEM; + ret =3D -ENOMEM; + goto out_err; } =20 if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, &parsed_terms, parse_state->error)) { - free_config_terms(&config_terms); - parse_events_terms__exit(&parsed_terms); - return -EINVAL; + ret =3D -EINVAL; + goto out_err; } =20 evsel =3D __add_event(list, &parse_state->idx, &attr, /*init_attr=3D*/tru= e, get_config_name(&parsed_terms), get_config_metric_id(&parsed_terms), pmu, - &config_terms, auto_merge_stats, /*cpu_list=3D*/NULL); + &config_terms, auto_merge_stats, info.cpus); if (!evsel) { - parse_events_terms__exit(&parsed_terms); - return -ENOMEM; + ret =3D -ENOMEM; + goto out_err; } =20 if (evsel->name) @@ -1542,13 +1541,17 @@ static int parse_events_add_pmu(struct parse_events= _state *parse_state, return 0; } =20 - parse_events_terms__exit(&parsed_terms); free((char *)evsel->unit); evsel->unit =3D strdup(info.unit); evsel->scale =3D info.scale; evsel->per_pkg =3D info.per_pkg; evsel->snapshot =3D info.snapshot; - return 0; +out_err: + parse_events_terms__exit(&parsed_terms); + if (ret) + free_config_terms(&config_terms); + perf_cpu_map__put(info.cpus); + return ret; } =20 int parse_events_multi_pmu_add(struct parse_events_state *parse_state, diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 5148b6639dd3..280b2499c861 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -73,6 +73,11 @@ struct perf_pmu_alias { * differ from the PMU name as it won't have suffixes. */ char *pmu_name; + /** + * @cpus: A possible per-event cpumap that overrides that given for the + * PMU. + */ + struct perf_cpu_map *cpus; /** @unit: Units for the event, such as bytes or cache lines. */ char unit[UNIT_MAX_LEN+1]; /** @scale: Value to scale read counter values by. */ @@ -332,6 +337,32 @@ static int perf_pmu__parse_scale(struct perf_pmu *pmu,= struct perf_pmu_alias *al return ret; } =20 +static void perf_pmu__parse_cpus(struct perf_pmu *pmu, struct perf_pmu_ali= as *alias) +{ + char path[PATH_MAX]; + size_t len; + FILE *file; + int fd; + + len =3D perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); + if (!len) + return; + scnprintf(path + len, sizeof(path) - len, "%s/events/%s.cpus", pmu->name,= alias->name); + + fd =3D open(path, O_RDONLY); + if (fd =3D=3D -1) + return; /* Expected common case. */ + + file =3D fdopen(fd, "r"); + if (!file) { + close(fd); + return; + } + + alias->cpus =3D perf_cpu_map__read(file); + fclose(file); +} + static int perf_pmu__parse_unit(struct perf_pmu *pmu, struct perf_pmu_alia= s *alias) { char path[PATH_MAX]; @@ -493,6 +524,7 @@ static void read_alias_info(struct perf_pmu *pmu, struc= t perf_pmu_alias *alias) /* * load unit name and scale if available */ + perf_pmu__parse_cpus(pmu, alias); perf_pmu__parse_unit(pmu, alias); perf_pmu__parse_scale(pmu, alias); perf_pmu__parse_per_pkg(pmu, alias); @@ -618,7 +650,7 @@ static inline bool pmu_alias_info_file(const char *name) size_t len; =20 len =3D strlen(name); - if (len > 5 && !strcmp(name + len - 5, ".unit")) + if (len > 5 && (!strcmp(name + len - 5, ".cpus") || !strcmp(name + len - = 5, ".unit"))) return true; if (len > 6 && !strcmp(name + len - 6, ".scale")) return true; @@ -1560,6 +1592,12 @@ static int check_info_data(struct perf_pmu *pmu, * define unit, scale and snapshot, fail * if there's more than one. */ + if (!perf_cpu_map__is_empty(info->cpus) && !perf_cpu_map__is_empty(alias-= >cpus)) { + parse_events_error__handle(err, column, + strdup("Attempt to set event's cpus twice"), + NULL); + return -EINVAL; + } if (info->unit && alias->unit[0]) { parse_events_error__handle(err, column, strdup("Attempt to set event's unit twice"), @@ -1579,6 +1617,9 @@ static int check_info_data(struct perf_pmu *pmu, return -EINVAL; } =20 + if (!perf_cpu_map__is_empty(alias->cpus)) + info->cpus =3D perf_cpu_map__get(alias->cpus); + if (alias->unit[0]) info->unit =3D alias->unit; =20 @@ -1610,6 +1651,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struc= t parse_events_terms *head_ * Mark unit and scale as not set * (different from default values, see below) */ + info->cpus =3D NULL; info->unit =3D NULL; info->scale =3D 0.0; info->snapshot =3D false; diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index b2d3fd291f02..b1ccfe8d3df4 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -177,6 +177,7 @@ struct perf_pmu { extern struct perf_pmu perf_pmu__fake; =20 struct perf_pmu_info { + struct perf_cpu_map *cpus; const char *unit; double scale; bool per_pkg; --=20 2.45.2.1089.g2a221341d9-goog From nobody Wed Dec 17 01:09:38 2025 Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.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 9BCD61B86F6 for ; Thu, 18 Jul 2024 00:30:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262652; cv=none; b=kpj7APSu1L9QjR+cnJhLIkTDJumCR6mF81HtCjEfydrTmt2VdYq4xeHUfEmsM71iapj12pL4gffr8ahWj9aGplx/MJfu6j9MzBGcZdn1dac6gYMansQG/fLO7eVkkXdHPylco1gm6iJkHbFzsf3zbirW/dFlKCknJx0E624Bgmo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262652; c=relaxed/simple; bh=xO1LeDUwAlVEwZnVaFmHHPJ2GZce6TEJ/S7/OdCC7Zg=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=u2+RivIao6Trg6m2hgD4O8lZUEHPe26WSEtFSTZt6GAn8rE16rLE6BrX0iw0FjfA1sanGmNBiCi1I6xH7Gu0qs0ArbOyrk9GOnMY4yeON40J7j6VOPshWHMLyJj78e0+nQiJ1nwqT4wRxZ2b6npPUIjAuusViQVZ4Bh6XohKXr0= 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=RlSsjkxc; arc=none smtp.client-ip=209.85.128.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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="RlSsjkxc" Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-6506bfeaf64so4569597b3.1 for ; Wed, 17 Jul 2024 17:30:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721262650; x=1721867450; 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=rpNlJN2SGII3MYeevUlf4p1OQiPVTTvbXe1jkW5mOAw=; b=RlSsjkxcC/IRWN0WwacEwBho1lsHj484vVq20I8wgxjlpySQ7KdgFFm9QetjsWq4TT DcnnRzOrrfuoA7vrUtvT1DWxmOfVDBefQBvrFAWDe/QHWbmnIZkP1R/4qa8Q9EqhnioR j4f/sAOE74MPaFb1fPF2EGLmdaj8TpGUU8aHebIbt/5+kuLKgRwImR+N3+GuN1fDbFA3 7eIyQxpYoFyK80Q3B3Y0xBD0Mc8kjUCeY/KmJ4EzbnhBrTtG6soLkCu8/tkNnMIDfTeH QpaIvz/LUSBvOIx1yE2fkk25QZr4qQRXGyDv9KRwoZCOVSYN8774EdGu4GVD8Gru8/rh wwEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721262650; x=1721867450; 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=rpNlJN2SGII3MYeevUlf4p1OQiPVTTvbXe1jkW5mOAw=; b=U7+b4zaf90megdZj0wadeldQjVsCJINXJ/dbWtqIgY5anPCCNNDGkephfu8/tcdH44 l6kPSj8zNP9B1R9k2bQAP5wnvOHeGV17zjAVGxQ0lUketLTS3bl8w1LJG+PuOgFc4le0 BCe+mkssqjr1kvggiutqhUygYYIIr3oSOAheGssaH7RlZscvcK4/hul2pLIvtU2bAitd e+0mC+uScCC8/KWCJ2TJHDRIeMwEEhdnL1e7W3wN5eH9FEYQugJnVpR3c6IUoIlJ7ZgL nmYpSs5bULs+N3S4uX68/bd2cI3e/OAZLmpov/V/H5imHk/YAFzFquM0TfJd0ZSPe1RI 3rZA== X-Forwarded-Encrypted: i=1; AJvYcCX9oifC/cr64krSzfnOvEg0PTcgIZloxtOUYKFaK2N5TJldjMzsAEwbc5etNbBrl2Olz9B1jyBUTF0XCGugwM7wJWfVao7FwXIu2xdu X-Gm-Message-State: AOJu0YzHi8QEdMJRT0NUniQmq1i89bRHm0+qa3nUa/ncnDkwqyqUE+Au Adwkp/98bgxHqsmTNIcbnqcwG/RE11SssQTGjqgOHqBJwafrFxAblNkTQcB3TLK9mmzgBt8Sawb DhVrd0w== X-Google-Smtp-Source: AGHT+IGG7VWzTnmycXmTdJphblM+hhP0c4L9vMl9r5mE9Xw5+miKnxk+TogRA/6By5AIKP4LV8790tNifGhm X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:940b:9044:fa83:4060]) (user=irogers job=sendgmr) by 2002:a05:690c:289:b0:62c:ff73:83f with SMTP id 00721157ae682-666040ccaedmr396737b3.8.1721262649825; Wed, 17 Jul 2024 17:30:49 -0700 (PDT) Date: Wed, 17 Jul 2024 17:30:23 -0700 In-Reply-To: <20240718003025.1486232-1-irogers@google.com> Message-Id: <20240718003025.1486232-5-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240718003025.1486232-1-irogers@google.com> X-Mailer: git-send-email 2.45.2.1089.g2a221341d9-goog Subject: [PATCH v2 4/6] libperf cpumap: Add ability to create CPU from a single CPU number 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 , Bjorn Helgaas , Jonathan Corbet , James Clark , Ravi Bangoria , Dominique Martinet , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Dhananjay Ugwekar , ananth.narayan@amd.com, gautham.shenoy@amd.com, kprateek.nayak@amd.com, sandipan.das@amd.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add perf_cpu_map__new_int so that a CPU map can be created from a single integer. Signed-off-by: Ian Rogers --- tools/lib/perf/cpumap.c | 10 ++++++++++ tools/lib/perf/include/perf/cpumap.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/tools/lib/perf/cpumap.c b/tools/lib/perf/cpumap.c index cae799ad44e1..2c8e36d0efaa 100644 --- a/tools/lib/perf/cpumap.c +++ b/tools/lib/perf/cpumap.c @@ -293,6 +293,16 @@ struct perf_cpu_map *perf_cpu_map__new(const char *cpu= _list) return cpus; } =20 +struct perf_cpu_map *perf_cpu_map__new_int(int cpu) +{ + struct perf_cpu_map *cpus =3D perf_cpu_map__alloc(1); + + if (cpus) + RC_CHK_ACCESS(cpus)->map[0].cpu =3D cpu; + + return cpus; +} + static int __perf_cpu_map__nr(const struct perf_cpu_map *cpus) { return RC_CHK_ACCESS(cpus)->nr; diff --git a/tools/lib/perf/include/perf/cpumap.h b/tools/lib/perf/include/= perf/cpumap.h index 90457d17fb2f..79ed3449d288 100644 --- a/tools/lib/perf/include/perf/cpumap.h +++ b/tools/lib/perf/include/perf/cpumap.h @@ -37,6 +37,8 @@ LIBPERF_API struct perf_cpu_map *perf_cpu_map__new_online= _cpus(void); * perf_cpu_map__new_online_cpus is returned. */ LIBPERF_API struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list); +/** perf_cpu_map__new_int - create a map with the one given cpu. */ +LIBPERF_API struct perf_cpu_map *perf_cpu_map__new_int(int cpu); LIBPERF_API struct perf_cpu_map *perf_cpu_map__read(FILE *file); LIBPERF_API struct perf_cpu_map *perf_cpu_map__get(struct perf_cpu_map *ma= p); LIBPERF_API struct perf_cpu_map *perf_cpu_map__merge(struct perf_cpu_map *= orig, --=20 2.45.2.1089.g2a221341d9-goog From nobody Wed Dec 17 01:09:38 2025 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.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 F1A6F28399 for ; Thu, 18 Jul 2024 00:30:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262655; cv=none; b=T9rLfFQ/5n/oQrqtFJG/sibOMayr/7IRTDEXWARatlG83FSn8s3MgaOhoiMdn+sTwuaqXKgmUqRESqAfU12I3vXFyyPuEiI6iZR8lYWj0HPnj5JHWKW8IyOzE5S0k290kiEIYcIWtomkqdXBvVKXWBTjlkpeAnJWP0VdaC5SUcg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262655; c=relaxed/simple; bh=vXnQhbin+nQKx7EvHi/dTqGLgSRRVMsSgXeOitPIA0Q=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=Ixug2ZRN4RKJVNTfLQCf0J3yDw+N6nvj07tqedkZ4W0FbgGV170bB5KULEJpam67TH/W475exGcbbqjYhy1V1ZuE4Huv0njGqFCxXMOCQK+2WAjUpWAJ7kgN9HjJYz/1wMVY1WAIhEoCU1+InmXz/m1JTkyrEFdQGcq9g20pCvs= 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=u7rHSmlX; arc=none smtp.client-ip=209.85.219.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="u7rHSmlX" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-e05e410d310so577225276.2 for ; Wed, 17 Jul 2024 17:30:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721262652; x=1721867452; 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=07dbUcOHVzfNvgP42n0WKJm07xg7m6Zt3c+s/XZJ4AY=; b=u7rHSmlXym/YvS4/0TCxeHHy0H0fTptRya3pnrZ1ovoI79j6bRxRQhDIncEIWu/r57 Ghb2JX7j5KXXTQtdpGlmE60ayQyJxvgraskLVC4T1D56oZzxm3KhOSZCJ32oIRjWkHbW eRleYcm1LKs8HaSsI66O7XZEPgKtORi4y0AqrlMUNDV8XsMtfZktvPhxdrfWuVE0bvMA LNm1h4SDrQmXCT6SeTNbdJ4yVJVDZFp59f6WGAcqEKM7zUcXVS7qXgqf9q0AXKR5xgNJ WTBdqbD6+kC7B+X5WitAIMlsRBkZiaZAf2xhQ1PjjzKhLY7i6h0oZwFgxVqVKan+ZyD5 Zr/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721262652; x=1721867452; 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=07dbUcOHVzfNvgP42n0WKJm07xg7m6Zt3c+s/XZJ4AY=; b=NbWKKIVgSAA2YKWlJS6bykV4OT4KA1/l2nncnT5BQ+Srn5D22IyhX6MyymWjC29USY SQR0znm8lBNq1sqAs4aaIHyekEWxobZzKMoF1KeAqpiGUb0dmDwvwRFioLRxiTOsfIiV jDopjwctm6t6zoi2aAojyN/dTfyVz94cwJYOVJar3sdJ62m8zepJFmWpit2Z62rMwR7H MOfil7m6KBskdsREbTKAfvt1dS73ElERTcJ89omzBlcIQpbJgGVG4YTVH7VKrNiyAZy/ tcFGDR6nvKBvLWUCt/3qReyuOa2cD3P2Tug75Qqm/V+0SDcAbbC9kkTb5D8To68bcSQk H71A== X-Forwarded-Encrypted: i=1; AJvYcCUsc6NW6MiGYfImv4o5GWotvPUPO6btG+SlMwA7IQe6trzcwcrQnqwhVEbvanwoshhMObnPg7Qt3lZnxUNCQSsQtobzblO7w4alzOl4 X-Gm-Message-State: AOJu0YyGPGwFUzfsxXHsALY3fQ+5kji0y9I4tTTuNn3STvsh59BU39sY KYQr2j+EF5r4NV4lgnkJQBdfcizOB61IBcKcuOvwcGAo+JCNLEq/XKvys3OENggrMnBNxqEF5y8 cjkIPMA== X-Google-Smtp-Source: AGHT+IGzrHMh2pPQKwOTaoY7O7XukvUQp8PPPO80ZjO1RUYChGGAOHdA6CkgCd9Cu9Is5SFMyHPP8i8mlXJa X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:940b:9044:fa83:4060]) (user=irogers job=sendgmr) by 2002:a05:6902:1024:b0:e02:c84e:61a3 with SMTP id 3f1490d57ef6-e05feb31053mr1739276.6.1721262652014; Wed, 17 Jul 2024 17:30:52 -0700 (PDT) Date: Wed, 17 Jul 2024 17:30:24 -0700 In-Reply-To: <20240718003025.1486232-1-irogers@google.com> Message-Id: <20240718003025.1486232-6-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240718003025.1486232-1-irogers@google.com> X-Mailer: git-send-email 2.45.2.1089.g2a221341d9-goog Subject: [PATCH v2 5/6] perf parse-events: Set is_pmu_core for legacy hardware events 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 , Bjorn Helgaas , Jonathan Corbet , James Clark , Ravi Bangoria , Dominique Martinet , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Dhananjay Ugwekar , ananth.narayan@amd.com, gautham.shenoy@amd.com, kprateek.nayak@amd.com, sandipan.das@amd.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Also set the CPU map to all online CPU maps. This is done so the behavior of legacy hardware and hardware cache events better matches that of sysfs and json events during __perf_evlist__propagate_maps. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 37 +++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index b181f83c9678..8c0c33361c5e 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -230,21 +230,30 @@ __add_event(struct list_head *list, int *idx, struct perf_cpu_map *cpu_list) { struct evsel *evsel; - struct perf_cpu_map *cpus =3D perf_cpu_map__is_empty(cpu_list) && pmu ? p= mu->cpus : cpu_list; + bool is_pmu_core; + struct perf_cpu_map *cpus; =20 - cpus =3D perf_cpu_map__get(cpus); - if (pmu) + if (pmu) { + is_pmu_core =3D pmu->is_core; + cpus =3D perf_cpu_map__get(perf_cpu_map__is_empty(cpu_list) ? pmu->cpus = : cpu_list); perf_pmu__warn_invalid_formats(pmu); - - if (pmu && (attr->type =3D=3D PERF_TYPE_RAW || attr->type >=3D PERF_TYPE_= MAX)) { - perf_pmu__warn_invalid_config(pmu, attr->config, name, - PERF_PMU_FORMAT_VALUE_CONFIG, "config"); - perf_pmu__warn_invalid_config(pmu, attr->config1, name, - PERF_PMU_FORMAT_VALUE_CONFIG1, "config1"); - perf_pmu__warn_invalid_config(pmu, attr->config2, name, - PERF_PMU_FORMAT_VALUE_CONFIG2, "config2"); - perf_pmu__warn_invalid_config(pmu, attr->config3, name, - PERF_PMU_FORMAT_VALUE_CONFIG3, "config3"); + if (attr->type =3D=3D PERF_TYPE_RAW || attr->type >=3D PERF_TYPE_MAX) { + perf_pmu__warn_invalid_config(pmu, attr->config, name, + PERF_PMU_FORMAT_VALUE_CONFIG, "config"); + perf_pmu__warn_invalid_config(pmu, attr->config1, name, + PERF_PMU_FORMAT_VALUE_CONFIG1, "config1"); + perf_pmu__warn_invalid_config(pmu, attr->config2, name, + PERF_PMU_FORMAT_VALUE_CONFIG2, "config2"); + perf_pmu__warn_invalid_config(pmu, attr->config3, name, + PERF_PMU_FORMAT_VALUE_CONFIG3, "config3"); + } + } else { + is_pmu_core =3D (attr->type =3D=3D PERF_TYPE_HARDWARE || + attr->type =3D=3D PERF_TYPE_HW_CACHE); + if (perf_cpu_map__is_empty(cpu_list)) + cpus =3D is_pmu_core ? perf_cpu_map__new_online_cpus() : NULL; + else + cpus =3D perf_cpu_map__get(cpu_list); } if (init_attr) event_attr_init(attr); @@ -259,7 +268,7 @@ __add_event(struct list_head *list, int *idx, evsel->core.cpus =3D cpus; evsel->core.own_cpus =3D perf_cpu_map__get(cpus); evsel->core.requires_cpu =3D pmu ? pmu->is_uncore : false; - evsel->core.is_pmu_core =3D pmu ? pmu->is_core : false; + evsel->core.is_pmu_core =3D is_pmu_core; evsel->auto_merge_stats =3D auto_merge_stats; evsel->pmu =3D pmu; evsel->pmu_name =3D pmu ? strdup(pmu->name) : NULL; --=20 2.45.2.1089.g2a221341d9-goog From nobody Wed Dec 17 01:09:38 2025 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.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 94CC02C1AC for ; Thu, 18 Jul 2024 00:30:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262658; cv=none; b=fRkmaP9kKNL0Fcx9GggLHVwlP0cUhCTeEP9m0tJBo7QbEU/yxTql2qm3GVlf1NF6rfwxB3ujXVeeQfS/8e3j7kWX7FUNkjzFbW06tGEWLbRJfMBFXC8SuLRPeGRaZecsDidEKnfWxUh9e4EQVFA0+q+oz57HEfeZpx6TMnSYXUA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721262658; c=relaxed/simple; bh=hPkdKtcjtneGae/p2zsac1oTD4YZxfkLQ8/rw90njuE=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=VrxRZYCItn79HIwer/G9Nw3915GQ7ZX1Chtq7H2I2GLhS0SVlTHrTWKjc0KzzIWI09eVLtzcNJvVzUwvFKfFYTe4Tc5RYL92PPxe+1eZLWoHKLLAhJgrnID9LH+3Eg7al/b4tbJUvIbBxYVNJG+PMT6STkfwg4phy/aSLEyUsMA= 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=g3qpoZNc; arc=none smtp.client-ip=209.85.219.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="g3qpoZNc" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-e03b3f48c65so785009276.0 for ; Wed, 17 Jul 2024 17:30:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1721262654; x=1721867454; 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=OZjSoS5cuNlc22m8gTceQLlRpYZr/ZrrOH8zAIvi2p0=; b=g3qpoZNcf8djVOEiXW7m4y+e9BWG5v3HtpvgnAwSQHJQbVl7pkwrzpL92kkO7kZzPz clT/iWfIaQ8h2jJQ9zIuz5QPJMDBdulGUMvh5IkZZwjIFYePAatTRP4kwv+P/u1QESPi NnNDFDIu9fWbKv7jkDIykiU6VEY/9Ghz++NZTBfo6rVHsiRax5Y1MQl51dEm0T4mfvl0 Y03fmtK7Y94QWc1plJYFnHVvEvZWePscyefKTMVGluf83L1hbnH7200e/sLPi6rDfolt ix5o/5VVrIfOHSX0zshZ9fMjbMhItYRoLcfWzTdHlJpJuvunBc6u27XDYMbXUXFBZRxl rl7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721262654; x=1721867454; 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=OZjSoS5cuNlc22m8gTceQLlRpYZr/ZrrOH8zAIvi2p0=; b=fYtIrBhm0eooCpLbxJMZ5faHb5wlm3YEhIVS4XVepj5r4u+allZUibWQNsoMiwViBa PYbXVnd3bIwHafBlt/vTiDYwBHatPSb+p63RuodaoNMcgNkaCFmXlthtZNzR7ECmxUFi fABOoaFvS0cb/JgdNsfnQM9YE3cK3J2anVhQG54vLM+q/Vq+BMvwg1DMliGyqT6YmwKY i5fKNFbAKGA3pmX5sW3G1V5knI2jEeCHP+DV6hn/+BfTpZf6UPrs5P7t3AygKX4wEzBE 8c5zKQrpnCRhRkzhADH6mOVO1hPS9yyHoEU5PdnCJ2eEklNO2ukU+waUf/k328GXB5dE Bjaw== X-Forwarded-Encrypted: i=1; AJvYcCVyAu9p4VIgPQWcY/QRa//tXfQ+YfaJKQ9+THSnXRimVDLYrHKFNTdulDYdIXGEZTzEMyqvLz+w0P2k9h8YSjUnZjxUPVRB9e0F1gZE X-Gm-Message-State: AOJu0YwD3XbnQnUZNJgiv/n/ajb7fvO1E1XP4tCcB5BIsKzrrS6yj1Lf WF8r/hWx9AyG9iOr76cryKFiRVEf89UbZ+PiiNTBEWv0K/2h4VZOf6OSvWZ7u8sncloGughQOSG 7hbfJhg== X-Google-Smtp-Source: AGHT+IGmu+Pp+xArAtOQV1L+0b9ATmdm8Fwrw7sscfQGWXRtOe90IqU7rKc8l/2wpefyr2wxMtHzRKi3itfz X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:940b:9044:fa83:4060]) (user=irogers job=sendgmr) by 2002:a05:6902:72f:b0:e05:ec8f:b497 with SMTP id 3f1490d57ef6-e05feac7896mr45202276.4.1721262654564; Wed, 17 Jul 2024 17:30:54 -0700 (PDT) Date: Wed, 17 Jul 2024 17:30:25 -0700 In-Reply-To: <20240718003025.1486232-1-irogers@google.com> Message-Id: <20240718003025.1486232-7-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240718003025.1486232-1-irogers@google.com> X-Mailer: git-send-email 2.45.2.1089.g2a221341d9-goog Subject: [PATCH v2 6/6] perf parse-events: Add "cpu" term to set the CPU an event is recorded on 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 , Bjorn Helgaas , Jonathan Corbet , James Clark , Ravi Bangoria , Dominique Martinet , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Dhananjay Ugwekar , ananth.narayan@amd.com, gautham.shenoy@amd.com, kprateek.nayak@amd.com, sandipan.das@amd.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The -C option allows the CPUs for a list of events to be specified but its not possible to set the CPU for a single event. Add a term to allow this. The term isn't a general CPU list due to ',' already being a special character in event parsing instead multiple cpu=3D terms may be provided and they will be merged/unioned together. An example of mixing different types of events counted on different CPUs: ``` $ perf stat -A -C 0,4-5,8 -e "instructions/cpu=3D0/,l1d-misses/cpu=3D4,cpu= =3D5/,inst_retired.any/cpu=3D8/,cycles" -a sleep 0.1 Performance counter stats for 'system wide': CPU0 368,647 instructions/cpu=3D0/ # 0.26= insn per cycle CPU4 instructions/cpu=3D0/ CPU5 instructions/cpu=3D0/ CPU8 instructions/cpu=3D0/ CPU0 l1d-misses [cpu] CPU4 203,377 l1d-misses [cpu] CPU5 138,231 l1d-misses [cpu] CPU8 l1d-misses [cpu] CPU0 cpu/cpu=3D8/ CPU4 cpu/cpu=3D8/ CPU5 cpu/cpu=3D8/ CPU8 943,861 cpu/cpu=3D8/ CPU0 1,412,071 cycles CPU4 20,362,900 cycles CPU5 10,172,725 cycles CPU8 2,406,081 cycles 0.102925309 seconds time elapsed ``` Note, the event name of inst_retired.any is missing, reported as cpu/cpu=3D8/, as there are unmerged uniquify fixes: https://lore.kernel.org/lkml/20240510053705.2462258-3-irogers@google.com/ An example of spreading uncore overhead across two CPUs: ``` $ perf stat -A -e "data_read/cpu=3D0/,data_write/cpu=3D1/" -a sleep 0.1 Performance counter stats for 'system wide': CPU0 223.65 MiB uncore_imc_free_running_0/cpu=3D0/ CPU0 223.66 MiB uncore_imc_free_running_1/cpu=3D0/ CPU0 MiB uncore_imc_free_running_0/cpu=3D1/ CPU1 5.78 MiB uncore_imc_free_running_0/cpu=3D1/ CPU0 MiB uncore_imc_free_running_1/cpu=3D1/ CPU1 5.74 MiB uncore_imc_free_running_1/cpu=3D1/ ``` Manually fixing the output it should be: ``` CPU0 223.65 MiB uncore_imc_free_running_0/data_read,cpu=3D0/ CPU0 223.66 MiB uncore_imc_free_running_1/data_read,cpu=3D0/ CPU1 5.78 MiB uncore_imc_free_running_0/data_write,cpu=3D1/ CPU1 5.74 MiB uncore_imc_free_running_1/data_write,cpu=3D1/ ``` That is data_read from 2 PMUs was counted on CPU0 and data_write was counted on CPU1. Signed-off-by: Ian Rogers --- tools/perf/Documentation/perf-list.txt | 9 ++++ tools/perf/util/evsel_config.h | 1 + tools/perf/util/parse-events.c | 73 ++++++++++++++++++++++---- tools/perf/util/parse-events.h | 3 +- tools/perf/util/parse-events.l | 1 + tools/perf/util/pmu.c | 1 + 6 files changed, 77 insertions(+), 11 deletions(-) diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentat= ion/perf-list.txt index 6bf2468f59d3..15511afe94a1 100644 --- a/tools/perf/Documentation/perf-list.txt +++ b/tools/perf/Documentation/perf-list.txt @@ -273,6 +273,15 @@ Sums up the event counts for all hardware threads in a= core, e.g.: =20 perf stat -e cpu/event=3D0,umask=3D0x3,percore=3D1/ =20 +cpu: + +Specifies the CPU to open the event upon. The value may be repeated to +specify opening the event on multiple CPUs: + + + perf stat -e instructions/cpu=3D0,cpu=3D2/,cycles/cpu=3D1,cpu=3D2/ -a sl= eep 1 + perf stat -e data_read/cpu=3D0/,data_write/cpu=3D1/ -a sleep 1 + =20 EVENT GROUPS ------------ diff --git a/tools/perf/util/evsel_config.h b/tools/perf/util/evsel_config.h index aee6f808b512..9630c4a24721 100644 --- a/tools/perf/util/evsel_config.h +++ b/tools/perf/util/evsel_config.h @@ -47,6 +47,7 @@ struct evsel_config_term { u32 aux_sample_size; u64 cfg_chg; char *str; + int cpu; } val; bool weak; }; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 8c0c33361c5e..85faef85b8de 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -7,6 +7,7 @@ #include #include #include +#include "cpumap.h" #include "term.h" #include "evlist.h" #include "evsel.h" @@ -177,6 +178,26 @@ static char *get_config_name(const struct parse_events= _terms *head_terms) return get_config_str(head_terms, PARSE_EVENTS__TERM_TYPE_NAME); } =20 +static struct perf_cpu_map *get_config_cpu(const struct parse_events_terms= *head_terms) +{ + struct parse_events_term *term; + struct perf_cpu_map *cpus =3D NULL; + + if (!head_terms) + return NULL; + + list_for_each_entry(term, &head_terms->terms, list) { + if (term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_CPU) { + struct perf_cpu_map *cpu =3D perf_cpu_map__new_int(term->val.num); + + cpus =3D perf_cpu_map__merge(cpus, cpu); + perf_cpu_map__put(cpu); + } + } + + return cpus; +} + /** * fix_raw - For each raw term see if there is an event (aka alias) in pmu= that * matches the raw's string value. If the string value matches an @@ -468,11 +489,12 @@ int parse_events_add_cache(struct list_head *list, in= t *idx, const char *name, bool found_supported =3D false; const char *config_name =3D get_config_name(parsed_terms); const char *metric_id =3D get_config_metric_id(parsed_terms); + struct perf_cpu_map *cpus =3D get_config_cpu(parsed_terms); + int ret =3D 0; =20 while ((pmu =3D perf_pmus__scan(pmu)) !=3D NULL) { LIST_HEAD(config_terms); struct perf_event_attr attr; - int ret; =20 if (parse_events__filter_pmu(parse_state, pmu)) continue; @@ -486,7 +508,7 @@ int parse_events_add_cache(struct list_head *list, int = *idx, const char *name, parsed_terms, perf_pmu__auto_merge_stats(pmu)); if (ret) - return ret; + goto out_err; continue; } =20 @@ -506,20 +528,27 @@ int parse_events_add_cache(struct list_head *list, in= t *idx, const char *name, =20 if (parsed_terms) { if (config_attr(&attr, parsed_terms, parse_state->error, - config_term_common)) - return -EINVAL; - - if (get_config_terms(parsed_terms, &config_terms)) - return -ENOMEM; + config_term_common)) { + ret =3D -EINVAL; + goto out_err; + } + if (get_config_terms(parsed_terms, &config_terms)) { + ret =3D -ENOMEM; + goto out_err; + } } =20 if (__add_event(list, idx, &attr, /*init_attr*/true, config_name ?: name, metric_id, pmu, &config_terms, /*auto_merge_stats=3D*/false, - /*cpu_list=3D*/NULL) =3D=3D NULL) - return -ENOMEM; + cpus) =3D=3D NULL) + ret =3D -ENOMEM; =20 free_config_terms(&config_terms); + if (ret) + goto out_err; } +out_err: + perf_cpu_map__put(cpus); return found_supported ? 0 : -EINVAL; } =20 @@ -814,6 +843,7 @@ static const char *config_term_name(enum parse_events__= 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_CPU] =3D "cpu", }; if ((unsigned int)term_type >=3D __PARSE_EVENTS__TERM_TYPE_NR) return "unknown term"; @@ -843,6 +873,7 @@ config_term_avail(enum parse_events__term_type term_typ= e, struct parse_events_er case PARSE_EVENTS__TERM_TYPE_METRIC_ID: case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: case PARSE_EVENTS__TERM_TYPE_PERCORE: + case PARSE_EVENTS__TERM_TYPE_CPU: return true; case PARSE_EVENTS__TERM_TYPE_USER: case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ: @@ -986,6 +1017,15 @@ do { \ return -EINVAL; } break; + case PARSE_EVENTS__TERM_TYPE_CPU: + CHECK_TYPE_VAL(NUM); + if (term->val.num >=3D (u64)cpu__max_present_cpu().cpu) { + parse_events_error__handle(err, term->err_val, + strdup("too big"), + NULL); + return -EINVAL; + } + break; case PARSE_EVENTS__TERM_TYPE_DRV_CFG: case PARSE_EVENTS__TERM_TYPE_USER: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: @@ -1112,6 +1152,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_CPU: default: if (err) { parse_events_error__handle(err, term->err_term, @@ -1243,6 +1284,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_CPU: default: break; } @@ -1296,6 +1338,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_CPU: default: break; } @@ -1350,6 +1393,7 @@ static int __parse_events_add_numeric(struct parse_ev= ents_state *parse_state, struct perf_event_attr attr; LIST_HEAD(config_terms); const char *name, *metric_id; + struct perf_cpu_map *cpus; int ret; =20 memset(&attr, 0, sizeof(attr)); @@ -1371,9 +1415,11 @@ static int __parse_events_add_numeric(struct parse_e= vents_state *parse_state, =20 name =3D get_config_name(head_config); metric_id =3D get_config_metric_id(head_config); + cpus =3D get_config_cpu(head_config); ret =3D __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, na= me, metric_id, pmu, &config_terms, /*auto_merge_stats=3D*/false, - /*cpu_list=3D*/NULL) ? 0 : -ENOMEM; + cpus) ? 0 : -ENOMEM; + perf_cpu_map__put(cpus); free_config_terms(&config_terms); return ret; } @@ -1440,6 +1486,7 @@ static int parse_events_add_pmu(struct parse_events_s= tate *parse_state, LIST_HEAD(config_terms); struct parse_events_terms parsed_terms; bool alias_rewrote_terms =3D false; + struct perf_cpu_map *term_cpu =3D NULL; int ret =3D 0; =20 if (verbose > 1) { @@ -1531,6 +1578,12 @@ static int parse_events_add_pmu(struct parse_events_= state *parse_state, goto out_err; } =20 + term_cpu =3D get_config_cpu(&parsed_terms); + if (!perf_cpu_map__is_empty(term_cpu)) { + perf_cpu_map__put(info.cpus); + info.cpus =3D term_cpu; + term_cpu =3D NULL; + } evsel =3D __add_event(list, &parse_state->idx, &attr, /*init_attr=3D*/tru= e, get_config_name(&parsed_terms), get_config_metric_id(&parsed_terms), pmu, diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index e13de2c8b706..b03857499030 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -79,7 +79,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_CPU, +#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_CPU + 1) }; =20 struct parse_events_term { diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 16045c383ada..e06097a62796 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -330,6 +330,7 @@ percore { return term(yyscanner, PARSE_EVENTS__TERM_T= YPE_PERCORE); } aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); } 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 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CPU); } 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); } diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 280b2499c861..27e2ff23799e 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1767,6 +1767,7 @@ int perf_pmu__for_each_format(struct perf_pmu *pmu, v= oid *state, pmu_format_call "percore", "aux-output", "aux-sample-size=3Dnumber", + "cpu=3Dnumber", }; struct perf_pmu_format *format; int ret; --=20 2.45.2.1089.g2a221341d9-goog