| From foo@baz Sun 01 Mar 2020 10:24:06 AM CET |
| From: Taehee Yoo <ap420073@gmail.com> |
| Date: Sat, 15 Feb 2020 10:50:08 +0000 |
| Subject: bonding: add missing netdev_update_lockdep_key() |
| |
| 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 |
| @@ -3640,6 +3640,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: |