lkml.org 
[lkml]   [2019]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 net-next 08/11] net: hns3: make hclge_service use delayed workqueue
    Date
    From: Yunsheng Lin <linyunsheng@huawei.com>

    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 <linyunsheng@huawei.com>
    Reviewed-by: Peng Li <lipeng321@huawei.com>
    Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
    ---
    .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 52 +++++++++-------------
    .../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 3 +-
    2 files changed, 21 insertions(+), 34 deletions(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
    index faf60b4..e804a19 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
    @@ -2515,8 +2515,12 @@ static void hclge_task_schedule(struct hclge_dev *hdev)
    {
    if (!test_bit(HCLGE_STATE_DOWN, &hdev->state) &&
    !test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
    - !test_and_set_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state))
    - (void)schedule_work(&hdev->service_task);
    + !test_and_set_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state)) {
    + hdev->hw_stats.stats_timer++;
    + hdev->fd_arfs_expire_timer++;
    + mod_delayed_work(system_wq, &hdev->service_task,
    + round_jiffies_relative(HZ));
    + }
    }

    static int hclge_get_mac_link_status(struct hclge_dev *hdev)
    @@ -2731,25 +2735,6 @@ static int hclge_get_status(struct hnae3_handle *handle)
    return hdev->hw.mac.link;
    }

    -static void hclge_service_timer(struct timer_list *t)
    -{
    - struct hclge_dev *hdev = from_timer(hdev, t, service_timer);
    -
    - mod_timer(&hdev->service_timer, jiffies + HZ);
    - hdev->hw_stats.stats_timer++;
    - hdev->fd_arfs_expire_timer++;
    - hclge_task_schedule(hdev);
    -}
    -
    -static void hclge_service_complete(struct hclge_dev *hdev)
    -{
    - WARN_ON(!test_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state));
    -
    - /* Flush memory before next watchdog */
    - smp_mb__before_atomic();
    - clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
    -}
    -
    static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
    {
    u32 rst_src_reg, cmdq_src_reg, msix_src_reg;
    @@ -3596,7 +3581,9 @@ static void hclge_update_vport_alive(struct hclge_dev *hdev)
    static void hclge_service_task(struct work_struct *work)
    {
    struct hclge_dev *hdev =
    - container_of(work, struct hclge_dev, service_task);
    + container_of(work, struct hclge_dev, service_task.work);
    +
    + clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);

    if (hdev->hw_stats.stats_timer >= HCLGE_STATS_TIMER_INTERVAL) {
    hclge_update_stats_for_all(hdev);
    @@ -3611,7 +3598,8 @@ static void hclge_service_task(struct work_struct *work)
    hclge_rfs_filter_expire(hdev);
    hdev->fd_arfs_expire_timer = 0;
    }
    - hclge_service_complete(hdev);
    +
    + hclge_task_schedule(hdev);
    }

    struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle)
    @@ -6150,10 +6138,13 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable)
    struct hclge_dev *hdev = vport->back;

    if (enable) {
    - mod_timer(&hdev->service_timer, jiffies + HZ);
    + hclge_task_schedule(hdev);
    } else {
    - del_timer_sync(&hdev->service_timer);
    - cancel_work_sync(&hdev->service_task);
    + /* Set the DOWN flag here to disable the service to be
    + * scheduled again
    + */
    + set_bit(HCLGE_STATE_DOWN, &hdev->state);
    + cancel_delayed_work_sync(&hdev->service_task);
    clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
    }
    }
    @@ -8592,12 +8583,10 @@ static void hclge_state_uninit(struct hclge_dev *hdev)
    set_bit(HCLGE_STATE_DOWN, &hdev->state);
    set_bit(HCLGE_STATE_REMOVING, &hdev->state);

    - if (hdev->service_timer.function)
    - del_timer_sync(&hdev->service_timer);
    if (hdev->reset_timer.function)
    del_timer_sync(&hdev->reset_timer);
    - if (hdev->service_task.func)
    - cancel_work_sync(&hdev->service_task);
    + if (hdev->service_task.work.func)
    + cancel_delayed_work_sync(&hdev->service_task);
    if (hdev->rst_service_task.func)
    cancel_work_sync(&hdev->rst_service_task);
    if (hdev->mbx_service_task.func)
    @@ -8802,9 +8791,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)

    hclge_dcb_ops_set(hdev);

    - timer_setup(&hdev->service_timer, hclge_service_timer, 0);
    timer_setup(&hdev->reset_timer, hclge_reset_timer, 0);
    - INIT_WORK(&hdev->service_task, hclge_service_task);
    + INIT_DELAYED_WORK(&hdev->service_task, hclge_service_task);
    INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task);
    INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task);

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
    index 6a12285..dde8f22 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
    @@ -806,9 +806,8 @@ struct hclge_dev {
    u16 adminq_work_limit; /* Num of admin receive queue desc to process */
    unsigned long service_timer_period;
    unsigned long service_timer_previous;
    - struct timer_list service_timer;
    struct timer_list reset_timer;
    - struct work_struct service_task;
    + struct delayed_work service_task;
    struct work_struct rst_service_task;
    struct work_struct mbx_service_task;

    --
    2.7.4
    \
     
     \ /
      Last update: 2019-07-26 05:28    [W:9.176 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site