lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 090/849] net: hns3: change hclge/hclgevf workqueue to WQ_UNBOUND mode
    Date
    From: Yufeng Mo <moyufeng@huawei.com>

    [ Upstream commit f29da4088fb4eeba457219a931327d1d5f45196a ]

    Currently, the workqueue of hclge/hclgevf is executed on
    the CPU that initiates scheduling requests by default. In
    stress scenarios, the CPU may be busy and workqueue scheduling
    is completed after a long period of time. To avoid this
    situation and implement proper scheduling, use the WQ_UNBOUND
    mode instead. In this way, the workqueue can be performed on
    a relatively idle CPU.

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../hisilicon/hns3/hns3pf/hclge_main.c | 34 +++----------------
    .../hisilicon/hns3/hns3pf/hclge_main.h | 1 -
    .../hisilicon/hns3/hns3vf/hclgevf_main.c | 2 +-
    3 files changed, 6 insertions(+), 31 deletions(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
    index 721eb4e92f618..dc748f2f18434 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
    @@ -2846,33 +2846,28 @@ static void hclge_mbx_task_schedule(struct hclge_dev *hdev)
    {
    if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
    !test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state))
    - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
    - hclge_wq, &hdev->service_task, 0);
    + mod_delayed_work(hclge_wq, &hdev->service_task, 0);
    }

    static void hclge_reset_task_schedule(struct hclge_dev *hdev)
    {
    if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
    !test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
    - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
    - hclge_wq, &hdev->service_task, 0);
    + 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);
    + mod_delayed_work(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) &&
    !test_bit(HCLGE_STATE_RST_FAIL, &hdev->state))
    - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
    - hclge_wq, &hdev->service_task,
    - delay_time);
    + mod_delayed_work(hclge_wq, &hdev->service_task, delay_time);
    }

    static int hclge_get_mac_link_status(struct hclge_dev *hdev, int *link_status)
    @@ -3490,33 +3485,14 @@ static void hclge_get_misc_vector(struct hclge_dev *hdev)
    hdev->num_msi_used += 1;
    }

    -static void hclge_irq_affinity_notify(struct irq_affinity_notify *notify,
    - const cpumask_t *mask)
    -{
    - struct hclge_dev *hdev = container_of(notify, struct hclge_dev,
    - affinity_notify);
    -
    - cpumask_copy(&hdev->affinity_mask, mask);
    -}
    -
    -static void hclge_irq_affinity_release(struct kref *ref)
    -{
    -}
    -
    static void hclge_misc_affinity_setup(struct hclge_dev *hdev)
    {
    irq_set_affinity_hint(hdev->misc_vector.vector_irq,
    &hdev->affinity_mask);
    -
    - hdev->affinity_notify.notify = hclge_irq_affinity_notify;
    - hdev->affinity_notify.release = hclge_irq_affinity_release;
    - irq_set_affinity_notifier(hdev->misc_vector.vector_irq,
    - &hdev->affinity_notify);
    }

    static void hclge_misc_affinity_teardown(struct hclge_dev *hdev)
    {
    - irq_set_affinity_notifier(hdev->misc_vector.vector_irq, NULL);
    irq_set_affinity_hint(hdev->misc_vector.vector_irq, NULL);
    }

    @@ -13040,7 +13016,7 @@ static int hclge_init(void)
    {
    pr_info("%s is initializing\n", HCLGE_NAME);

    - hclge_wq = alloc_workqueue("%s", 0, 0, HCLGE_NAME);
    + hclge_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, HCLGE_NAME);
    if (!hclge_wq) {
    pr_err("%s: failed to create workqueue\n", HCLGE_NAME);
    return -ENOMEM;
    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
    index e446b839a3715..0d0ebb9714234 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
    @@ -942,7 +942,6 @@ struct hclge_dev {

    /* affinity mask and notify for misc interrupt */
    cpumask_t affinity_mask;
    - struct irq_affinity_notify affinity_notify;
    struct hclge_ptp *ptp;
    };

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
    index b8414f684e89d..a1713a1ce6839 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
    @@ -3890,7 +3890,7 @@ static int hclgevf_init(void)
    {
    pr_info("%s is initializing\n", HCLGEVF_NAME);

    - hclgevf_wq = alloc_workqueue("%s", 0, 0, HCLGEVF_NAME);
    + hclgevf_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, HCLGEVF_NAME);
    if (!hclgevf_wq) {
    pr_err("%s: failed to create workqueue\n", HCLGEVF_NAME);
    return -ENOMEM;
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-15 22:38    [W:3.725 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site