On Thu, Nov 19, 2020 at 2:21 PM Yunfeng Ye <yeyunf...@huawei.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 <yeyunf...@huawei.com>
Reviewed-by: Lai Jiangshan <jiangshan...@gmail.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