Patch "[PATCH 104/135] perf/x86/cqm: Fix CQM handling of grouping events" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
[PATCH 104/135] perf/x86/cqm: Fix CQM handling of grouping events
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
0104-perf-x86-cqm-Fix-CQM-handling-of-grouping-events-int.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
14f7272e474c54172b243755f2e5edb9e1b614ccMon Sep 17 00:00:00 2001
From: Vikas Shivappa <[email protected]>
Date: Thu, 10 Mar 2016 15:32:07 -0800
Subject: [PATCH 104/135] perf/x86/cqm: Fix CQM handling of grouping events
into a cache_group
[ Upstream commit a223c1c7ab4cc64537dc4b911f760d851683768a ]
Currently CQM (cache quality of service monitoring) is grouping all events belonging to same PID to use one RMID. However its not counting all of these different events. Hence we end up with a count of zero for all events other than the group leader.
The patch tries to address the issue by keeping a flag in the perf_event.hw which has other CQM related fields. The field is updated at event creation and during grouping.
--- arch/x86/kernel/cpu/perf_event_intel_cqm.c | 13 ++++++++++--- include/linux/perf_event.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-)
arch/x86/kernel/cpu/perf_event_intel_cqm.c +10 -3
@@ -281,9 +281,13 @@ static bool __match_event(struct perf_ev/* * Events that target same task are placed into the same cache group. +* Mark it as a multi event group, so that we update ->count +* for every event rather than just the group leader later. */ -if (a->hw.target == b->hw.target) +if (a->hw.target == b->hw.target) { + b->hw.is_group_event = true;return true; + }/* * Are we an inherited event?
@@ -849,6 +853,7 @@ static void intel_cqm_setup_event(structbool conflict = false;u32 rmid; + event->hw.is_group_event = false;list_for_each_entry (iter, &cache_groups, hw.cqm_groups_entry) { rmid = iter->hw.cqm_rmid;
@@ -940,7 +945,9 @@ static u64 intel_cqm_event_count(structreturn __perf_event_count (event);/* -* Only the group leader gets to report values. This stops us +* Only the group leader gets to report values except in case of +* multiple events in the same group, we still need to read the +* other events.This stops us * reporting duplicate values to userspace, and gives us a clear * rule for which task gets to report the values. *
@@ -948,7 +955,7 @@ static u64 intel_cqm_event_count(struct* specific packages - we forfeit that ability when we create * task events. */ -if (!cqm_group_leader (event)) +if (!cqm_group_leader (event) && !event->hw.is_group_event)return 0 ;/*
include/linux/perf_event.h +1 -0
@@ -121,6 +121,7 @@ struct hw_perf_event {struct {/* intel_cqm */ int cqm_state;u32 cqm_rmid; +int is_group_event;struct list_head cqm_events_entry;struct list_head cqm_groups_entry;struct list_head cqm_group_entry;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/0104-perf-x86-cqm-Fix-CQM-handling-of-grouping-events-int.patch queue-4.4/0105-perf-x86-cqm-Fix-CQM-memory-leak-and-notifier-leak.patch