History

kernel/workqueue: Let rescuers follow unbound wq cpumask changes

When workqueue cpumask changes are committed the associated rescuer (if one exists) affinity is not touched and this might be a problem down the line for isolated setups. Make sure rescuers affinity is updated every time a workqueue cpumask changes, so that rescuers can't break isolation. [longman: set_cpus_allowed_ptr() will block until the designated task is enqueued on an allowed CPU, no wake_up_process() needed. Also use the unbound_effective_cpumask() helper as suggested by Tejun.]

Juri Lelli committed 2 years ago

Commit d64f2fa1 parent 4c065db1 file · +5 −0Browse files

Showing the changes to kernel/workqueue.c (1 of 1 file). Show all

Unified · Split

kernel/workqueue.c+5−0
@@ -5051,6 +5051,11 @@ static void apply_wqattrs_commit(struct apply_wqattrs_ctx *ctx) · 5050 unmodified lines
50515051 /* update node_nr_active->max */
50525052 wq_update_node_max_active(ctx->wq, -1);
50535053
5054+ /* rescuer needs to respect wq cpumask changes */
5055+ if (ctx->wq->rescuer)
5056+ set_cpus_allowed_ptr(ctx->wq->rescuer->task,
5057+ unbound_effective_cpumask(ctx->wq));
5058+
50545059 mutex_unlock(&ctx->wq->mutex);
50555060 }
50565061