Skip to content

Commit 7be1b9f

Browse files
Yunsheng Lindavem330
authored andcommitted
net: hns3: make hclge_service use delayed workqueue
Use delayed work instead of using timers to trigger the hclge_serive. Simplify the code with one less middle function and in order to support misc irq affinity. Signed-off-by: Yunsheng Lin <[email protected]> Reviewed-by: Peng Li <[email protected]> Signed-off-by: Huazhong Tan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1c82294 commit 7be1b9f

File tree

2 files changed

+21
-34
lines changed

2 files changed

+21
-34
lines changed

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

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2513,8 +2513,12 @@ static void hclge_task_schedule(struct hclge_dev *hdev)
25132513
{
25142514
if (!test_bit(HCLGE_STATE_DOWN, &hdev->state) &&
25152515
!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
2516-
!test_and_set_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state))
2517-
(void)schedule_work(&hdev->service_task);
2516+
!test_and_set_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state)) {
2517+
hdev->hw_stats.stats_timer++;
2518+
hdev->fd_arfs_expire_timer++;
2519+
mod_delayed_work(system_wq, &hdev->service_task,
2520+
round_jiffies_relative(HZ));
2521+
}
25182522
}
25192523

25202524
static int hclge_get_mac_link_status(struct hclge_dev *hdev)
@@ -2729,25 +2733,6 @@ static int hclge_get_status(struct hnae3_handle *handle)
27292733
return hdev->hw.mac.link;
27302734
}
27312735

2732-
static void hclge_service_timer(struct timer_list *t)
2733-
{
2734-
struct hclge_dev *hdev = from_timer(hdev, t, service_timer);
2735-
2736-
mod_timer(&hdev->service_timer, jiffies + HZ);
2737-
hdev->hw_stats.stats_timer++;
2738-
hdev->fd_arfs_expire_timer++;
2739-
hclge_task_schedule(hdev);
2740-
}
2741-
2742-
static void hclge_service_complete(struct hclge_dev *hdev)
2743-
{
2744-
WARN_ON(!test_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state));
2745-
2746-
/* Flush memory before next watchdog */
2747-
smp_mb__before_atomic();
2748-
clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
2749-
}
2750-
27512736
static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
27522737
{
27532738
u32 rst_src_reg, cmdq_src_reg, msix_src_reg;
@@ -3594,7 +3579,9 @@ static void hclge_update_vport_alive(struct hclge_dev *hdev)
35943579
static void hclge_service_task(struct work_struct *work)
35953580
{
35963581
struct hclge_dev *hdev =
3597-
container_of(work, struct hclge_dev, service_task);
3582+
container_of(work, struct hclge_dev, service_task.work);
3583+
3584+
clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
35983585

35993586
if (hdev->hw_stats.stats_timer >= HCLGE_STATS_TIMER_INTERVAL) {
36003587
hclge_update_stats_for_all(hdev);
@@ -3609,7 +3596,8 @@ static void hclge_service_task(struct work_struct *work)
36093596
hclge_rfs_filter_expire(hdev);
36103597
hdev->fd_arfs_expire_timer = 0;
36113598
}
3612-
hclge_service_complete(hdev);
3599+
3600+
hclge_task_schedule(hdev);
36133601
}
36143602

36153603
struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle)
@@ -6148,10 +6136,13 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable)
61486136
struct hclge_dev *hdev = vport->back;
61496137

61506138
if (enable) {
6151-
mod_timer(&hdev->service_timer, jiffies + HZ);
6139+
hclge_task_schedule(hdev);
61526140
} else {
6153-
del_timer_sync(&hdev->service_timer);
6154-
cancel_work_sync(&hdev->service_task);
6141+
/* Set the DOWN flag here to disable the service to be
6142+
* scheduled again
6143+
*/
6144+
set_bit(HCLGE_STATE_DOWN, &hdev->state);
6145+
cancel_delayed_work_sync(&hdev->service_task);
61556146
clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
61566147
}
61576148
}
@@ -8590,12 +8581,10 @@ static void hclge_state_uninit(struct hclge_dev *hdev)
85908581
set_bit(HCLGE_STATE_DOWN, &hdev->state);
85918582
set_bit(HCLGE_STATE_REMOVING, &hdev->state);
85928583

8593-
if (hdev->service_timer.function)
8594-
del_timer_sync(&hdev->service_timer);
85958584
if (hdev->reset_timer.function)
85968585
del_timer_sync(&hdev->reset_timer);
8597-
if (hdev->service_task.func)
8598-
cancel_work_sync(&hdev->service_task);
8586+
if (hdev->service_task.work.func)
8587+
cancel_delayed_work_sync(&hdev->service_task);
85998588
if (hdev->rst_service_task.func)
86008589
cancel_work_sync(&hdev->rst_service_task);
86018590
if (hdev->mbx_service_task.func)
@@ -8800,9 +8789,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
88008789

88018790
hclge_dcb_ops_set(hdev);
88028791

8803-
timer_setup(&hdev->service_timer, hclge_service_timer, 0);
88048792
timer_setup(&hdev->reset_timer, hclge_reset_timer, 0);
8805-
INIT_WORK(&hdev->service_task, hclge_service_task);
8793+
INIT_DELAYED_WORK(&hdev->service_task, hclge_service_task);
88068794
INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task);
88078795
INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task);
88088796

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -806,9 +806,8 @@ struct hclge_dev {
806806
u16 adminq_work_limit; /* Num of admin receive queue desc to process */
807807
unsigned long service_timer_period;
808808
unsigned long service_timer_previous;
809-
struct timer_list service_timer;
810809
struct timer_list reset_timer;
811-
struct work_struct service_task;
810+
struct delayed_work service_task;
812811
struct work_struct rst_service_task;
813812
struct work_struct mbx_service_task;
814813

0 commit comments

Comments
 (0)