mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
workqueue: Fixes for v6.6-rc5
* Fix access-after-free in pwq allocation error path. * Implicitly ordered unbound workqueues should lose the implicit ordering if an attribute change which isn't compatible with ordered operation is requested. However, attribute changes requested through the sysfs interface weren't doing that leaving no way to override the implicit ordering through the sysfs interface. Fix it. * Other doc and misc updates. -----BEGIN PGP SIGNATURE----- iIQEABYIACwWIQTfIjM1kS57o3GsC/uxYfJx3gVYGQUCZSh9vQ4cdGpAa2VybmVs Lm9yZwAKCRCxYfJx3gVYGTG4AQCklH7aGqSbzGBPuV19gN6q+BPjkNNLTkEtOzW7 3t1gewEAuwGiGr5FwuxCuGhzTUm5dkELFFsKdzYk+Pt7B2M5Pg0= =YQtE -----END PGP SIGNATURE----- Merge tag 'wq-for-6.6-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq Pull workqueue fixes from Tejun Heo: - Fix access-after-free in pwq allocation error path - Implicitly ordered unbound workqueues should lose the implicit ordering if an attribute change which isn't compatible with ordered operation is requested. However, attribute changes requested through the sysfs interface weren't doing that leaving no way to override the implicit ordering through the sysfs interface. Fix it. - Other doc and misc updates * tag 'wq-for-6.6-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: workqueue: fix -Wformat-truncation in create_worker workqueue: Override implicit ordered attribute in workqueue_apply_unbound_cpumask() workqueue: Use the kmem_cache_free() instead of kfree() to release pwq workqueue: doc: Fix function and sysfs path errors workqueue: Fix UAF report by KASAN in pwq_release_workfn()
This commit is contained in:
commit
e5e1170364
@ -244,7 +244,7 @@ unbound worker-pools and only one work item could be active at any given
|
||||
time thus achieving the same ordering property as ST wq.
|
||||
|
||||
In the current implementation the above configuration only guarantees
|
||||
ST behavior within a given NUMA node. Instead ``alloc_ordered_queue()`` should
|
||||
ST behavior within a given NUMA node. Instead ``alloc_ordered_workqueue()`` should
|
||||
be used to achieve system-wide ST behavior.
|
||||
|
||||
|
||||
@ -390,7 +390,7 @@ The default affinity scope can be changed with the module parameter
|
||||
scope can be changed using ``apply_workqueue_attrs()``.
|
||||
|
||||
If ``WQ_SYSFS`` is set, the workqueue will have the following affinity scope
|
||||
related interface files under its ``/sys/devices/virtual/WQ_NAME/``
|
||||
related interface files under its ``/sys/devices/virtual/workqueue/WQ_NAME/``
|
||||
directory.
|
||||
|
||||
``affinity_scope``
|
||||
|
@ -202,7 +202,7 @@ workqueue将自动创建与属性相匹配的后备工作者池。调节并发
|
||||
同的排序属性。
|
||||
|
||||
在目前的实现中,上述配置只保证了特定NUMA节点内的ST行为。相反,
|
||||
``alloc_ordered_queue()`` 应该被用来实现全系统的ST行为。
|
||||
``alloc_ordered_workqueue()`` 应该被用来实现全系统的ST行为。
|
||||
|
||||
|
||||
执行场景示例
|
||||
|
@ -2166,7 +2166,7 @@ static struct worker *create_worker(struct worker_pool *pool)
|
||||
{
|
||||
struct worker *worker;
|
||||
int id;
|
||||
char id_buf[16];
|
||||
char id_buf[23];
|
||||
|
||||
/* ID is needed to determine kthread name */
|
||||
id = ida_alloc(&pool->worker_ida, GFP_KERNEL);
|
||||
@ -4600,12 +4600,22 @@ static int alloc_and_link_pwqs(struct workqueue_struct *wq)
|
||||
}
|
||||
cpus_read_unlock();
|
||||
|
||||
/* for unbound pwq, flush the pwq_release_worker ensures that the
|
||||
* pwq_release_workfn() completes before calling kfree(wq).
|
||||
*/
|
||||
if (ret)
|
||||
kthread_flush_worker(pwq_release_worker);
|
||||
|
||||
return ret;
|
||||
|
||||
enomem:
|
||||
if (wq->cpu_pwq) {
|
||||
for_each_possible_cpu(cpu)
|
||||
kfree(*per_cpu_ptr(wq->cpu_pwq, cpu));
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct pool_workqueue *pwq = *per_cpu_ptr(wq->cpu_pwq, cpu);
|
||||
|
||||
if (pwq)
|
||||
kmem_cache_free(pwq_cache, pwq);
|
||||
}
|
||||
free_percpu(wq->cpu_pwq);
|
||||
wq->cpu_pwq = NULL;
|
||||
}
|
||||
@ -5782,9 +5792,13 @@ static int workqueue_apply_unbound_cpumask(const cpumask_var_t unbound_cpumask)
|
||||
list_for_each_entry(wq, &workqueues, list) {
|
||||
if (!(wq->flags & WQ_UNBOUND))
|
||||
continue;
|
||||
|
||||
/* creating multiple pwqs breaks ordering guarantee */
|
||||
if (wq->flags & __WQ_ORDERED)
|
||||
continue;
|
||||
if (!list_empty(&wq->pwqs)) {
|
||||
if (wq->flags & __WQ_ORDERED_EXPLICIT)
|
||||
continue;
|
||||
wq->flags &= ~__WQ_ORDERED;
|
||||
}
|
||||
|
||||
ctx = apply_wqattrs_prepare(wq, wq->unbound_attrs, unbound_cpumask);
|
||||
if (IS_ERR(ctx)) {
|
||||
|
Loading…
Reference in New Issue
Block a user