[Intel-wired-lan] [PATCH net] ice: Only lock to update netdev dev_addr
G, GurucharanX
gurucharanx.g at intel.com
Tue Aug 24 16:20:21 UTC 2021
> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of
> Brett Creeley
> Sent: Friday, August 20, 2021 12:00 AM
> To: intel-wired-lan at lists.osuosl.org
> Subject: [Intel-wired-lan] [PATCH net] ice: Only lock to update netdev
> dev_addr
>
> commit 3ba7f53f8bf1 ("ice: don't remove netdev->dev_addr from uc sync
> list") introduced calls to netif_addr_lock_bh() and
> netif_addr_unlock_bh() in the driver's ndo_set_mac() callback. This is fine
> since the driver is updated the netdev's dev_addr, but since this is a spinlock,
> the driver cannot sleep when the lock is held.
> Unfortunately the functions to add/delete MAC filters depend on a mutex.
> This was causing a trace with the lock debug kernel config options enabled
> when changing the mac address via iproute.
>
> [ 203.273059] BUG: sleeping function called from invalid context at
> kernel/locking/mutex.c:281 [ 203.273065] in_atomic(): 1, irqs_disabled(): 0,
> non_block: 0, pid: 6698, name: ip [ 203.273068] Preemption disabled at:
> [ 203.273068] [<ffffffffc04aaeab>] ice_set_mac_address+0x8b/0x1c0 [ice]
> [ 203.273097] CPU: 31 PID: 6698 Comm: ip Tainted: G S W I 5.14.0-
> rc4_next-queue_dev-queue-13aug-01094-gaba1e4adb54e #2
> [ 203.273100] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS
> SE5C620.86B.02.01.0010.010620200716 01/06/2020 [ 203.273102] Call Trace:
> [ 203.273107] dump_stack_lvl+0x33/0x42 [ 203.273113] ?
> ice_set_mac_address+0x8b/0x1c0 [ice] [ 203.273124]
> ___might_sleep.cold.150+0xda/0xea [ 203.273131] mutex_lock+0x1c/0x40 [
> 203.273136] ice_remove_mac+0xe3/0x180 [ice] [ 203.273155] ?
> ice_fltr_add_mac_list+0x20/0x20 [ice] [ 203.273175]
> ice_fltr_prepare_mac+0x43/0xa0 [ice] [ 203.273194]
> ice_set_mac_address+0xab/0x1c0 [ice] [ 203.273206]
> dev_set_mac_address+0xb8/0x120 [ 203.273210]
> dev_set_mac_address_user+0x2c/0x50
> [ 203.273212] do_setlink+0x1dd/0x10e0
> [ 203.273217] ? __nla_validate_parse+0x12d/0x1a0 [ 203.273221]
> __rtnl_newlink+0x530/0x910 [ 203.273224] ?
> __kmalloc_node_track_caller+0x17f/0x380
> [ 203.273230] ? preempt_count_add+0x68/0xa0 [ 203.273236] ?
> _raw_spin_lock_irqsave+0x1f/0x30 [ 203.273241] ?
> kmem_cache_alloc_trace+0x4d/0x440 [ 203.273244]
> rtnl_newlink+0x43/0x60 [ 203.273245] rtnetlink_rcv_msg+0x13a/0x380 [
> 203.273248] ? rtnl_calcit.isra.40+0x130/0x130 [ 203.273250]
> netlink_rcv_skb+0x4e/0x100 [ 203.273256] netlink_unicast+0x1a2/0x280 [
> 203.273258] netlink_sendmsg+0x242/0x490 [ 203.273260]
> sock_sendmsg+0x58/0x60 [ 203.273263] ____sys_sendmsg+0x1ef/0x260 [
> 203.273265] ? copy_msghdr_from_user+0x5c/0x90 [ 203.273268] ?
> ____sys_recvmsg+0xe6/0x170 [ 203.273270] ___sys_sendmsg+0x7c/0xc0 [
> 203.273272] ? copy_msghdr_from_user+0x5c/0x90 [ 203.273274] ?
> ___sys_recvmsg+0x89/0xc0 [ 203.273276] ? __netlink_sendskb+0x50/0x50 [
> 203.273278] ? mod_objcg_state+0xee/0x310 [ 203.273282] ?
> __dentry_kill+0x114/0x170 [ 203.273286] ? get_max_files+0x10/0x10 [
> 203.273288] __sys_sendmsg+0x57/0xa0 [ 203.273290]
> do_syscall_64+0x37/0x80 [ 203.273295]
> entry_SYSCALL_64_after_hwframe+0x44/0xae
> [ 203.273296] RIP: 0033:0x7f8edf96e278
> [ 203.273298] Code: 89 02 48 c7 c0 ff ff ff ff eb b5 0f 1f 80 00 00 00 00 f3 0f 1e
> fa 48 8d 05 25 63 2c 00 8b 00 85 c0 75 17 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff
> 77 58 c3 0f 1f 80 00 00 00 00 41 54 41 89 d4 55 [ 203.273300] RSP:
> 002b:00007ffcb8bdac08 EFLAGS: 00000246 ORIG_RAX: 000000000000002e [
> 203.273303] RAX: ffffffffffffffda RBX: 000000006115e0ae RCX:
> 00007f8edf96e278 [ 203.273304] RDX: 0000000000000000 RSI:
> 00007ffcb8bdac70 RDI: 0000000000000003 [ 203.273305] RBP:
> 0000000000000000 R08: 0000000000000001 R09: 00007ffcb8bda5b0 [
> 203.273306] R10: 0000000000000000 R11: 0000000000000246 R12:
> 0000000000000001 [ 203.273306] R13: 0000555e10092020 R14:
> 0000000000000000 R15: 0000000000000005
>
> Fix this by only locking when changing the netdev->dev_addr. Also, make
> sure to restore the old netdev->dev_addr on any failures.
>
> Fixes: 3ba7f53f8bf1 ("ice-linux: don't remove netdev->dev_addr from uc
> sync list")
> Signed-off-by: Brett Creeley <brett.creeley at intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice_main.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
Tested-by: Gurucharan G <gurucharanx.g at intel.com> (A Contingent worker at Intel)
More information about the Intel-wired-lan
mailing list