Re: [PATCH ath-next] Revert "wifi: ath12k: add panic handler"
Baochen Qiang <[email protected]>
| Newsgroups | org.infradead.lists.ath12k,org.kernel.vger.linux-wireless |
|---|---|
| Message-ID | <[email protected]> |
On 6/12/2026 11:23 AM, Yingying Tang wrote: > This reverts commit 809055628bce824b7fe18331abb65e44d02b0ecf. > > Call trace: > rcu_note_context_switch+0x4c4/0x508 (P) > __schedule+0xbc/0x1204 > schedule+0x34/0x110 > schedule_timeout+0x84/0x11c > __mhi_device_get_sync+0x164/0x228 [mhi] > mhi_device_get_sync+0x1c/0x3c [mhi] > ath12k_wifi7_pci_bus_wake_up+0x20/0x2c [ath12k_wifi7] > ath12k_pci_read32+0x58/0x350 [ath12k] > ath12k_pci_clear_dbg_registers+0x28/0xb8 [ath12k] > ath12k_pci_panic_handler+0x20/0x44 [ath12k] ath12k_core_panic_handler+0x28/0x3c [ath12k] > notifier_call_chain+0x78/0x1c0 > atomic_notifier_call_chain+0x3c/0x5c > > ath12k_core_panic_handler() is invoked via atomic_notifier_call_chain(), > which runs inside an RCU read-side critical section. The current code calls > ath12k_pci_sw_reset() synchronously from this context, which eventually > reaches mhi_device_get_sync() and schedule_timeout(), triggering a voluntary > context switch within RCU. > > Revert change "wifi: ath12k: add panic handler" to avoid this issue. > > Tested-on: WLAN.HMT.1.1.c7-00108-QCAHMTSWPL_V1.0_V2.0_SILICONZ_UPSTREAM-3 incorrect Tested-on: tag format > Fixes: ? > Signed-off-by: Yingying Tang <[email protected]> > --- > drivers/net/wireless/ath/ath12k/core.c | 33 +------------------------- > drivers/net/wireless/ath/ath12k/core.h | 3 --- > drivers/net/wireless/ath/ath12k/hif.h | 9 ------- > drivers/net/wireless/ath/ath12k/pci.c | 8 ------- > 4 files changed, 1 insertion(+), 52 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c > index 1a9866061f82..6705a8a73de1 100644 > --- a/drivers/net/wireless/ath/ath12k/core.c > +++ b/drivers/net/wireless/ath/ath12k/core.c > @@ -1793,29 +1793,6 @@ int ath12k_core_pre_init(struct ath12k_base *ab) > return 0; > } > > -static int ath12k_core_panic_handler(struct notifier_block *nb, > - unsigned long action, void *data) > -{ > - struct ath12k_base *ab = container_of(nb, struct ath12k_base, > - panic_nb); > - > - return ath12k_hif_panic_handler(ab); > -} > - > -static int ath12k_core_panic_notifier_register(struct ath12k_base *ab) > -{ > - ab->panic_nb.notifier_call = ath12k_core_panic_handler; > - > - return atomic_notifier_chain_register(&panic_notifier_list, > - &ab->panic_nb); > -} > - > -static void ath12k_core_panic_notifier_unregister(struct ath12k_base *ab) > -{ > - atomic_notifier_chain_unregister(&panic_notifier_list, > - &ab->panic_nb); > -} > - > static inline > bool ath12k_core_hw_group_create_ready(struct ath12k_hw_group *ag) > { > @@ -2212,18 +2189,13 @@ int ath12k_core_init(struct ath12k_base *ab) > struct ath12k_hw_group *ag; > int ret; > > - ret = ath12k_core_panic_notifier_register(ab); > - if (ret) > - ath12k_warn(ab, "failed to register panic handler: %d\n", ret); > - > mutex_lock(&ath12k_hw_group_mutex); > > ag = ath12k_core_hw_group_assign(ab); > if (!ag) { > mutex_unlock(&ath12k_hw_group_mutex); > ath12k_warn(ab, "unable to get hw group\n"); > - ret = -ENODEV; > - goto err_unregister_notifier; > + return -ENODEV; > } > > mutex_unlock(&ath12k_hw_group_mutex); > @@ -2248,8 +2220,6 @@ int ath12k_core_init(struct ath12k_base *ab) > > err_unassign_hw_group: > ath12k_core_hw_group_unassign(ab); > -err_unregister_notifier: > - ath12k_core_panic_notifier_unregister(ab); > > return ret; > } > @@ -2258,7 +2228,6 @@ void ath12k_core_deinit(struct ath12k_base *ab) > { > ath12k_core_hw_group_destroy(ab->ag); > ath12k_core_hw_group_unassign(ab); > - ath12k_core_panic_notifier_unregister(ab); > } > > void ath12k_core_free(struct ath12k_base *ab) > diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h > index 4edc8f4e0cb5..a81cb3032145 100644 > --- a/drivers/net/wireless/ath/ath12k/core.h > +++ b/drivers/net/wireless/ath/ath12k/core.h > @@ -15,7 +15,6 @@ > #include <linux/ctype.h> > #include <linux/firmware.h> > #include <linux/of_reserved_mem.h> > -#include <linux/panic_notifier.h> > #include <linux/average.h> > #include <linux/of.h> > #include <linux/rhashtable.h> > @@ -1121,8 +1120,6 @@ struct ath12k_base { > > #endif /* CONFIG_ACPI */ > > - struct notifier_block panic_nb; > - > struct ath12k_hw_group *ag; > struct ath12k_wsi_info wsi_info; > enum ath12k_firmware_mode fw_mode; > diff --git a/drivers/net/wireless/ath/ath12k/hif.h b/drivers/net/wireless/ath/ath12k/hif.h > index e8840fab6061..42bb00c13ef3 100644 > --- a/drivers/net/wireless/ath/ath12k/hif.h > +++ b/drivers/net/wireless/ath/ath12k/hif.h > @@ -30,7 +30,6 @@ struct ath12k_hif_ops { > void (*ce_irq_enable)(struct ath12k_base *ab); > void (*ce_irq_disable)(struct ath12k_base *ab); > void (*get_ce_msi_idx)(struct ath12k_base *ab, u32 ce_id, u32 *msi_idx); > - int (*panic_handler)(struct ath12k_base *ab); > void (*coredump_download)(struct ath12k_base *ab); > }; > > @@ -149,14 +148,6 @@ static inline void ath12k_hif_power_down(struct ath12k_base *ab, bool is_suspend > ab->hif.ops->power_down(ab, is_suspend); > } > > -static inline int ath12k_hif_panic_handler(struct ath12k_base *ab) > -{ > - if (!ab->hif.ops->panic_handler) > - return NOTIFY_DONE; > - > - return ab->hif.ops->panic_handler(ab); > -} > - > static inline void ath12k_hif_coredump_download(struct ath12k_base *ab) > { > if (ab->hif.ops->coredump_download) > diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c > index 375277ca2b89..65a780e74d01 100644 > --- a/drivers/net/wireless/ath/ath12k/pci.c > +++ b/drivers/net/wireless/ath/ath12k/pci.c > @@ -1469,13 +1469,6 @@ void ath12k_pci_power_down(struct ath12k_base *ab, bool is_suspend) > ath12k_pci_sw_reset(ab_pci->ab, false); > } > > -static int ath12k_pci_panic_handler(struct ath12k_base *ab) > -{ > - ath12k_pci_sw_reset(ab, false); > - > - return NOTIFY_OK; > -} > - > static const struct ath12k_hif_ops ath12k_pci_hif_ops = { > .start = ath12k_pci_start, > .stop = ath12k_pci_stop, > @@ -1493,7 +1486,6 @@ static const struct ath12k_hif_ops ath12k_pci_hif_ops = { > .ce_irq_enable = ath12k_pci_hif_ce_irq_enable, > .ce_irq_disable = ath12k_pci_hif_ce_irq_disable, > .get_ce_msi_idx = ath12k_pci_get_ce_msi_idx, > - .panic_handler = ath12k_pci_panic_handler, > #ifdef CONFIG_ATH12K_COREDUMP > .coredump_download = ath12k_pci_coredump_download, > #endif