Commit 0ea68902 authored by Yunsheng Lin's avatar Yunsheng Lin Committed by David S. Miller

net: hns3: allocate WQ with WQ_MEM_RECLAIM flag

The hns3 driver may be used in memory reclaim path when it
is the low level transport of a network file system, so it
needs to guarantee forward progress even under memory pressure.

This patch allocates a private WQ with WQ_MEM_RECLAIM set for
both hclge_main and hclgevf_main modules.
Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ff200099
...@@ -72,6 +72,8 @@ static int hclge_set_default_loopback(struct hclge_dev *hdev); ...@@ -72,6 +72,8 @@ static int hclge_set_default_loopback(struct hclge_dev *hdev);
static struct hnae3_ae_algo ae_algo; static struct hnae3_ae_algo ae_algo;
static struct workqueue_struct *hclge_wq;
static const struct pci_device_id ae_algo_pci_tbl[] = { static const struct pci_device_id ae_algo_pci_tbl[] = {
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_GE), 0}, {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_GE), 0},
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE), 0}, {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE), 0},
...@@ -2668,7 +2670,7 @@ static void hclge_mbx_task_schedule(struct hclge_dev *hdev) ...@@ -2668,7 +2670,7 @@ static void hclge_mbx_task_schedule(struct hclge_dev *hdev)
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) && if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
!test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state)) !test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state))
mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
system_wq, &hdev->service_task, 0); hclge_wq, &hdev->service_task, 0);
} }
static void hclge_reset_task_schedule(struct hclge_dev *hdev) static void hclge_reset_task_schedule(struct hclge_dev *hdev)
...@@ -2676,14 +2678,14 @@ static void hclge_reset_task_schedule(struct hclge_dev *hdev) ...@@ -2676,14 +2678,14 @@ static void hclge_reset_task_schedule(struct hclge_dev *hdev)
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) && if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
!test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state)) !test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
system_wq, &hdev->service_task, 0); hclge_wq, &hdev->service_task, 0);
} }
void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time) void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time)
{ {
if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state)) if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state))
mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
system_wq, &hdev->service_task, hclge_wq, &hdev->service_task,
delay_time); delay_time);
} }
...@@ -10652,6 +10654,12 @@ static int hclge_init(void) ...@@ -10652,6 +10654,12 @@ static int hclge_init(void)
{ {
pr_info("%s is initializing\n", HCLGE_NAME); pr_info("%s is initializing\n", HCLGE_NAME);
hclge_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, HCLGE_NAME);
if (!hclge_wq) {
pr_err("%s: failed to create workqueue\n", HCLGE_NAME);
return -ENOMEM;
}
hnae3_register_ae_algo(&ae_algo); hnae3_register_ae_algo(&ae_algo);
return 0; return 0;
...@@ -10660,6 +10668,7 @@ static int hclge_init(void) ...@@ -10660,6 +10668,7 @@ static int hclge_init(void)
static void hclge_exit(void) static void hclge_exit(void)
{ {
hnae3_unregister_ae_algo(&ae_algo); hnae3_unregister_ae_algo(&ae_algo);
destroy_workqueue(hclge_wq);
} }
module_init(hclge_init); module_init(hclge_init);
module_exit(hclge_exit); module_exit(hclge_exit);
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
static int hclgevf_reset_hdev(struct hclgevf_dev *hdev); static int hclgevf_reset_hdev(struct hclgevf_dev *hdev);
static struct hnae3_ae_algo ae_algovf; static struct hnae3_ae_algo ae_algovf;
static struct workqueue_struct *hclgevf_wq;
static const struct pci_device_id ae_algovf_pci_tbl[] = { static const struct pci_device_id ae_algovf_pci_tbl[] = {
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_VF), 0}, {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_VF), 0},
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_DCB_PFC_VF), 0}, {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_DCB_PFC_VF), 0},
...@@ -1775,7 +1777,7 @@ void hclgevf_reset_task_schedule(struct hclgevf_dev *hdev) ...@@ -1775,7 +1777,7 @@ void hclgevf_reset_task_schedule(struct hclgevf_dev *hdev)
if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) && if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&
!test_and_set_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, !test_and_set_bit(HCLGEVF_STATE_RST_SERVICE_SCHED,
&hdev->state)) &hdev->state))
mod_delayed_work(system_wq, &hdev->service_task, 0); mod_delayed_work(hclgevf_wq, &hdev->service_task, 0);
} }
void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev) void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev)
...@@ -1783,14 +1785,14 @@ void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev) ...@@ -1783,14 +1785,14 @@ void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev)
if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) && if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&
!test_and_set_bit(HCLGEVF_STATE_MBX_SERVICE_SCHED, !test_and_set_bit(HCLGEVF_STATE_MBX_SERVICE_SCHED,
&hdev->state)) &hdev->state))
mod_delayed_work(system_wq, &hdev->service_task, 0); mod_delayed_work(hclgevf_wq, &hdev->service_task, 0);
} }
static void hclgevf_task_schedule(struct hclgevf_dev *hdev, static void hclgevf_task_schedule(struct hclgevf_dev *hdev,
unsigned long delay) unsigned long delay)
{ {
if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state)) if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state))
mod_delayed_work(system_wq, &hdev->service_task, delay); mod_delayed_work(hclgevf_wq, &hdev->service_task, delay);
} }
static void hclgevf_reset_service_task(struct hclgevf_dev *hdev) static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
...@@ -3197,6 +3199,12 @@ static int hclgevf_init(void) ...@@ -3197,6 +3199,12 @@ static int hclgevf_init(void)
{ {
pr_info("%s is initializing\n", HCLGEVF_NAME); pr_info("%s is initializing\n", HCLGEVF_NAME);
hclgevf_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, HCLGEVF_NAME);
if (!hclgevf_wq) {
pr_err("%s: failed to create workqueue\n", HCLGEVF_NAME);
return -ENOMEM;
}
hnae3_register_ae_algo(&ae_algovf); hnae3_register_ae_algo(&ae_algovf);
return 0; return 0;
...@@ -3205,6 +3213,7 @@ static int hclgevf_init(void) ...@@ -3205,6 +3213,7 @@ static int hclgevf_init(void)
static void hclgevf_exit(void) static void hclgevf_exit(void)
{ {
hnae3_unregister_ae_algo(&ae_algovf); hnae3_unregister_ae_algo(&ae_algovf);
destroy_workqueue(hclgevf_wq);
} }
module_init(hclgevf_init); module_init(hclgevf_init);
module_exit(hclgevf_exit); module_exit(hclgevf_exit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment