Messages in this thread | | | Date | Wed, 10 May 2023 08:33:14 -1000 | From | Tejun Heo <> | Subject | Re: [RFC PATCH 1/4] workqueue: support pausing ordered workqueues |
| |
Hello,
This looks great to me in general.
On Wed, May 10, 2023 at 06:04:25PM +0200, Johannes Berg wrote: > diff --git a/kernel/workqueue.c b/kernel/workqueue.c > index b8b541caed48..418d99ff8325 100644 > --- a/kernel/workqueue.c > +++ b/kernel/workqueue.c > @@ -3863,10 +3863,16 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) > struct workqueue_struct *wq = pwq->wq; > bool freezable = wq->flags & WQ_FREEZABLE; > unsigned long flags; > + int new_max_active; > > - /* for @wq->saved_max_active */ > + /* for @wq->saved_max_active and @wq->flags */ > lockdep_assert_held(&wq->mutex); > > + if (wq->flags & __WQ_PAUSED) > + new_max_active = 0; > + else > + new_max_active = wq->saved_max_active;
Nothing is using new_max_active and I think we can probably combine this with the freezing test.
> +void __workqueue_pause_resume(struct workqueue_struct *wq, bool pause) > +{ > + struct pool_workqueue *pwq; > + > + mutex_lock(&wq->mutex); > + if (pause) > + wq->flags |= __WQ_PAUSED; > + else > + wq->flags &= ~__WQ_PAUSED; > + > + for_each_pwq(pwq, wq) > + pwq_adjust_max_active(pwq); > + mutex_unlock(&wq->mutex); > + > + if (pause) > + flush_workqueue(wq); > +} > +EXPORT_SYMBOL_GPL(__workqueue_pause_resume);
I'd just make pause and resume separate functions. The sharing ratio doesn't seem that high.
Thanks.
-- tejun
| |