From: Greg Kroah-Hartman Date: Tue, 4 May 2021 07:26:05 +0000 (+0200) Subject: 4.4-stable patches X-Git-Tag: v4.19.190~40 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ef32222c5ba870fb1c39c8da813e8de49921fd30;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: iwlwifi-fix-softirq-hardirq-disabling-in-iwl_pcie_enqueue_hcmd.patch --- diff --git a/queue-4.4/iwlwifi-fix-softirq-hardirq-disabling-in-iwl_pcie_enqueue_hcmd.patch b/queue-4.4/iwlwifi-fix-softirq-hardirq-disabling-in-iwl_pcie_enqueue_hcmd.patch new file mode 100644 index 00000000000..23e515728e2 --- /dev/null +++ b/queue-4.4/iwlwifi-fix-softirq-hardirq-disabling-in-iwl_pcie_enqueue_hcmd.patch @@ -0,0 +1,138 @@ +From 2800aadc18a64c96b051bcb7da8a7df7d505db3f Mon Sep 17 00:00:00 2001 +From: Jiri Kosina +Date: Tue, 2 Mar 2021 11:26:55 +0100 +Subject: iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd() + +From: Jiri Kosina + +commit 2800aadc18a64c96b051bcb7da8a7df7d505db3f upstream. + +It's possible for iwl_pcie_enqueue_hcmd() to be called with hard IRQs +disabled (e.g. from LED core). We can't enable BHs in such a situation. + +Turn the unconditional BH-enable/BH-disable code into +hardirq-disable/conditional-enable. + +This fixes the warning below. + + WARNING: CPU: 1 PID: 1139 at kernel/softirq.c:178 __local_bh_enable_ip+0xa5/0xf0 + CPU: 1 PID: 1139 Comm: NetworkManager Not tainted 5.12.0-rc1-00004-gb4ded168af79 #7 + Hardware name: LENOVO 20K5S22R00/20K5S22R00, BIOS R0IET38W (1.16 ) 05/31/2017 + RIP: 0010:__local_bh_enable_ip+0xa5/0xf0 + Code: f7 69 e8 ee 23 14 00 fb 66 0f 1f 44 00 00 65 8b 05 f0 f4 f7 69 85 c0 74 3f 48 83 c4 08 5b c3 65 8b 05 9b fe f7 69 85 c0 75 8e <0f> 0b eb 8a 48 89 3c 24 e8 4e 20 14 00 48 8b 3c 24 eb 91 e8 13 4e + RSP: 0018:ffffafd580b13298 EFLAGS: 00010046 + RAX: 0000000000000000 RBX: 0000000000000201 RCX: 0000000000000000 + RDX: 0000000000000003 RSI: 0000000000000201 RDI: ffffffffc1272389 + RBP: ffff96517ae4c018 R08: 0000000000000001 R09: 0000000000000000 + R10: ffffafd580b13178 R11: 0000000000000001 R12: ffff96517b060000 + R13: 0000000000000000 R14: ffffffff80000000 R15: 0000000000000001 + FS: 00007fc604ebefc0(0000) GS:ffff965267480000(0000) knlGS:0000000000000000 + CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + CR2: 000055fb3fef13b2 CR3: 0000000109112004 CR4: 00000000003706e0 + Call Trace: + ? _raw_spin_unlock_bh+0x1f/0x30 + iwl_pcie_enqueue_hcmd+0x5d9/0xa00 [iwlwifi] + iwl_trans_txq_send_hcmd+0x6c/0x430 [iwlwifi] + iwl_trans_send_cmd+0x88/0x170 [iwlwifi] + ? lock_acquire+0x277/0x3d0 + iwl_mvm_send_cmd+0x32/0x80 [iwlmvm] + iwl_mvm_led_set+0xc2/0xe0 [iwlmvm] + ? led_trigger_event+0x46/0x70 + led_trigger_event+0x46/0x70 + ieee80211_do_open+0x5c5/0xa20 [mac80211] + ieee80211_open+0x67/0x90 [mac80211] + __dev_open+0xd4/0x150 + __dev_change_flags+0x19e/0x1f0 + dev_change_flags+0x23/0x60 + do_setlink+0x30d/0x1230 + ? lock_is_held_type+0xb4/0x120 + ? __nla_validate_parse.part.7+0x57/0xcb0 + ? __lock_acquire+0x2e1/0x1a50 + __rtnl_newlink+0x560/0x910 + ? __lock_acquire+0x2e1/0x1a50 + ? __lock_acquire+0x2e1/0x1a50 + ? lock_acquire+0x277/0x3d0 + ? sock_def_readable+0x5/0x290 + ? lock_is_held_type+0xb4/0x120 + ? find_held_lock+0x2d/0x90 + ? sock_def_readable+0xb3/0x290 + ? lock_release+0x166/0x2a0 + ? lock_is_held_type+0x90/0x120 + rtnl_newlink+0x47/0x70 + rtnetlink_rcv_msg+0x25c/0x470 + ? netlink_deliver_tap+0x97/0x3e0 + ? validate_linkmsg+0x350/0x350 + netlink_rcv_skb+0x50/0x100 + netlink_unicast+0x1b2/0x280 + netlink_sendmsg+0x336/0x450 + sock_sendmsg+0x5b/0x60 + ____sys_sendmsg+0x1ed/0x250 + ? copy_msghdr_from_user+0x5c/0x90 + ___sys_sendmsg+0x88/0xd0 + ? lock_is_held_type+0xb4/0x120 + ? find_held_lock+0x2d/0x90 + ? lock_release+0x166/0x2a0 + ? __fget_files+0xfe/0x1d0 + ? __sys_sendmsg+0x5e/0xa0 + __sys_sendmsg+0x5e/0xa0 + ? lockdep_hardirqs_on_prepare+0xd9/0x170 + do_syscall_64+0x33/0x80 + entry_SYSCALL_64_after_hwframe+0x44/0xae + RIP: 0033:0x7fc605c9572d + Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 da ee ff ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 33 44 89 c7 48 89 44 24 08 e8 2e ef ff ff 48 + RSP: 002b:00007fffc83789f0 EFLAGS: 00000293 ORIG_RAX: 000000000000002e + RAX: ffffffffffffffda RBX: 000055ef468570c0 RCX: 00007fc605c9572d + RDX: 0000000000000000 RSI: 00007fffc8378a30 RDI: 000000000000000c + RBP: 0000000000000010 R08: 0000000000000000 R09: 0000000000000000 + R10: 0000000000000000 R11: 0000000000000293 R12: 0000000000000000 + R13: 00007fffc8378b80 R14: 00007fffc8378b7c R15: 0000000000000000 + irq event stamp: 170785 + hardirqs last enabled at (170783): [] __local_bh_enable_ip+0x82/0xf0 + hardirqs last disabled at (170784): [] _raw_read_lock_irqsave+0x8d/0x90 + softirqs last enabled at (170782): [] iwl_pcie_enqueue_hcmd+0x5d9/0xa00 [iwlwifi] + softirqs last disabled at (170785): [] iwl_pcie_enqueue_hcmd+0x116/0xa00 [iwlwifi] + +Signed-off-by: Jiri Kosina +Tested-by: Sedat Dilek # LLVM/Clang v12.0.0-rc3 +Acked-by: Luca Coelho +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/nycvar.YFH.7.76.2103021125430.12405@cbobk.fhfr.pm +Signed-off-by: Jari Ruusu +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlwifi/pcie/tx.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/iwlwifi/pcie/tx.c +@@ -1341,6 +1341,7 @@ static int iwl_pcie_enqueue_hcmd(struct + u32 cmd_pos; + const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD]; + u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD]; ++ unsigned long flags2; + + if (WARN(!trans_pcie->wide_cmd_header && + group_id > IWL_ALWAYS_LONG_GROUP, +@@ -1423,10 +1424,10 @@ static int iwl_pcie_enqueue_hcmd(struct + goto free_dup_buf; + } + +- spin_lock_bh(&txq->lock); ++ spin_lock_irqsave(&txq->lock, flags2); + + if (iwl_queue_space(q) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) { +- spin_unlock_bh(&txq->lock); ++ spin_unlock_irqrestore(&txq->lock, flags2); + + IWL_ERR(trans, "No space in command queue\n"); + iwl_op_mode_cmd_queue_full(trans->op_mode); +@@ -1588,7 +1589,7 @@ static int iwl_pcie_enqueue_hcmd(struct + spin_unlock_irqrestore(&trans_pcie->reg_lock, flags); + + out: +- spin_unlock_bh(&txq->lock); ++ spin_unlock_irqrestore(&txq->lock, flags2); + free_dup_buf: + if (idx < 0) + kfree(dup_buf); diff --git a/queue-4.4/series b/queue-4.4/series index 65d724b92dd..2e8f578be22 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -1,2 +1,3 @@ timerfd-reject-alarm-timerfds-without-cap_wake_alarm.patch net-usb-ax88179_178a-initialize-local-variables-before-use.patch +iwlwifi-fix-softirq-hardirq-disabling-in-iwl_pcie_enqueue_hcmd.patch