• Yunlong Song's avatar
    perf sched replay: Fix the segmentation fault problem caused by pr_err in threads · 08097abc
    Yunlong Song authored
    The pr_err in self_open_counters() prints error message to stderr.
    Unlike stdout, stderr uses memory buffer on the stack of each calling
    process.
    
    The pr_err in self_open_counters() works in a thread called thread_func
    created in function create_tasks, which concurrently creates
    sched->nr_tasks threads.
    
    If the error happens and pr_err prints the error message in each of
    these threads, the stack size of the perf process (default is 8192
    kbytes) will quickly run out and the segmentation fault will happen
    then.
    
    To solve this problem, pr_err with self_open_counters() should be moved
    from newly created threads to the old main thread of the perf process.
    Then the pr_err can work in a stable situation without the strange
    segmentation fault problem.
    
    Example:
    
    Test environment: x86_64 with 160 cores
    
    Before this patch:
    
     $ perf sched replay
     ...
     task   1549 (             :163132:    163132), nr_events: 1
     task   1550 (             :163540:    163540), nr_events: 1
     task   1551 (           <unknown>:         0), nr_events: 10
     Segmentation fault
    
    After this patch:
    
     $ perf sched replay
     ...
     task   1549 (             :163132:    163132), nr_events: 1
     task   1550 (             :163540:    163540), nr_events: 1
     task   1551 (           <unknown>:         0), nr_events: 10
     ...
    
    As shown above, the result continues without any segmentation fault.
    Signed-off-by: default avatarYunlong Song <yunlong.song@huawei.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/r/1427809596-29559-6-git-send-email-yunlong.song@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    08097abc
builtin-sched.c 44.2 KB