Patch "perf/core: Fix the same task check in perf_event_set_output" has been added to the 6.2-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    perf/core: Fix the same task check in perf_event_set_output

to the 6.2-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:
     perf-core-fix-the-same-task-check-in-perf_event_set_.patch
and it can be found in the queue-6.2 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 080a36991cb793bcbeeb6807510648f780414ef6
Author: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>
Date:   Wed Mar 22 13:24:49 2023 -0700

    perf/core: Fix the same task check in perf_event_set_output
    
    [ Upstream commit 24d3ae2f37d8bc3c14b31d353c5d27baf582b6a6 ]
    
    The same task check in perf_event_set_output has some potential issues
    for some usages.
    
    For the current perf code, there is a problem if using of
    perf_event_open() to have multiple samples getting into the same mmap’d
    memory when they are both attached to the same process.
    https://lore.kernel.org/all/92645262-D319-4068-9C44-2409EF44888E@xxxxxxxxx/
    Because the event->ctx is not ready when the perf_event_set_output() is
    invoked in the perf_event_open().
    
    Besides the above issue, before the commit bd2756811766 ("perf: Rewrite
    core context handling"), perf record can errors out when sampling with
    a hardware event and a software event as below.
     $ perf record -e cycles,dummy --per-thread ls
     failed to mmap with 22 (Invalid argument)
    That's because that prior to the commit a hardware event and a software
    event are from different task context.
    
    The problem should be a long time issue since commit c3f00c70276d
    ("perk: Separate find_get_context() from event initialization").
    
    The task struct is stored in the event->hw.target for each per-thread
    event. It is a more reliable way to determine whether two events are
    attached to the same task.
    
    The event->hw.target was also introduced several years ago by the
    commit 50f16a8bf9d7 ("perf: Remove type specific target pointers"). It
    can not only be used to fix the issue with the current code, but also
    back port to fix the issues with an older kernel.
    
    Note: The event->hw.target was introduced later than commit
    c3f00c70276d. The patch may cannot be applied between the commit
    c3f00c70276d and commit 50f16a8bf9d7. Anybody that wants to back-port
    this at that period may have to find other solutions.
    
    Fixes: c3f00c70276d ("perf: Separate find_get_context() from event initialization")
    Signed-off-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
    Reviewed-by: Zhengjun Xing <zhengjun.xing@xxxxxxxxxxxxxxx>
    Link: https://lkml.kernel.org/r/20230322202449.512091-1-kan.liang@xxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 4b3205f6bed5e..daecb8c9126b0 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -12155,7 +12155,7 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event)
 	/*
 	 * If its not a per-cpu rb, it must be the same task.
 	 */
-	if (output_event->cpu == -1 && output_event->ctx != event->ctx)
+	if (output_event->cpu == -1 && output_event->hw.target != event->hw.target)
 		goto out;
 
 	/*



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux