• Taehee Yoo's avatar
    bonding: add missing netdev_update_lockdep_key() · 064ff66e
    Taehee Yoo authored
    After bond_release(), netdev_update_lockdep_key() should be called.
    But both ioctl path and attribute path don't call
    netdev_update_lockdep_key().
    This patch adds missing netdev_update_lockdep_key().
    
    Test commands:
        ip link add bond0 type bond
        ip link add bond1 type bond
        ifenslave bond0 bond1
        ifenslave -d bond0 bond1
        ifenslave bond1 bond0
    
    Splat looks like:
    [   29.501182][ T1046] WARNING: possible circular locking dependency detected
    [   29.501945][ T1039] hardirqs last disabled at (1962): [<ffffffffac6c807f>] handle_mm_fault+0x13f/0x700
    [   29.503442][ T1046] 5.5.0+ #322 Not tainted
    [   29.503447][ T1046] ------------------------------------------------------
    [   29.504277][ T1039] softirqs last  enabled at (1180): [<ffffffffade00678>] __do_softirq+0x678/0x981
    [   29.505443][ T1046] ifenslave/1046 is trying to acquire lock:
    [   29.505886][ T1039] softirqs last disabled at (1169): [<ffffffffac19c18a>] irq_exit+0x17a/0x1a0
    [   29.509997][ T1046] ffff88805d5da280 (&dev->addr_list_lock_key#3){+...}, at: dev_mc_sync_multiple+0x95/0x120
    [   29.511243][ T1046]
    [   29.511243][ T1046] but task is already holding lock:
    [   29.512192][ T1046] ffff8880460f2280 (&dev->addr_list_lock_key#4){+...}, at: bond_enslave+0x4482/0x47b0 [bonding]
    [   29.514124][ T1046]
    [   29.514124][ T1046] which lock already depends on the new lock.
    [   29.514124][ T1046]
    [   29.517297][ T1046]
    [   29.517297][ T1046] the existing dependency chain (in reverse order) is:
    [   29.518231][ T1046]
    [   29.518231][ T1046] -> #1 (&dev->addr_list_lock_key#4){+...}:
    [   29.519076][ T1046]        _raw_spin_lock+0x30/0x70
    [   29.519588][ T1046]        dev_mc_sync_multiple+0x95/0x120
    [   29.520208][ T1046]        bond_enslave+0x448d/0x47b0 [bonding]
    [   29.520862][ T1046]        bond_option_slaves_set+0x1a3/0x370 [bonding]
    [   29.521640][ T1046]        __bond_opt_set+0x1ff/0xbb0 [bonding]
    [   29.522438][ T1046]        __bond_opt_set_notify+0x2b/0xf0 [bonding]
    [   29.523251][ T1046]        bond_opt_tryset_rtnl+0x92/0xf0 [bonding]
    [   29.524082][ T1046]        bonding_sysfs_store_option+0x8a/0xf0 [bonding]
    [   29.524959][ T1046]        kernfs_fop_write+0x276/0x410
    [   29.525620][ T1046]        vfs_write+0x197/0x4a0
    [   29.526218][ T1046]        ksys_write+0x141/0x1d0
    [   29.526818][ T1046]        do_syscall_64+0x99/0x4f0
    [   29.527430][ T1046]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
    [   29.528265][ T1046]
    [   29.528265][ T1046] -> #0 (&dev->addr_list_lock_key#3){+...}:
    [   29.529272][ T1046]        __lock_acquire+0x2d8d/0x3de0
    [   29.529935][ T1046]        lock_acquire+0x164/0x3b0
    [   29.530638][ T1046]        _raw_spin_lock+0x30/0x70
    [   29.531187][ T1046]        dev_mc_sync_multiple+0x95/0x120
    [   29.531790][ T1046]        bond_enslave+0x448d/0x47b0 [bonding]
    [   29.532451][ T1046]        bond_option_slaves_set+0x1a3/0x370 [bonding]
    [   29.533163][ T1046]        __bond_opt_set+0x1ff/0xbb0 [bonding]
    [   29.533789][ T1046]        __bond_opt_set_notify+0x2b/0xf0 [bonding]
    [   29.534595][ T1046]        bond_opt_tryset_rtnl+0x92/0xf0 [bonding]
    [   29.535500][ T1046]        bonding_sysfs_store_option+0x8a/0xf0 [bonding]
    [   29.536379][ T1046]        kernfs_fop_write+0x276/0x410
    [   29.537057][ T1046]        vfs_write+0x197/0x4a0
    [   29.537640][ T1046]        ksys_write+0x141/0x1d0
    [   29.538251][ T1046]        do_syscall_64+0x99/0x4f0
    [   29.538870][ T1046]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
    [   29.539659][ T1046]
    [   29.539659][ T1046] other info that might help us debug this:
    [   29.539659][ T1046]
    [   29.540953][ T1046]  Possible unsafe locking scenario:
    [   29.540953][ T1046]
    [   29.541883][ T1046]        CPU0                    CPU1
    [   29.542540][ T1046]        ----                    ----
    [   29.543209][ T1046]   lock(&dev->addr_list_lock_key#4);
    [   29.543880][ T1046]                                lock(&dev->addr_list_lock_key#3);
    [   29.544873][ T1046]                                lock(&dev->addr_list_lock_key#4);
    [   29.545863][ T1046]   lock(&dev->addr_list_lock_key#3);
    [   29.546525][ T1046]
    [   29.546525][ T1046]  *** DEADLOCK ***
    [   29.546525][ T1046]
    [   29.547542][ T1046] 5 locks held by ifenslave/1046:
    [   29.548196][ T1046]  #0: ffff88806044c478 (sb_writers#5){.+.+}, at: vfs_write+0x3bb/0x4a0
    [   29.549248][ T1046]  #1: ffff88805af00890 (&of->mutex){+.+.}, at: kernfs_fop_write+0x1cf/0x410
    [   29.550343][ T1046]  #2: ffff88805b8b54b0 (kn->count#157){.+.+}, at: kernfs_fop_write+0x1f2/0x410
    [   29.551575][ T1046]  #3: ffffffffaecf4cf0 (rtnl_mutex){+.+.}, at: bond_opt_tryset_rtnl+0x5f/0xf0 [bonding]
    [   29.552819][ T1046]  #4: ffff8880460f2280 (&dev->addr_list_lock_key#4){+...}, at: bond_enslave+0x4482/0x47b0 [bonding]
    [   29.554175][ T1046]
    [   29.554175][ T1046] stack backtrace:
    [   29.554907][ T1046] CPU: 0 PID: 1046 Comm: ifenslave Not tainted 5.5.0+ #322
    [   29.555854][ T1046] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
    [   29.557064][ T1046] Call Trace:
    [   29.557504][ T1046]  dump_stack+0x96/0xdb
    [   29.558054][ T1046]  check_noncircular+0x371/0x450
    [   29.558723][ T1046]  ? print_circular_bug.isra.35+0x310/0x310
    [   29.559486][ T1046]  ? hlock_class+0x130/0x130
    [   29.560100][ T1046]  ? __lock_acquire+0x2d8d/0x3de0
    [   29.560761][ T1046]  __lock_acquire+0x2d8d/0x3de0
    [   29.561366][ T1046]  ? register_lock_class+0x14d0/0x14d0
    [   29.562045][ T1046]  ? find_held_lock+0x39/0x1d0
    [   29.562641][ T1046]  lock_acquire+0x164/0x3b0
    [   29.563199][ T1046]  ? dev_mc_sync_multiple+0x95/0x120
    [   29.563872][ T1046]  _raw_spin_lock+0x30/0x70
    [   29.564464][ T1046]  ? dev_mc_sync_multiple+0x95/0x120
    [   29.565146][ T1046]  dev_mc_sync_multiple+0x95/0x120
    [   29.565793][ T1046]  bond_enslave+0x448d/0x47b0 [bonding]
    [   29.566487][ T1046]  ? bond_update_slave_arr+0x940/0x940 [bonding]
    [   29.567279][ T1046]  ? bstr_printf+0xc20/0xc20
    [   29.567857][ T1046]  ? stack_trace_consume_entry+0x160/0x160
    [   29.568614][ T1046]  ? deactivate_slab.isra.77+0x2c5/0x800
    [   29.569320][ T1046]  ? check_chain_key+0x236/0x5d0
    [   29.569939][ T1046]  ? sscanf+0x93/0xc0
    [   29.570442][ T1046]  ? vsscanf+0x1e20/0x1e20
    [   29.571003][ T1046]  bond_option_slaves_set+0x1a3/0x370 [bonding]
    [ ... ]
    
    Fixes: ab92d68f ("net: core: add generic lockdep keys")
    Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    064ff66e
bond_options.c 42 KB