• Thomas Gleixner's avatar
    kprobes: Cure hotplug lock ordering issues · 2d1e38f5
    Thomas Gleixner authored
    Converting the cpu hotplug locking to a percpu rwsem unearthed hidden lock
    ordering problems.
    
    There is a wide range of locks involved in this: kprobe_mutex,
    jump_label_mutex, ftrace_lock, text_mutex, event_mutex, module_mutex,
    func_hash->regex_lock and a gazillion of lock order permutations with
    nested get_online_cpus() calls.
    
    Some of those permutations are potential deadlocks even with the current
    nesting hotplug locking scheme, but they can't be discovered by lockdep.
    
    The conversion of the hotplug locking to a percpu rwsem requires to prevent
    nested locking, so it's required to take the hotplug rwsem early in the
    call chain and establish a proper lock order.
    
    After quite some analysis and going down the wrong road severa times the
    following lock order has been chosen:
    
    kprobe_mutex -> cpus_rwsem -> jump_label_mutex -> text_mutex
    
    For kprobes which hook on an ftrace function trace point, it's required to
    drop cpus_rwsem before calling into the ftrace code to avoid a deadlock on
    the func_hash->regex_lock.
    
    [ Steven: Ftrace interaction fixes ]
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    Acked-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sebastian Siewior <bigeasy@linutronix.de>
    Link: http://lkml.kernel.org/r/20170524081549.104864779@linutronix.de
    2d1e38f5
kprobes.c 62.6 KB