lkml.org 
[lkml]   [2020]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 017/152] bonding: add missing netdev_update_lockdep_key()
    Date
    From: Taehee Yoo <ap420073@gmail.com>

    [ Upstream commit 064ff66e2bef84f1153087612032b5b9eab005bd ]

    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: ab92d68fc22f ("net: core: add generic lockdep keys")
    Signed-off-by: Taehee Yoo <ap420073@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/bonding/bond_main.c | 2 ++
    drivers/net/bonding/bond_options.c | 2 ++
    2 files changed, 4 insertions(+)

    --- a/drivers/net/bonding/bond_main.c
    +++ b/drivers/net/bonding/bond_main.c
    @@ -3550,6 +3550,8 @@ static int bond_do_ioctl(struct net_devi
    case BOND_RELEASE_OLD:
    case SIOCBONDRELEASE:
    res = bond_release(bond_dev, slave_dev);
    + if (!res)
    + netdev_update_lockdep_key(slave_dev);
    break;
    case BOND_SETHWADDR_OLD:
    case SIOCBONDSETHWADDR:
    --- a/drivers/net/bonding/bond_options.c
    +++ b/drivers/net/bonding/bond_options.c
    @@ -1398,6 +1398,8 @@ static int bond_option_slaves_set(struct
    case '-':
    slave_dbg(bond->dev, dev, "Releasing interface\n");
    ret = bond_release(bond->dev, dev);
    + if (!ret)
    + netdev_update_lockdep_key(dev);
    break;

    default:

    \
     
     \ /
      Last update: 2020-03-03 18:55    [W:4.063 / U:0.688 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site