Re: [PATCH v2] workqueue: Kick a worker based on the actual activation of delayed works

From: Lai Jiangshan
Date: Thu Nov 19 2020 - 20:45:47 EST


On Thu, Nov 19, 2020 at 2:21 PM Yunfeng Ye <yeyunfeng@xxxxxxxxxx> 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@xxxxxxxxxx>

Reviewed-by: Lai Jiangshan <jiangshanlai@xxxxxxxxx>

> ---
> 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