On Wed, Jul 22, 2020 at 02:58:24PM +0000, Alex Belits wrote: > From: Yuri Norov <ynorov@xxxxxxxxxxx> > > If CPU runs isolated task, there's no any backlog on it, and > so we don't need to flush it. What guarantees that we have no backlog on it? > Currently flush_all_backlogs() > enqueues corresponding work on all CPUs including ones that run > isolated tasks. It leads to breaking task isolation for nothing. > > In this patch, backlog flushing is enqueued only on non-isolated CPUs. > > Signed-off-by: Yuri Norov <ynorov@xxxxxxxxxxx> > [abelits@xxxxxxxxxxx: use safe task_isolation_on_cpu() implementation] > Signed-off-by: Alex Belits <abelits@xxxxxxxxxxx> > --- > net/core/dev.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/net/core/dev.c b/net/core/dev.c > index 90b59fc50dc9..83a282f7453d 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -74,6 +74,7 @@ > #include <linux/cpu.h> > #include <linux/types.h> > #include <linux/kernel.h> > +#include <linux/isolation.h> > #include <linux/hash.h> > #include <linux/slab.h> > #include <linux/sched.h> > @@ -5624,9 +5625,13 @@ static void flush_all_backlogs(void) > > get_online_cpus(); > > - for_each_online_cpu(cpu) > + smp_rmb(); What is it ordering? > + for_each_online_cpu(cpu) { > + if (task_isolation_on_cpu(cpu)) > + continue; > queue_work_on(cpu, system_highpri_wq, > per_cpu_ptr(&flush_works, cpu)); > + } > > for_each_online_cpu(cpu) > flush_work(per_cpu_ptr(&flush_works, cpu)); Thanks.