Skip to content

Commit cb1b9f7

Browse files
Salil Mehtadavem330
authored andcommitted
net: hns3: Add reset service task for handling reset requests
Existing common service task was being used to service the reset requests. This patch tries to make the handling of reset cleaner by separating task to handle the reset requests. This might in turn help in adapting similar handling approach for other interrupt events like mailbox, sharing vector 0 interrupt. Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: lipeng <lipeng321@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ca1d766 commit cb1b9f7

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,6 +2226,12 @@ static int hclge_mac_init(struct hclge_dev *hdev)
22262226
return hclge_cfg_func_mta_filter(hdev, 0, hdev->accept_mta_mc);
22272227
}
22282228

2229+
static void hclge_reset_task_schedule(struct hclge_dev *hdev)
2230+
{
2231+
if (!test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
2232+
schedule_work(&hdev->rst_service_task);
2233+
}
2234+
22292235
static void hclge_task_schedule(struct hclge_dev *hdev)
22302236
{
22312237
if (!test_bit(HCLGE_STATE_DOWN, &hdev->state) &&
@@ -2421,7 +2427,7 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
24212427
*/
24222428
switch (event_cause) {
24232429
case HCLGE_VECTOR0_EVENT_RST:
2424-
/* reset task to be scheduled here */
2430+
hclge_reset_task_schedule(hdev);
24252431
break;
24262432
default:
24272433
dev_dbg(&hdev->pdev->dev,
@@ -2584,6 +2590,9 @@ static void hclge_do_reset(struct hclge_dev *hdev, enum hnae3_reset_type type)
25842590
case HNAE3_FUNC_RESET:
25852591
dev_info(&pdev->dev, "PF Reset requested\n");
25862592
hclge_func_reset_cmd(hdev, 0);
2593+
/* schedule again to check later */
2594+
set_bit(HNAE3_FUNC_RESET, &hdev->reset_pending);
2595+
hclge_reset_task_schedule(hdev);
25872596
break;
25882597
default:
25892598
dev_warn(&pdev->dev,
@@ -2605,14 +2614,9 @@ static void hclge_reset_event(struct hnae3_handle *handle,
26052614
case HNAE3_FUNC_RESET:
26062615
case HNAE3_CORE_RESET:
26072616
case HNAE3_GLOBAL_RESET:
2608-
if (test_bit(HCLGE_STATE_RESET_INT, &hdev->state)) {
2609-
dev_err(&hdev->pdev->dev, "Already in reset state");
2610-
return;
2611-
}
2612-
hdev->reset_type = reset;
2613-
set_bit(HCLGE_STATE_RESET_INT, &hdev->state);
2614-
set_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
2615-
schedule_work(&hdev->service_task);
2617+
/* request reset & schedule reset task */
2618+
set_bit(reset, &hdev->reset_request);
2619+
hclge_reset_task_schedule(hdev);
26162620
break;
26172621
default:
26182622
dev_warn(&hdev->pdev->dev, "Unsupported reset event:%d", reset);
@@ -2658,17 +2662,26 @@ static void hclge_reset_subtask(struct hclge_dev *hdev)
26582662
hdev->reset_type = HNAE3_NONE_RESET;
26592663
}
26602664

2661-
static void hclge_misc_irq_service_task(struct hclge_dev *hdev)
2665+
static void hclge_reset_service_task(struct work_struct *work)
26622666
{
2667+
struct hclge_dev *hdev =
2668+
container_of(work, struct hclge_dev, rst_service_task);
2669+
2670+
if (test_and_set_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
2671+
return;
2672+
2673+
clear_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state);
2674+
26632675
hclge_reset_subtask(hdev);
2676+
2677+
clear_bit(HCLGE_STATE_RST_HANDLING, &hdev->state);
26642678
}
26652679

26662680
static void hclge_service_task(struct work_struct *work)
26672681
{
26682682
struct hclge_dev *hdev =
26692683
container_of(work, struct hclge_dev, service_task);
26702684

2671-
hclge_misc_irq_service_task(hdev);
26722685
hclge_update_speed_duplex(hdev);
26732686
hclge_update_link_status(hdev);
26742687
hclge_update_stats_for_all(hdev);
@@ -4699,6 +4712,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
46994712
hdev->pdev = pdev;
47004713
hdev->ae_dev = ae_dev;
47014714
hdev->reset_type = HNAE3_NONE_RESET;
4715+
hdev->reset_request = 0;
47024716
hdev->reset_pending = 0;
47034717
ae_dev->priv = hdev;
47044718

@@ -4811,12 +4825,15 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
48114825

48124826
timer_setup(&hdev->service_timer, hclge_service_timer, 0);
48134827
INIT_WORK(&hdev->service_task, hclge_service_task);
4828+
INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task);
48144829

48154830
/* Enable MISC vector(vector0) */
48164831
hclge_enable_vector(&hdev->misc_vector, true);
48174832

48184833
set_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state);
48194834
set_bit(HCLGE_STATE_DOWN, &hdev->state);
4835+
clear_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state);
4836+
clear_bit(HCLGE_STATE_RST_HANDLING, &hdev->state);
48204837

48214838
pr_info("%s driver initialization finished.\n", HCLGE_DRIVER_NAME);
48224839
return 0;
@@ -4928,6 +4945,8 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
49284945
del_timer_sync(&hdev->service_timer);
49294946
if (hdev->service_task.func)
49304947
cancel_work_sync(&hdev->service_task);
4948+
if (hdev->rst_service_task.func)
4949+
cancel_work_sync(&hdev->rst_service_task);
49314950

49324951
if (mac->phydev)
49334952
mdiobus_unregister(mac->mdio_bus);

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ enum HCLGE_DEV_STATE {
9999
HCLGE_STATE_REMOVING,
100100
HCLGE_STATE_SERVICE_INITED,
101101
HCLGE_STATE_SERVICE_SCHED,
102+
HCLGE_STATE_RST_SERVICE_SCHED,
103+
HCLGE_STATE_RST_HANDLING,
102104
HCLGE_STATE_MBX_HANDLING,
103105
HCLGE_STATE_MBX_IRQ,
104106
HCLGE_STATE_RESET_INT,
@@ -426,6 +428,7 @@ struct hclge_dev {
426428
unsigned long state;
427429

428430
enum hnae3_reset_type reset_type;
431+
unsigned long reset_request; /* reset has been requested */
429432
unsigned long reset_pending; /* client rst is pending to be served */
430433
u32 fw_version;
431434
u16 num_vmdq_vport; /* Num vmdq vport this PF has set up */
@@ -476,6 +479,7 @@ struct hclge_dev {
476479
unsigned long service_timer_previous;
477480
struct timer_list service_timer;
478481
struct work_struct service_task;
482+
struct work_struct rst_service_task;
479483

480484
bool cur_promisc;
481485
int num_alloc_vfs; /* Actual number of VFs allocated */

0 commit comments

Comments
 (0)