• Lai Jiangshan's avatar
    tracing: Fix circular dead lock in stack trace · 4f48f8b7
    Lai Jiangshan authored
    When we cat <debugfs>/tracing/stack_trace, we may cause circular lock:
    sys_read()
      t_start()
         arch_spin_lock(&max_stack_lock);
    
      t_show()
         seq_printf(), vsnprintf() .... /* they are all trace-able,
           when they are traced, max_stack_lock may be required again. */
    
    The following script can trigger this circular dead lock very easy:
    #!/bin/bash
    
    echo 1 > /proc/sys/kernel/stack_tracer_enabled
    
    mount -t debugfs xxx /mnt > /dev/null 2>&1
    
    (
    # make check_stack() zealous to require max_stack_lock
    for ((; ;))
    {
    	echo 1 > /mnt/tracing/stack_max_size
    }
    ) &
    
    for ((; ;))
    {
    	cat /mnt/tracing/stack_trace > /dev/null
    }
    
    To fix this bug, we increase the percpu trace_active before
    require the lock.
    Reported-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
    Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    LKML-Reference: <4B67D4F9.9080905@cn.fujitsu.com>
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    4f48f8b7
trace_stack.c 7.7 KB