On Tue, 2024-10-15 at 13:25 +0200, Greg Kroah-Hartman wrote: > 5.15-stable review patch. If anyone has any objections, please let > me know. This patch is buggy and must not be cherry-picked without also having: a09c17240bd ("io_uring/sqpoll: retain test for whether the CPU is valid") 7f44beadcc1 ("io_uring/sqpoll: do not put cpumask on stack") Best regards, Felix Moessbauer > > ------------------ > > From: Felix Moessbauer <felix.moessbauer@xxxxxxxxxxx> > > The submit queue polling threads are userland threads that just never > exit to the userland. When creating the thread with > IORING_SETUP_SQ_AFF, > the affinity of the poller thread is set to the cpu specified in > sq_thread_cpu. However, this CPU can be outside of the cpuset defined > by the cgroup cpuset controller. This violates the rules defined by > the > cpuset controller and is a potential issue for realtime applications. > > In b7ed6d8ffd6 we fixed the default affinity of the poller thread, in > case no explicit pinning is required by inheriting the one of the > creating task. In case of explicit pinning, the check is more > complicated, as also a cpu outside of the parent cpumask is allowed. > We implemented this by using cpuset_cpus_allowed (that has support > for > cgroup cpusets) and testing if the requested cpu is in the set. > > Fixes: 37d1e2e3642e ("io_uring: move SQPOLL thread io-wq forked > worker") > Cc: stable@xxxxxxxxxxxxxxx # 6.1+ > Signed-off-by: Felix Moessbauer <felix.moessbauer@xxxxxxxxxxx> > Link: > https://lore.kernel.org/r/20240909150036.55921-1-felix.moessbauer@xxxxxxxxxxx > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> > Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > --- > io_uring/io_uring.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > --- a/io_uring/io_uring.c > +++ b/io_uring/io_uring.c > @@ -56,6 +56,7 @@ > #include <linux/mm.h> > #include <linux/mman.h> > #include <linux/percpu.h> > +#include <linux/cpuset.h> > #include <linux/slab.h> > #include <linux/blkdev.h> > #include <linux/bvec.h> > @@ -8746,10 +8747,12 @@ static int io_sq_offload_create(struct i > return 0; > > if (p->flags & IORING_SETUP_SQ_AFF) { > + struct cpumask allowed_mask; > int cpu = p->sq_thread_cpu; > > ret = -EINVAL; > - if (cpu >= nr_cpu_ids || !cpu_online(cpu)) > + cpuset_cpus_allowed(current, &allowed_mask); > + if (!cpumask_test_cpu(cpu, &allowed_mask)) > goto err_sqpoll; > sqd->sq_cpu = cpu; > } else { > > -- Siemens AG, Technology Linux Expert Center