[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJhGHyBBFebdb4=G35KaHWYCs+ASox+br7o-=nabXEm9Y1bqJA@mail.gmail.com>
Date: Fri, 20 Nov 2020 09:45:34 +0800
From: Lai Jiangshan <jiangshanlai@...il.com>
To: Yunfeng Ye <yeyunfeng@...wei.com>
Cc: Tejun Heo <tj@...nel.org>, LKML <linux-kernel@...r.kernel.org>,
Shiyuan Hu <hushiyuan@...wei.com>,
Hewenliang <hewenliang4@...wei.com>
Subject: Re: [PATCH v2] workqueue: Kick a worker based on the actual
activation of delayed works
On Thu, Nov 19, 2020 at 2:21 PM Yunfeng Ye <yeyunfeng@...wei.com> wrote:
>
> In realtime scenario, We do not want to have interference on the
> isolated cpu cores. but when invoking alloc_workqueue() for percpu wq
> on the housekeeping cpu, it kick a kworker on the isolated cpu.
>
> alloc_workqueue
> pwq_adjust_max_active
> wake_up_worker
>
> The comment in pwq_adjust_max_active() said:
> "Need to kick a worker after thawed or an unbound wq's
> max_active is bumped"
>
> So it is unnecessary to kick a kworker for percpu's wq when invoking
> alloc_workqueue(). this patch only kick a worker based on the actual
> activation of delayed works.
>
> Signed-off-by: Yunfeng Ye <yeyunfeng@...wei.com>
Reviewed-by: Lai Jiangshan <jiangshanlai@...il.com>
> ---
> kernel/workqueue.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index c41c3c17b86a..b3c9d6ef7c69 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -3725,17 +3725,25 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq)
> * is updated and visible.
> */
> if (!freezable || !workqueue_freezing) {
> + bool kick = false;
> +
> pwq->max_active = wq->saved_max_active;
>
> while (!list_empty(&pwq->delayed_works) &&
> - pwq->nr_active < pwq->max_active)
> + pwq->nr_active < pwq->max_active) {
> pwq_activate_first_delayed(pwq);
> + kick = true;
> + }
>
> /*
> * Need to kick a worker after thawed or an unbound wq's
> - * max_active is bumped. It's a slow path. Do it always.
> + * max_active is bumped. But in realtime scenario, kick a
> + * worker always will have interference on the isolated
> + * cpu cores. So do it only based on the actual activation
> + * of delayed works.
> */
> - wake_up_worker(pwq->pool);
> + if (kick)
> + wake_up_worker(pwq->pool);
> } else {
> pwq->max_active = 0;
> }
> --
> 2.18.4
Powered by blists - more mailing lists