Patch "trace/trace_event_perf: remove duplicate samples on the first tracepoint event" has been added to the 4.19-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

    trace/trace_event_perf: remove duplicate samples on the first tracepoint event

to the 4.19-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:
     trace-trace_event_perf-remove-duplicate-samples-on-t.patch
and it can be found in the queue-4.19 subdirectory.

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



commit e5cfc4af95550e65753e227b406ab0a5b930fcc0
Author: Levi Yun <yeoreum.yun@xxxxxxx>
Date:   Fri Sep 13 03:13:47 2024 +0100

    trace/trace_event_perf: remove duplicate samples on the first tracepoint event
    
    [ Upstream commit afe5960dc208fe069ddaaeb0994d857b24ac19d1 ]
    
    When a tracepoint event is created with attr.freq = 1,
    'hwc->period_left' is not initialized correctly. As a result,
    in the perf_swevent_overflow() function, when the first time the event occurs,
    it calculates the event overflow and the perf_swevent_set_period() returns 3,
    this leads to the event are recorded for three duplicate times.
    
    Step to reproduce:
        1. Enable the tracepoint event & starting tracing
             $ echo 1 > /sys/kernel/tracing/events/module/module_free
             $ echo 1 > /sys/kernel/tracing/tracing_on
    
        2. Record with perf
             $ perf record -a --strict-freq -F 1 -e "module:module_free"
    
        3. Trigger module_free event.
             $ modprobe -i sunrpc
             $ modprobe -r sunrpc
    
    Result:
         - Trace pipe result:
             $ cat trace_pipe
             modprobe-174509  [003] .....  6504.868896: module_free: sunrpc
    
         - perf sample:
             modprobe  174509 [003]  6504.868980: module:module_free: sunrpc
             modprobe  174509 [003]  6504.868980: module:module_free: sunrpc
             modprobe  174509 [003]  6504.868980: module:module_free: sunrpc
    
    By setting period_left via perf_swevent_set_period() as other sw_event did,
    This problem could be solved.
    
    After patch:
         - Trace pipe result:
             $ cat trace_pipe
             modprobe 1153096 [068] 613468.867774: module:module_free: xfs
    
         - perf sample
             modprobe 1153096 [068] 613468.867794: module:module_free: xfs
    
    Link: https://lore.kernel.org/20240913021347.595330-1-yeoreum.yun@xxxxxxx
    Fixes: bd2b5b12849a ("perf_counter: More aggressive frequency adjustment")
    Signed-off-by: Levi Yun <yeoreum.yun@xxxxxxx>
    Acked-by: Namhyung Kim <namhyung@xxxxxxxxxx>
    Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index 5e68447588b7c..22cce5dc0e287 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -349,10 +349,16 @@ void perf_uprobe_destroy(struct perf_event *p_event)
 int perf_trace_add(struct perf_event *p_event, int flags)
 {
 	struct trace_event_call *tp_event = p_event->tp_event;
+	struct hw_perf_event *hwc = &p_event->hw;
 
 	if (!(flags & PERF_EF_START))
 		p_event->hw.state = PERF_HES_STOPPED;
 
+	if (is_sampling_event(p_event)) {
+		hwc->last_period = hwc->sample_period;
+		perf_swevent_set_period(p_event);
+	}
+
 	/*
 	 * If TRACE_REG_PERF_ADD returns false; no custom action was performed
 	 * and we need to take the default action of enqueueing our event on




[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