From: Dapeng Mi <dapeng1.mi@linux.intel.com>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Andi Kleen <ak@linux.intel.com>,
Eranian Stephane <eranian@google.com>
Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Dapeng Mi <dapeng1.mi@intel.com>, Zide Chen <zide.chen@intel.com>,
Falcon Thomas <thomas.falcon@intel.com>,
Xudong Hao <xudong.hao@intel.com>,
Dapeng Mi <dapeng1.mi@linux.intel.com>
Subject: [PATCH 14/15] perf/core: Add event_caps dependency flags
Date: Mon, 28 Sep 2026 15:43:08 +0800 [thread overview]
Message-ID: <20260928074309.898043-15-dapeng1.mi@linux.intel.com> (raw)
In-Reply-To: <20260928074309.898043-1-dapeng1.mi@linux.intel.com>
Add two new event capability flags:
- PERF_EV_CAP_RELIED_ON: An event that other group events rely on. Must
not be set on a group leader.
- PERF_EV_CAP_RELIANT: An event that relies on a group event carrying
PERF_EV_CAP_RELIED_ON. Must not be combined with PERF_EV_CAP_RELIED_ON.
If the dependency is on the group leader, use PERF_EV_CAP_SIBLING
instead of PERF_EV_CAP_RELIANT.
When an event with PERF_EV_CAP_RELIED_ON is detached from the group, all
events in the group carrying PERF_EV_CAP_RELIANT can no longer function
and must be transitioned to the ERROR state.
Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
---
include/linux/perf_event.h | 8 ++++++
kernel/events/core.c | 52 +++++++++++++++++++++++++++++++++-----
2 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 7797ce207555..3031fe8dab37 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -706,11 +706,19 @@ typedef void (*perf_overflow_handler_t)(struct perf_event *,
* group it is scheduled out and moved into an unrecoverable ERROR state.
* PERF_EV_CAP_READ_SCOPE: A CPU event that can be read from any CPU of the
* PMU scope where it is active.
+ * PERF_EV_CAP_RELIED_ON: An event on which other group members depend.
+ * This flag must not be set on a group leader.
+ * PERF_EV_CAP_RELIANT: A member that depends on another group event carrying
+ * PERF_EV_CAP_RELIED_ON. It must not be combined with PERF_EV_CAP_RELIED_ON
+ * and must not be set on a group leader. If the dependency is on the group
+ * leader, use PERF_EV_CAP_SIBLING instead.
*/
#define PERF_EV_CAP_SOFTWARE BIT(0)
#define PERF_EV_CAP_READ_ACTIVE_PKG BIT(1)
#define PERF_EV_CAP_SIBLING BIT(2)
#define PERF_EV_CAP_READ_SCOPE BIT(3)
+#define PERF_EV_CAP_RELIED_ON BIT(4)
+#define PERF_EV_CAP_RELIANT BIT(5)
#define SWEVENT_HLIST_BITS 8
#define SWEVENT_HLIST_SIZE (1 << SWEVENT_HLIST_BITS)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index de05df65ab3d..55db0ad8b93a 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2349,13 +2349,12 @@ static void perf_promote_sibling_to_leader(struct perf_event *sibling,
int group_caps)
{
/*
- * Events that have PERF_EV_CAP_SIBLING require being part of
- * a group and cannot exist on their own, schedule them out
- * and move them into the ERROR state. Also see
- * _perf_event_enable(), it will not be able to recover this
- * ERROR state.
+ * Events with PERF_EV_CAP_SIBLING or PERF_EV_CAP_RELIANT
+ * must stay in a group or depend on another event in the
+ * group; otherwise schedule them out and move them to ERROR.
+ * _perf_event_enable() cannot recover from this state.
*/
- if (sibling->event_caps & PERF_EV_CAP_SIBLING)
+ if (sibling->event_caps & (PERF_EV_CAP_SIBLING | PERF_EV_CAP_RELIANT))
__event_disable(sibling, ctx, PERF_EVENT_STATE_ERROR);
sibling->group_leader = sibling;
@@ -2371,6 +2370,43 @@ static void perf_promote_sibling_to_leader(struct perf_event *sibling,
perf_event__header_size(sibling);
}
+static void perf_group_disable_reliants(struct perf_event *event)
+{
+ struct perf_event *leader = event->group_leader;
+ struct perf_event *sibling, *tmp;
+ struct perf_event_context *ctx = event->ctx;
+ u32 mask = PERF_EV_CAP_RELIED_ON | PERF_EV_CAP_RELIANT;
+
+ if (!(event->event_caps & PERF_EV_CAP_RELIED_ON))
+ return;
+
+ /* Group leader should not carry PERF_EV_CAP_RELIED_ON. */
+ WARN_ON_ONCE(leader->event_caps & PERF_EV_CAP_RELIED_ON);
+ /* Group leader should not carry PERF_EV_CAP_RELIANT. */
+ WARN_ON_ONCE(leader->event_caps & PERF_EV_CAP_RELIANT);
+
+ /*
+ * Disable all siblings that rely on this event. Without it,
+ * they cannot function and would otherwise fall into ERROR state.
+ */
+ list_for_each_entry_safe(sibling, tmp, &leader->sibling_list, sibling_list) {
+ if (!(sibling->event_caps & PERF_EV_CAP_RELIANT))
+ continue;
+
+ /*
+ * An event must not set both PERF_EV_CAP_RELIED_ON and
+ * PERF_EV_CAP_RELIANT simultaneously.
+ */
+ if (WARN_ON_ONCE((sibling->event_caps & mask) == mask))
+ continue;
+
+ list_del_init(&sibling->sibling_list);
+ leader->nr_siblings--;
+ leader->group_generation++;
+ perf_promote_sibling_to_leader(sibling, ctx, leader->group_caps);
+ }
+}
+
static void perf_group_detach(struct perf_event *event)
{
struct perf_event *leader = event->group_leader;
@@ -2393,6 +2429,7 @@ static void perf_group_detach(struct perf_event *event)
* If this is a sibling, remove it from its group.
*/
if (leader != event) {
+ perf_group_disable_reliants(event);
list_del_init(&event->sibling_list);
leader->nr_siblings--;
leader->group_generation++;
@@ -3305,7 +3342,8 @@ static void _perf_event_enable(struct perf_event *event)
/*
* Detached SIBLING events cannot leave ERROR state.
*/
- if (event->event_caps & PERF_EV_CAP_SIBLING &&
+ if (event->event_caps &
+ (PERF_EV_CAP_SIBLING | PERF_EV_CAP_RELIANT) &&
event->group_leader == event)
goto out;
--
2.34.1
next prev parent reply other threads:[~2026-09-28 7:51 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-28 7:42 [PATCH 00/15] perf/x86: Fix sampling bugs and relax slots-event grouping Dapeng Mi
2026-09-28 7:42 ` [PATCH 01/15] perf/x86/intel: Guard leader sibling walk on nr_siblings Dapeng Mi
2026-09-28 8:00 ` sashiko-bot
2026-09-28 7:42 ` [PATCH 02/15] perf/x86/intel: Reset active_fixed_ctrl_val on CPU teardown Dapeng Mi
2026-09-28 8:02 ` sashiko-bot
2026-09-28 7:42 ` [PATCH 03/15] perf/x86/intel: Reset active_pebs_data_cfg " Dapeng Mi
2026-09-28 8:07 ` sashiko-bot
2026-09-28 7:42 ` [PATCH 04/15] perf/x86/intel: Reset cached acr_cfg_b[] and cfg_c_val[] " Dapeng Mi
2026-09-28 8:01 ` sashiko-bot
2026-09-28 7:42 ` [PATCH 05/15] perf/x86/intel: Pass correct PEBS counter mask to no-drain update path Dapeng Mi
2026-09-28 7:58 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 06/15] perf/x86/intel: Limit PEBS counter iteration to valid array bounds Dapeng Mi
2026-09-28 8:00 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 07/15] perf/x86/intel: Reject SAMPLE_READ for no-counter-snapshot ACR events Dapeng Mi
2026-09-28 8:04 ` sashiko-bot
2026-09-29 6:08 ` Mi, Dapeng
2026-09-29 19:02 ` Falcon, Thomas
2026-09-30 1:12 ` Mi, Dapeng
2026-09-28 7:43 ` [PATCH 08/15] perf/x86/intel: Fix stale PEBS count without counter-group support Dapeng Mi
2026-09-28 8:02 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 09/15] perf/x86/intel: Refactor intel_pmu_drain_arch_pebs() Dapeng Mi
2026-09-28 7:57 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 10/15] perf/x86/intel: Refactor intel_pmu_drain_pebs_icl() Dapeng Mi
2026-09-28 7:59 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 11/15] perf/x86/intel: Fix invalid PEBS counts with counter-group support Dapeng Mi
2026-09-28 8:00 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 12/15] perf/x86/intel: Make ACR static_call update architectural Dapeng Mi
2026-09-28 8:02 ` sashiko-bot
2026-09-28 7:43 ` [PATCH 13/15] perf/x86: Validate event type before topdown/mem-loads classification Dapeng Mi
2026-09-28 8:01 ` sashiko-bot
2026-09-28 7:43 ` Dapeng Mi [this message]
2026-09-28 8:05 ` [PATCH 14/15] perf/core: Add event_caps dependency flags sashiko-bot
2026-09-29 6:34 ` Mi, Dapeng
2026-09-28 7:43 ` [PATCH 15/15] perf/x86/intel: Allow Topdown metrics with a non-leader slots event Dapeng Mi
2026-09-28 8:12 ` sashiko-bot
2026-09-29 7:04 ` Mi, Dapeng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260928074309.898043-15-dapeng1.mi@linux.intel.com \
--to=dapeng1.mi@linux.intel.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=dapeng1.mi@intel.com \
--cc=eranian@google.com \
--cc=irogers@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=thomas.falcon@intel.com \
--cc=xudong.hao@intel.com \
--cc=zide.chen@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.