On Thu, Oct 22, 2026 at 10:38:46AM +0100, Tvrtko Ursulin wrote: > In preparation for adding more sanitization steps split the current ones > into ones which are immutable and the ones which can be modified from > sysfs. > > Point being that the mutable steps must only run on the initial workqueue > creation, while the immutable properties need to be sanitized every time > attributes are applied. > > Signed-off-by: Tvrtko Ursulin <[email protected]> > Cc: Boris Brezillon <[email protected]> > Cc: Bradley Morgan <[email protected]> > Cc: Chia-I Wu <[email protected]> > Cc: Liviu Dudau <[email protected]> > Cc: Matthew Brost <[email protected]> > Cc: Steven Price <[email protected]> > Cc: Tejun Heo <[email protected]>
Reviewed-by: Liviu Dudau <[email protected]> Best regards, Liviu > --- > kernel/workqueue.c | 49 ++++++++++++++++++++++++++++------------------ > 1 file changed, 30 insertions(+), 19 deletions(-) > > diff --git a/kernel/workqueue.c b/kernel/workqueue.c > index d8cf546d853f..c634b20f1874 100644 > --- a/kernel/workqueue.c > +++ b/kernel/workqueue.c > @@ -5706,6 +5706,32 @@ static void apply_wqattrs_cleanup(struct > apply_wqattrs_ctx *ctx) > } > } > > +/* Sanitize attributes not modifiable via sysfs. */ > +static void > +sanitize_immutable_workqueue_attrs(struct workqueue_struct *wq, > + struct workqueue_attrs *attrs) > +{ > + if (wq->flags & __WQ_ORDERED) > + attrs->ordered = true; > +} > + > +/* Sanitize attributes modifiable via sysfs. */ > +static void > +sanitize_mutable_workqueue_attrs(struct workqueue_struct *wq, > + struct workqueue_attrs *attrs) > +{ > + if (wq->flags & WQ_HIGHPRI) > + attrs->nice = HIGHPRI_NICE_LEVEL; > +} > + > +static void > +sanitize_workqueue_attrs(struct workqueue_struct *wq, > + struct workqueue_attrs *attrs) > +{ > + sanitize_immutable_workqueue_attrs(wq, attrs); > + sanitize_mutable_workqueue_attrs(wq, attrs); > +} > + > /* allocate the attrs and pwqs for later installation */ > static struct apply_wqattrs_ctx * > apply_wqattrs_prepare(struct workqueue_struct *wq, > @@ -5735,6 +5761,7 @@ apply_wqattrs_prepare(struct workqueue_struct *wq, > * every possible CPU and never falls back, so it has no default. > */ > copy_workqueue_attrs(new_attrs, attrs); > + sanitize_immutable_workqueue_attrs(wq, new_attrs); > wqattrs_actualize_cpumask(new_attrs, unbound_cpumask); > cpumask_copy(new_attrs->__pod_cpumask, new_attrs->cpumask); > if (!(wq->flags & WQ_PERCPU)) { > @@ -5757,6 +5784,7 @@ apply_wqattrs_prepare(struct workqueue_struct *wq, > > /* save the user configured attrs and sanitize it. */ > copy_workqueue_attrs(new_attrs, attrs); > + sanitize_immutable_workqueue_attrs(wq, new_attrs); > cpumask_and(new_attrs->cpumask, new_attrs->cpumask, cpu_possible_mask); > cpumask_copy(new_attrs->__pod_cpumask, new_attrs->cpumask); > ctx->attrs = new_attrs; > @@ -5919,24 +5947,6 @@ static void unbound_wq_update_pwq(struct > workqueue_struct *wq, int cpu) > put_pwq_unlocked(old_pwq); > } > > -/* the attrs @wq asked for, as spelled by its flags */ > -static struct workqueue_attrs *alloc_wq_std_attrs(struct workqueue_struct > *wq) > -{ > - struct workqueue_attrs *attrs; > - > - attrs = alloc_workqueue_attrs(); > - if (!attrs) > - return NULL; > - > - if (wq->flags & WQ_HIGHPRI) > - attrs->nice = HIGHPRI_NICE_LEVEL; > - > - if (wq->flags & __WQ_ORDERED) > - attrs->ordered = true; > - > - return attrs; > -} > - > static int alloc_and_link_pwqs(struct workqueue_struct *wq) > { > struct workqueue_attrs *attrs; > @@ -5948,10 +5958,11 @@ static int alloc_and_link_pwqs(struct > workqueue_struct *wq) > if (!wq->cpu_pwq) > goto enomem; > > - attrs = alloc_wq_std_attrs(wq); > + attrs = alloc_workqueue_attrs(); > if (!attrs) > goto enomem; > > + sanitize_workqueue_attrs(wq, attrs); > ret = apply_workqueue_attrs_locked(wq, attrs); > free_workqueue_attrs(attrs); > if (ret) > -- > 2.56.0 > -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯
