112 lines
4.4 KiB
Diff
112 lines
4.4 KiB
Diff
From 06cb892ebf06734ffa1a5d51f0b0efcea5fe00c8 Mon Sep 17 00:00:00 2001
|
|
From: Jiaran Zhang <zhangjiaran@huawei.com>
|
|
Date: Sat, 24 Jul 2021 15:45:08 +0800
|
|
Subject: [PATCH 072/283] net: hns3: add a separate error handling task
|
|
|
|
mainline inclusion
|
|
from mainline-v5.14-rc1
|
|
commit d991452dd7900cf152ffb43db3b1d385e1a01579
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d991452dd7900cf152ffb43db3b1d385e1a01579
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Error handling and recovery logic are intertwined. Error handling (i.e.
|
|
error identification, clearing error sources and initiation of recovery)
|
|
is done in context of reset task. If certain hardware errors get
|
|
delivered during driver init time, which can cause driver init/loading
|
|
to fail.
|
|
|
|
Introduce a separate error handling task to ensure below:
|
|
|
|
1. Reset logic remains independent of the error handling logic.
|
|
2. Add the hclge_errhand_task_schedule to schedule error recovery
|
|
tasks, This will ensure that common misellaneous MSI-X interrupt are
|
|
re-enabled quickly.
|
|
|
|
Signed-off-by: Jiaran Zhang <zhangjiaran@huawei.com>
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
|
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
|
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
---
|
|
.../ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 4 ++--
|
|
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 16 ++++++++++++++++
|
|
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 1 +
|
|
3 files changed, 19 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
|
index 494498629317..18c60ea70fc4 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
|
@@ -1943,8 +1943,8 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
|
|
|
|
if (!test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state)) {
|
|
dev_err(dev,
|
|
- "Can't handle - MSIx error reported during dev init\n");
|
|
- return 0;
|
|
+ "failed to handle msix error during dev init\n");
|
|
+ return -EAGAIN;
|
|
}
|
|
|
|
return hclge_handle_all_hw_msix_error(hdev, reset_requests);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 9634927949f9..8d69e4568baf 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -2752,6 +2752,14 @@ static void hclge_reset_task_schedule(struct hclge_dev *hdev)
|
|
mod_delayed_work(hclge_wq, &hdev->service_task, 0);
|
|
}
|
|
|
|
+static void hclge_errhand_task_schedule(struct hclge_dev *hdev)
|
|
+{
|
|
+ if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
|
|
+ !test_and_set_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state))
|
|
+ mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
|
|
+ hclge_wq, &hdev->service_task, 0);
|
|
+}
|
|
+
|
|
void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time)
|
|
{
|
|
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
|
|
@@ -4174,6 +4182,14 @@ static void hclge_misc_err_recovery(struct hclge_dev *hdev)
|
|
hclge_enable_vector(&hdev->misc_vector, true);
|
|
}
|
|
|
|
+static void hclge_errhand_service_task(struct hclge_dev *hdev)
|
|
+{
|
|
+ if (!test_and_clear_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state))
|
|
+ return;
|
|
+
|
|
+ hclge_misc_err_recovery(hdev);
|
|
+}
|
|
+
|
|
static void hclge_reset_service_task(struct hclge_dev *hdev)
|
|
{
|
|
if (!test_and_clear_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
index 97916f0fdf50..ffe21f617a63 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
@@ -217,6 +217,7 @@ enum HCLGE_DEV_STATE {
|
|
HCLGE_STATE_RST_HANDLING,
|
|
HCLGE_STATE_MBX_SERVICE_SCHED,
|
|
HCLGE_STATE_MBX_HANDLING,
|
|
+ HCLGE_STATE_ERR_SERVICE_SCHED,
|
|
HCLGE_STATE_STATISTICS_UPDATING,
|
|
HCLGE_STATE_CMD_DISABLE,
|
|
HCLGE_STATE_LINK_UPDATING,
|
|
--
|
|
2.34.1
|
|
|