• Peter Rosin's avatar
    i2c/mux, locking/core: Annotate the nested rt_mutex usage · 7b94ea50
    Peter Rosin authored
    If an i2c topology has instances of nested muxes, then a lockdep splat
    is produced when when i2c_parent_lock_bus() is called.  Here is an
    example:
    
      ============================================
      WARNING: possible recursive locking detected
      --------------------------------------------
      insmod/68159 is trying to acquire lock:
        (i2c_register_adapter#2){+.+.}, at: i2c_parent_lock_bus+0x32/0x50 [i2c_mux]
    
      but task is already holding lock:
        (i2c_register_adapter#2){+.+.}, at: i2c_parent_lock_bus+0x32/0x50 [i2c_mux]
    
      other info that might help us debug this:
        Possible unsafe locking scenario:
    
              CPU0
              ----
         lock(i2c_register_adapter#2);
         lock(i2c_register_adapter#2);
    
        *** DEADLOCK ***
    
        May be due to missing lock nesting notation
    
      1 lock held by insmod/68159:
        #0:  (i2c_register_adapter#2){+.+.}, at: i2c_parent_lock_bus+0x32/0x50 [i2c_mux]
    
      stack backtrace:
      CPU: 13 PID: 68159 Comm: insmod Tainted: G           O
      Call Trace:
        dump_stack+0x67/0x98
        __lock_acquire+0x162e/0x1780
        lock_acquire+0xba/0x200
        rt_mutex_lock+0x44/0x60
        i2c_parent_lock_bus+0x32/0x50 [i2c_mux]
        i2c_parent_lock_bus+0x3e/0x50 [i2c_mux]
        i2c_smbus_xfer+0xf0/0x700
        i2c_smbus_read_byte+0x42/0x70
        my2c_init+0xa2/0x1000 [my2c]
        do_one_initcall+0x51/0x192
        do_init_module+0x62/0x216
        load_module+0x20f9/0x2b50
        SYSC_init_module+0x19a/0x1c0
        SyS_init_module+0xe/0x10
        do_syscall_64+0x6c/0x1a0
        entry_SYSCALL_64_after_hwframe+0x42/0xb7
    Reported-by: default avatarJohn Sperbeck <jsperbeck@google.com>
    Tested-by: default avatarJohn Sperbeck <jsperbeck@google.com>
    Signed-off-by: default avatarPeter Rosin <peda@axentia.se>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Deepa Dinamani <deepadinamani@google.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Chang <dpf@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Philippe Ombredanne <pombredanne@nexb.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Wolfram Sang <wsa@the-dreams.de>
    Link: http://lkml.kernel.org/r/20180720083914.1950-3-peda@axentia.seSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    7b94ea50
i2c-core-base.c 62.4 KB