From nobody Sat Feb 7 08:29:12 2026 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 121C4258CDC for ; Thu, 3 Apr 2025 19:43:54 +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=1743709436; cv=none; b=XtvyTqUjV3CSPag5aL21uSXOYe0qgHaWnb+gCUYMZD0JndZ9CgtqJJ2prwtlqp/nGBaL9e8v1gv5pvLKqd/95FDXsYTS+Vw1efTN07UOEy3iHmpTlwhILrPgcDiTWN4ljx0IsUBZYtNGXC52WuWgxWp8gB888GDJzZ++lKySTNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743709436; c=relaxed/simple; bh=ru7u7pKXS/EaVzSTBdHYNt3QsjMHV+QaLj4tONySshs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=eM8lsiVSjd9v14uOLF5hply4i3g2nlBKQzWxPe9ZU3WedkihV6ro1bGbO/dSyla4xEIHfoKHnkAoaAcZArEG26mus4OybEMD+VoUHq/gtDcCmiMWqG4Kqv2uk6OSTXk2mmBd5ENZn4BA07IkGsRDl8dPlVuwRWzQr76qhddxwXM= 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=t6yYlCgz; 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="t6yYlCgz" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ff7aecba07so1252557a91.2 for ; Thu, 03 Apr 2025 12:43:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743709434; x=1744314234; 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=I5Pfi1jEe5jcwyGvVBhtjGFb4NLTmTQnKdr17Cg5Kpc=; b=t6yYlCgzn6riXEF4+vmNxtH5wvqkcfcT0wG2qcpL7zBgbWajHv+VpeJ9fcYroKZpLx JqeK9RO8HOONjc0f3E9MsMzQk0RGxgWd5gCyk2y+YyxP0CDU/LM8r+AZu63zEBwtJ1tX psPo1zT6NCLPt3u6lD4E3af+PRMZV+vq+Gxy39e2iOjDoFrFS7XuFULAP69bjyfuguht 1i4W6tFyS7/b/dZzT017yE1L0B22kVY86BTisYdIPDNnLMOYy2480uUE4mDvRjgQ1TjS E8IxG/JplHpqbpX9WaXzWo4ejSzvumPlHPLv2DU2vgFLQbR3A6RPaH6bo1cYk/veTO4E P6qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743709434; x=1744314234; 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=I5Pfi1jEe5jcwyGvVBhtjGFb4NLTmTQnKdr17Cg5Kpc=; b=bnotUC3KILNtk4vQfyUu9c34K1mPip3ZwkcmZ26v1DchdFgvuPJD3O+NgrxBzrEG2F zMv+fl9KdbSxtUOl3Nhnn7eGtAGK/xvxzNValfhf1lMY97iY3s3T8X3nbLj7fr6PNMSr +obFYw5KPgd5mSVTqDQZVsKUuCvi8z5W6zAJOoGSfPQ+atknWbH9h9pLXkkO1k2IgLa6 OHeYUEUNQceSPX/cS7Ig/R10S1m12T1tLL6n/4xIBUkV3CRN7wgvvCjg5+iJlYsc8CmD bnzLnWOcV3qUmQFV+kNSaxFMQHCjPbVAN62bk7KDOhOdAX74HsYMSJ3lxcMxPHd1RgT1 G9Vg== X-Forwarded-Encrypted: i=1; AJvYcCXIT/+0Ynhl96OOY2F5vAfrn23x7zWxRklqWhiPKLxwmfxOBci1qy9qK1vflnbrq6IpV9jWcKujl9hfL98=@vger.kernel.org X-Gm-Message-State: AOJu0YxhjpZvWFFLS50qDYcgoXSpcwQ3cwnEsGs5wQLT2I6RqfEWwuVM RUzIeuxh0YuH5rTNGy2qkhFPba0VVvvRj/lgb0BoQTjCjgzjHdWxO1+FPhNA6m/RJEjJM/bbDJx fw7jwFg== X-Google-Smtp-Source: AGHT+IG1CI93Af9+RSqQ2ONFXYqX+CMo0v2Jgy+naLqDvO/26ArW4PrhUNUcnhD4A9oMbqfEqoZvzEkKAVbf X-Received: from pjx14.prod.google.com ([2002:a17:90b:568e:b0:2fa:1481:81f5]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1f86:b0:2f9:c144:9d13 with SMTP id 98e67ed59e1d1-306a4908a75mr1034365a91.24.1743709434338; Thu, 03 Apr 2025 12:43:54 -0700 (PDT) Date: Thu, 3 Apr 2025 12:43:34 -0700 In-Reply-To: <20250403194337.40202-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: <20250403194337.40202-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250403194337.40202-2-irogers@google.com> Subject: [PATCH v6 1/4] 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 , Leo Yan , James Clark , Greg Kroah-Hartman , Weilin Wang , Andi Kleen , Dominique Martinet , Yicong Yang , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org 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 Tested-by: Kan Liang --- 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 4454a5987570..b20a5280f2b3 100644 --- a/tools/lib/perf/cpumap.c +++ b/tools/lib/perf/cpumap.c @@ -242,6 +242,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 8c1ab0f9194e..58cc5c5fa47c 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__get(struct perf_cpu_map *ma= p); LIBPERF_API int perf_cpu_map__merge(struct perf_cpu_map **orig, struct perf_cpu_map *other); --=20 2.49.0.504.g3bcea36a83-goog From nobody Sat Feb 7 08:29:12 2026 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 3559926738B for ; Thu, 3 Apr 2025 19:43:56 +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=1743709439; cv=none; b=JpkJIVhZWa1DV67FPxqNFhM667dgSfTGEPHQ7tfsAr1ZrfxJhRpoDA6Nwb6ZufCVAcHRkjzh2Lm/jeF11+asf15wMpl+1lx5X2t/xnBykstgRa1nnmn/Zrs2BTdAyepzK7uyzA9cSHsCnOCXsFSkAFC+mhEz7qu3YlCdw98JJ6k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743709439; c=relaxed/simple; bh=QIZAAAk/MdLupLUpiD23XMSohaw76ST55IymoNR7/t4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Hho9/B4vHHfg5VcVFBdnzDKBvZwdbc6PFTLP3IDGDaI6JOuD2qCSXvW91Lq0qlRwFyJrYrmKLCIQnhh9+YBjtcfuE4VttkVR2ssMHDpu12uTmL/dC1KHi4M3fsHWIowjqqW8vKlK9mutYjXxR8PU8dYZb9r7FG8H6RnR/bPJ208= 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=G0vx7jiJ; 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="G0vx7jiJ" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ff62f96b10so2719705a91.0 for ; Thu, 03 Apr 2025 12:43:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743709436; x=1744314236; 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=/yB/Gn9tHctPRNXn6w3PLBCiw087uLsUcXZZ/fWypWo=; b=G0vx7jiJiykxIrcG7OROFFpA/z+3PPqoWOXbx3UfH1PLGPxtTCpw0DD+/NYE8WDEqZ Odu73KISAhpSyPgnIla384+aEDeU4x1THx+MGRWUSb9Trn6lC1mfWnWVT9Slwbsrdx7T s3nrMnb8gRPEYHZgdhK9FarXRMrWU03nhq7uyWefT+B/6HqQLLVriR2U4gddLc0fiPhF LlBURa29d2qlO1hNzBb7xF9zWj+B7YEBmO1Cu4//mFeP5vezgJe5tipic7Nq1OipGtfx AkwtZZl6zpl3t/1KCue/fMdyGIY6bRjXyvaoeJLmAcV81JwGhAA7cjegL0aGYNaTVqOa J/CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743709436; x=1744314236; 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=/yB/Gn9tHctPRNXn6w3PLBCiw087uLsUcXZZ/fWypWo=; b=o/kyRUzMZpP6xJjBx5Bm+JozWQiiK4hsgf8HcVK8Aj6S2stfiPSjWVGDivIMYCtYur /vDdexHf9umQ1YD9IqwsHntIAZGI8rNynVTaybOHb0tRr5uXDlSdzQfAurBsZboBCzwE ddhXsHJ9HRbwZ/rMYk6uc2AdohcZlXv3lZyp3sYai2rSbp1jQYgTWrMLLQTegAWVvl7g IRF9BhARxG8xAKl8bRAEbAaOJOqtsL8dXoxhef8W2/mnZ6pjFzGnsRJ81EId+H+p1SNe n1I0d9sr1piu+0WX4ca3oeL+oAuy3rYsm/nM1h7bjhHshFcx1yp8dF5GuD2VxWq9tuNR 6dYA== X-Forwarded-Encrypted: i=1; AJvYcCXGnZKsPHZede3L0fPbZo/c283KfUEqs8sQn5U6QjQ0eDnzT8j201uUu7pyF7DpMw4DtWEoUOp5dPIA/r4=@vger.kernel.org X-Gm-Message-State: AOJu0YyDP9pPfo/BRN0nVd/2+rtn6W2NFSrHn6vbRO8Rl/tsjk+56vGS 8nsLujyJvC8T9d5CqgGt1TrO571bWFMMRa5Rlh30r1uQg4/4EkfiMGUKFltrrlhz5zvnAYc70BB Fk5QFTA== X-Google-Smtp-Source: AGHT+IHPrUcrSNE9tHepYVbX0KrHTiLPITA768YB/Ndnpp5L3XAiSB2Op4yPgZ2vCjpVSVdiYY4nuFOZlI6t X-Received: from pjbpq18.prod.google.com ([2002:a17:90b:3d92:b0:2f8:49ad:406c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5247:b0:2ff:556f:bf9 with SMTP id 98e67ed59e1d1-306a4e62893mr773485a91.4.1743709436490; Thu, 03 Apr 2025 12:43:56 -0700 (PDT) Date: Thu, 3 Apr 2025 12:43:35 -0700 In-Reply-To: <20250403194337.40202-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: <20250403194337.40202-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250403194337.40202-3-irogers@google.com> Subject: [PATCH v6 2/4] perf stat: Use counter cpumask to skip zero values 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 , Leo Yan , James Clark , Greg Kroah-Hartman , Weilin Wang , Andi Kleen , Dominique Martinet , Yicong Yang , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When a counter is 0 it may or may not be skipped. For uncore counters it is common they are only valid on 1 logical CPU and all other CPUs should be skipped. The PMU's cpumask was used for the skip calculation, but that cpumask may not reflect user overrides. Similarly a counter on a core PMU may explicitly not request a CPU be gathered. If the counter on this CPU's value is 0 then the counter should be skipped as it wasn't requested. Switch from using the PMU cpumask to that associated with the evsel to support these cases. Avoid potential crash with --per-thread mode where config->aggr_get_id is NULL. Add some examples for the tool event 0 counter skipping. Signed-off-by: Ian Rogers Tested-by: Kan Liang --- tools/perf/util/stat-display.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index e852ac0d9847..4afe963c6a93 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -1022,8 +1022,16 @@ static bool should_skip_zero_counter(struct perf_sta= t_config *config, return true; =20 /* - * Many tool events are only gathered on the first index, skip other - * zero values. + * In per-thread mode the aggr_map and aggr_get_id functions may be + * NULL, assume all 0 values should be output in that case. + */ + if (!config->aggr_map || !config->aggr_get_id) + return false; + + /* + * Tool events may be gathered on all logical CPUs, for example + * system_time, but for many the first index is the only one used, for + * example num_cores. Don't skip for the first index. */ if (evsel__is_tool(counter)) { struct aggr_cpu_id own_id =3D @@ -1031,15 +1039,12 @@ static bool should_skip_zero_counter(struct perf_st= at_config *config, =20 return !aggr_cpu_id__equal(id, &own_id); } - /* - * Skip value 0 when it's an uncore event and the given aggr id - * does not belong to the PMU cpumask. + * Skip value 0 when the counter's cpumask doesn't match the given aggr + * id. */ - if (!counter->pmu || !counter->pmu->is_uncore) - return false; =20 - perf_cpu_map__for_each_cpu(cpu, idx, counter->pmu->cpus) { + perf_cpu_map__for_each_cpu(cpu, idx, counter->core.cpus) { struct aggr_cpu_id own_id =3D config->aggr_get_id(config, cpu); =20 if (aggr_cpu_id__equal(id, &own_id)) --=20 2.49.0.504.g3bcea36a83-goog From nobody Sat Feb 7 08:29:12 2026 Received: from mail-oi1-f201.google.com (mail-oi1-f201.google.com [209.85.167.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 9936026739A for ; Thu, 3 Apr 2025 19:43:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743709441; cv=none; b=rbIjykDmPj9FoNttm2AbtAH5AFmy7S4pPyWPuF/aV/J4lgPNC7wRObdeJByn8aHNln8mIxRC7HDDx8bYjAqQeLl6eJyvxdCvTVQkFzA33Qbvu1DRlRRvawoNLSNoPERcNPgHnma6TK4TEwj7sGI+1wE7hAjq44ItL/oKt+itDqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743709441; c=relaxed/simple; bh=T+mzRhe6HKJiK9RRzofrD2YayCT8Ai2sVKhFqc9XRqQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=bDbwoY0jlkW1xMGeY5wkWBdXJ190kcpir05wXpukKzJzG5hDHOeebxqkYbXRvsvV4zbFkSK8i0tx2OjNv0SqyC7XncfFM4qrk+aMadr3VxZ9mDN1YGcPaShnGXWxk+lg2DCw7VMiDivTNfYPvEirc/K6DphaEjEn6DU+ywoPT/k= 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=BBFNDvmB; arc=none smtp.client-ip=209.85.167.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="BBFNDvmB" Received: by mail-oi1-f201.google.com with SMTP id 5614622812f47-3f6a46c4dd9so925835b6e.3 for ; Thu, 03 Apr 2025 12:43:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743709438; x=1744314238; 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=oigN7fX14J5RTgizOqqAZQvGiIy12HcnQqfSi7qOEf4=; b=BBFNDvmBcyckxZHNSwYYpVs3vmxDMOoVUv3SewLs2gsx4IUge3rdx40S1fCRTf4qso K7coq2Ar4rvSHox/YW+uCXpNMyrATJYKhPRWc2ZDzLfeJytu8AGLMpekrx5VkXcb9IeR JqnWzwI5dYd4JrjWFcY9hxh1QN/zZwfhmJ78VN0INgzwTQK5T79CkKKMGlcSsIXdwDlX /5ykxpIFEpguD0E2guJ198Hcug2QCXQyD6u9gR83tdv1324rAd17IT3N8WzULJeCq+3Y BAff8V4vHOMxgxLYZhO9JOofncvUFRqBaCkKnj4/9403TkrtH3MTBmeycVGn9lpiW9+b wyEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743709438; x=1744314238; 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=oigN7fX14J5RTgizOqqAZQvGiIy12HcnQqfSi7qOEf4=; b=M01aN/lGb8GJtgP89EEorOC+xWXv8iSV6VdLkhvV1xBhJbCRWSSHV9Guyw7MDENcW+ tr23Zt84pfj0Jzvikv/XFM+wosQbTuuWBcKefJk4/w4366eFpHm2eSWsfQX17aw49Pl4 DUEAyCc+SKj/yPxcIlPoCv5Y+X3QDnF2+I/BzDM3UiD5vlyyJYrUkdXiXw1cgQT96cyn ZJPLFnOipHe0Uy/kqPawXKD5qS8k26S3q9G/iF3MGCHSU6cGF6R1Pfk/4Gu3SVrt5FmG LiAjz72cW9JkKlPhl/WMrsNXuENgrjZ2fuLKhw/SfA7TyFUrpP/vJn5QDHslRc1VjudH nZHA== X-Forwarded-Encrypted: i=1; AJvYcCW8lsXvNFsKepHse7yRhcn/qCbC5YDFzgfiZPFbAUnzRKK8cunmyqTTAJZHAZx3RH9vgiI/IuvshxblkMA=@vger.kernel.org X-Gm-Message-State: AOJu0YzGvetYaTIneBOQdG4RC9W9O3M71xqfub5pjFAV/n0mp6gERf+M z9/h2iD6WhKrp1AKFx0XKN6oaSHmgUVFqRHsMItqs1x9wmTN6A0jXTHzBesMoa2TOwPRu15UZhS /rsWRPA== X-Google-Smtp-Source: AGHT+IHrWF+kytFlHDMFjo7g+NYVgwa4HX8kGshwbl7Hc5qiy2oO5icw6WuvqDkWkj/KvF+s474GgtiK7jIf X-Received: from oacny23.prod.google.com ([2002:a05:6871:7517:b0:2c1:64e4:adb9]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6830:6418:b0:72c:4032:76f with SMTP id 46e09a7af769-72e367f05ecmr667407a34.12.1743709438610; Thu, 03 Apr 2025 12:43:58 -0700 (PDT) Date: Thu, 3 Apr 2025 12:43:36 -0700 In-Reply-To: <20250403194337.40202-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: <20250403194337.40202-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250403194337.40202-4-irogers@google.com> Subject: [PATCH v6 3/4] 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 , Leo Yan , James Clark , Greg Kroah-Hartman , Weilin Wang , Andi Kleen , Dominique Martinet , Yicong Yang , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org 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. Fix missing cpumap put in "Synthesize attr update" test. Signed-off-by: Ian Rogers Tested-by: Kan Liang --- 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 5152fd5a6ead..783177c5f140 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -232,21 +232,30 @@ __add_event(struct list_head *list, int *idx, struct perf_cpu_map *cpu_list, u64 alternate_hw_config) { 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); @@ -261,7 +270,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->alternate_hw_config =3D alternate_hw_config; --=20 2.49.0.504.g3bcea36a83-goog From nobody Sat Feb 7 08:29:12 2026 Received: from mail-oo1-f74.google.com (mail-oo1-f74.google.com [209.85.161.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 8CB502673AF for ; Thu, 3 Apr 2025 19:44:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743709443; cv=none; b=ZEdJX8M4uoh0OeEu/Dyw1ZasPp7TJjCJ3MAVN0omxja3wcCjRPpCet/UBYCC1Tm5PlSBXioLafoU+4v9amyvRFcvvIpzYMPctphrokrUWQJo7gI+KZI2TwLZqme8zxuziO7+T8CYmE7LruIP/t2gZBdZLe2L0TO78M8D3H6h1YQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743709443; c=relaxed/simple; bh=Hb1LH8MWDKh/SBlCFGDKsTyfayTGu9osHdVeQkub7DA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=pPI+gzKpSqbAm2Oz/ZSZ+f5b+rV3VmOmqx1WvPFXpWZoOjT9HcwPQZDQfEiLGWxhwzubhFf0YqsEhi32zjfUV2G0PzAwNnTVD6J/kusvN8txUVbj4iaxUu0jSHVZGiiriaRk1B2y1oLqg3dF0RyZDMIo7K5MHQtK02lVHk8boSs= 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=NyQA+zko; arc=none smtp.client-ip=209.85.161.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="NyQA+zko" Received: by mail-oo1-f74.google.com with SMTP id 006d021491bc7-6022020dd2bso325185eaf.2 for ; Thu, 03 Apr 2025 12:44:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743709440; x=1744314240; 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=qBxUwTOgMQg7WWu2qDeWBrbygHx0f5AF8t2eYtXUGLw=; b=NyQA+zkoEaw1WjMYk/kx4GPmD5qDoN9sU1dLTudfg+r5A4eGhafUpwxb5RQRxOijmB 40DuBpiXWi/AdgN0d7rYruIIL7n39vwsq+TcH0fQvvF2IuD1JISo4w2YXx/T2fNs258Z yx5SWOJE+P+3ThNeLH/UIsXmKz6umcmWiramYj0UwToaNCj/ajaC0rK/Dl58Gx/cbq3V sJbMC37SjicNLhoEXtpzVxf5mHctbAyidZCxRpYbdxsbAHZ6J+wUt11bJyTJpfmRxk+V vbHhyGnfwHDAuEp05SsUEiz9P+mpRShKM+liWsqqX3ZuPlmzZbEw+3oaSb6opgGJVbA5 QHjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743709440; x=1744314240; 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=qBxUwTOgMQg7WWu2qDeWBrbygHx0f5AF8t2eYtXUGLw=; b=gENknlTnZ3XcAeWHruoVnp07ZhEKgaMhlG/mVb3FEP52RxRzQQBwrojcnDE7bYm2jN rvxhzmi/cJ42qtsde9Ccg1ovh13Dt9EOvlasmyo/Q8M9y6GvSD0yC2/oLIk0Jqb7u6Nz WfN7+IZaUyL+9p0IgESrP8znSm4gXT++0RVE2ncYB+3Sg69j/dE2C3xkAKV9LyyGZkDR /DXBSRkRy+vcKx8I47McbmO4GuDE6238LMRH6mLd10pKrZxt/+U9qR3QOlrDFKPb4Igg BMeCjBz+3G5kEDoXOU5Cy5O+naSeUq+e9gtjXfD6QbjGkJa8G/AQlLOd2teOTnzf9ZRZ Pajg== X-Forwarded-Encrypted: i=1; AJvYcCX7NMRIVEwPpDuXdj3XgIk2EfuAppxkRjvJPp52sW4sfCykc1i8u3rHxs7KRn/xDztarzKIAapVrN/Zox8=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4IFPvUp6C+kZUYqW9hYwiotJRYhjn3UAOwlHSK65beUng6Biq r9IWmsVmRNViu4UgQmkn1A1JLjNl1BVt7G79xJV3FydlbahTEfJwRItzGiSnMT+pNZIz0+5FTlO MvdObFA== X-Google-Smtp-Source: AGHT+IGUJjNn+0SbWkVSjzPIxGq3rhm0m6MVrbcZaSE78IEupPzoHmRZEuq9Rf3qB5Am6SeFV807TECIhxOE X-Received: from oabpb6.prod.google.com ([2002:a05:6870:1e86:b0:2b8:ed65:d4c7]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6870:4e0c:b0:29e:76d1:db3b with SMTP id 586e51a60fabf-2cc9e51de4cmr426200fac.5.1743709440581; Thu, 03 Apr 2025 12:44:00 -0700 (PDT) Date: Thu, 3 Apr 2025 12:43:37 -0700 In-Reply-To: <20250403194337.40202-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: <20250403194337.40202-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250403194337.40202-5-irogers@google.com> Subject: [PATCH v6 4/4] 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 , Leo Yan , James Clark , Greg Kroah-Hartman , Weilin Wang , Andi Kleen , Dominique Martinet , Yicong Yang , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org 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 6,979,225 instructions/cpu=3D0/ # 0.89= insn per cycle CPU4 75,138 cpu/l1d-misses/ CPU5 1,418,939 cpu/l1d-misses/ CPU8 797,553 cpu/inst_retired.any,cpu=3D8/ CPU0 7,845,302 cycles CPU4 6,546,859 cycles CPU5 185,915,438 cycles CPU8 2,065,668 cycles 0.112449242 seconds time elapsed ``` Signed-off-by: Ian Rogers Tested-by: Kan Liang --- tools/perf/Documentation/perf-list.txt | 9 +++ tools/perf/util/evsel_config.h | 1 + tools/perf/util/parse-events.c | 76 +++++++++++++++++++++----- tools/perf/util/parse-events.h | 3 +- tools/perf/util/parse-events.l | 1 + tools/perf/util/pmu.c | 3 +- 6 files changed, 76 insertions(+), 17 deletions(-) diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentat= ion/perf-list.txt index 8914f12d2b85..ce0735021473 100644 --- a/tools/perf/Documentation/perf-list.txt +++ b/tools/perf/Documentation/perf-list.txt @@ -289,6 +289,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 af52a1516d0b..94a1e9cf73d6 100644 --- a/tools/perf/util/evsel_config.h +++ b/tools/perf/util/evsel_config.h @@ -48,6 +48,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 783177c5f140..0a57af03db5e 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 "env.h" #include "evlist.h" @@ -179,6 +180,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); + + 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 @@ -442,11 +463,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; @@ -461,7 +483,7 @@ int parse_events_add_cache(struct list_head *list, int = *idx, const char *name, perf_pmu__auto_merge_stats(pmu), /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX); if (ret) - return ret; + goto out_err; continue; } =20 @@ -481,21 +503,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, - /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX) =3D=3D NULL) - return -ENOMEM; + cpus, /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX) =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 +842,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_CPU] =3D "cpu", }; if ((unsigned int)term_type >=3D __PARSE_EVENTS__TERM_TYPE_NR) return "unknown term"; @@ -843,6 +872,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: @@ -990,6 +1020,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: @@ -1117,6 +1156,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, @@ -1251,6 +1291,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; } @@ -1305,6 +1346,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; } @@ -1349,6 +1391,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)); @@ -1370,10 +1413,11 @@ static int __parse_events_add_numeric(struct parse_= events_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, /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX - ) =3D=3D NULL ? -ENOMEM : 0; + metric_id, pmu, &config_terms, /*auto_merge_stats=3D*/false, + cpus, /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX) ? 0 : -ENOMEM; + perf_cpu_map__put(cpus); free_config_terms(&config_terms); return ret; } @@ -1433,6 +1477,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; =20 if (verbose > 1) { struct strbuf sb; @@ -1527,11 +1572,12 @@ static int parse_events_add_pmu(struct parse_events= _state *parse_state, return -EINVAL; } =20 + term_cpu =3D get_config_cpu(&parsed_terms); 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, - alternate_hw_config); + &config_terms, auto_merge_stats, term_cpu, alternate_hw_config); + perf_cpu_map__put(term_cpu); if (!evsel) { parse_events_terms__exit(&parsed_terms); return -ENOMEM; diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index e176a34ab088..ab242f671031 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_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 7ed86e3e34e3..4af7b9c1f44d 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -335,6 +335,7 @@ aux-output { return term(yyscanner, PARSE_EVENTS__TERM= _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 { 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 b7ebac5ab1d1..721a900b3c1d 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_CPU: /* Skip non-config terms. */ break; default: @@ -1804,6 +1804,7 @@ int perf_pmu__for_each_format(struct perf_pmu *pmu, v= oid *state, pmu_format_call "aux-output", "aux-action=3D(pause|resume|start-paused)", "aux-sample-size=3Dnumber", + "cpu=3Dnumber", }; struct perf_pmu_format *format; int ret; --=20 2.49.0.504.g3bcea36a83-goog