]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commit
perf: Disallow mis-matched inherited group reads
authorPeter Zijlstra <peterz@infradead.org>
Wed, 18 Oct 2023 11:56:54 +0000 (13:56 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 19 Oct 2023 08:09:42 +0000 (10:09 +0200)
commit32671e3799ca2e4590773fd0e63aaa4229e50c06
tree2e0c436e51dafdf7a4ea71dcbf7e716ef203d8c5
parent58720809f52779dc0f08e53e54b014209d13eebb
perf: Disallow mis-matched inherited group reads

Because group consistency is non-atomic between parent (filedesc) and children
(inherited) events, it is possible for PERF_FORMAT_GROUP read() to try and sum
non-matching counter groups -- with non-sensical results.

Add group_generation to distinguish the case where a parent group removes and
adds an event and thus has the same number, but a different configuration of
events as inherited groups.

This became a problem when commit fa8c269353d5 ("perf/core: Invert
perf_read_group() loops") flipped the order of child_list and sibling_list.
Previously it would iterate the group (sibling_list) first, and for each
sibling traverse the child_list. In this order, only the group composition of
the parent is relevant. By flipping the order the group composition of the
child (inherited) events becomes an issue and the mis-match in group
composition becomes evident.

That said; even prior to this commit, while reading of a group that is not
equally inherited was not broken, it still made no sense.

(Ab)use ECHILD as error return to indicate issues with child process group
composition.

Fixes: fa8c269353d5 ("perf/core: Invert perf_read_group() loops")
Reported-by: Budimir Markovic <markovicbudimir@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20231018115654.GK33217@noisy.programming.kicks-ass.net
include/linux/perf_event.h
kernel/events/core.c