• Peter Zijlstra's avatar
    perf: Disallow mis-matched inherited group reads · 32671e37
    Peter Zijlstra authored
    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 fa8c2693 ("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: fa8c2693 ("perf/core: Invert perf_read_group() loops")
    Reported-by: default avatarBudimir Markovic <markovicbudimir@gmail.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20231018115654.GK33217@noisy.programming.kicks-ass.net
    32671e37
core.c 331 KB