[PATCH net 6/9] net: hns3: don't auto enable misc vector

Jijie Shao posted 9 patches 1 month, 2 weeks ago
There is a newer version of this series
[PATCH net 6/9] net: hns3: don't auto enable misc vector
Posted by Jijie Shao 1 month, 2 weeks ago
From: Jian Shen <shenjian15@huawei.com>

Currently, there is a time window between misc irq enabled
and service task inited. If an interrupte is reported at
this time, it will cause warning like below:

[   16.324639] Call trace:
[   16.324641]  __queue_delayed_work+0xb8/0xe0
[   16.324643]  mod_delayed_work_on+0x78/0xd0
[   16.324655]  hclge_errhand_task_schedule+0x58/0x90 [hclge]
[   16.324662]  hclge_misc_irq_handle+0x168/0x240 [hclge]
[   16.324666]  __handle_irq_event_percpu+0x64/0x1e0
[   16.324667]  handle_irq_event+0x80/0x170
[   16.324670]  handle_fasteoi_edge_irq+0x110/0x2bc
[   16.324671]  __handle_domain_irq+0x84/0xfc
[   16.324673]  gic_handle_irq+0x88/0x2c0
[   16.324674]  el1_irq+0xb8/0x140
[   16.324677]  arch_cpu_idle+0x18/0x40
[   16.324679]  default_idle_call+0x5c/0x1bc
[   16.324682]  cpuidle_idle_call+0x18c/0x1c4
[   16.324684]  do_idle+0x174/0x17c
[   16.324685]  cpu_startup_entry+0x30/0x6c
[   16.324687]  secondary_start_kernel+0x1a4/0x280
[   16.324688] ---[ end trace 6aa0bff672a964aa ]---

So don't auto enable misc vector when request irq..

Fixes: 7be1b9f3e99f ("net: hns3: make hclge_service use delayed workqueue")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
---
 .../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c   | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index 35c618c794be..07e48145f3fe 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -6,6 +6,7 @@
 #include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
@@ -3779,6 +3780,7 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
 	/* this would be explicitly freed in the end */
 	snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",
 		 HCLGE_NAME, pci_name(hdev->pdev));
+	irq_set_status_flags(hdev->misc_vector.vector_irq, IRQ_NOAUTOEN);
 	ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,
 			  0, hdev->misc_vector.name, hdev);
 	if (ret) {
@@ -11916,9 +11918,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
 
 	hclge_init_rxd_adv_layout(hdev);
 
-	/* Enable MISC vector(vector0) */
-	hclge_enable_vector(&hdev->misc_vector, true);
-
 	ret = hclge_init_wol(hdev);
 	if (ret)
 		dev_warn(&pdev->dev,
@@ -11931,6 +11930,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
 	hclge_state_init(hdev);
 	hdev->last_reset_time = jiffies;
 
+	/* Enable MISC vector(vector0) */
+	enable_irq(hdev->misc_vector.vector_irq);
+	hclge_enable_vector(&hdev->misc_vector, true);
+
 	dev_info(&hdev->pdev->dev, "%s driver initialization finished.\n",
 		 HCLGE_DRIVER_NAME);
 
@@ -12336,7 +12339,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
 
 	/* Disable MISC vector(vector0) */
 	hclge_enable_vector(&hdev->misc_vector, false);
-	synchronize_irq(hdev->misc_vector.vector_irq);
+	disable_irq(hdev->misc_vector.vector_irq);
 
 	/* Disable all hw interrupts */
 	hclge_config_mac_tnl_int(hdev, false);
-- 
2.33.0
Re: [PATCH net 6/9] net: hns3: don't auto enable misc vector
Posted by Jakub Kicinski 1 month, 1 week ago
On Fri, 11 Oct 2024 17:45:18 +0800 Jijie Shao wrote:
> +	irq_set_status_flags(hdev->misc_vector.vector_irq, IRQ_NOAUTOEN);
>  	ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,

You can pass IRQF_NO_AUTOEN to request_irq() instead, no?
Re: [PATCH net 6/9] net: hns3: don't auto enable misc vector
Posted by Jijie Shao 1 month, 1 week ago
on 2024/10/16 9:22, Jakub Kicinski wrote:
> On Fri, 11 Oct 2024 17:45:18 +0800 Jijie Shao wrote:
>> +	irq_set_status_flags(hdev->misc_vector.vector_irq, IRQ_NOAUTOEN);
>>   	ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,
> You can pass IRQF_NO_AUTOEN to request_irq() instead, no?

Yeah, I wil fix it in V2

Thanks
Jijie Shao