On Mon, Feb 22, 2021 at 11:21:04AM +0100, Sebastian Andrzej Siewior wrote: > On 2021-02-19 10:33:36 [-0800], Paul E. McKenney wrote: > > For definiteness, here is the first part of the change, posted earlier. > > The commit log needs to be updated. I will post the change that keeps > > the tick going as a reply to this email. > … > > diff --git a/kernel/softirq.c b/kernel/softirq.c > > index 9d71046..ba78e63 100644 > > --- a/kernel/softirq.c > > +++ b/kernel/softirq.c > > @@ -209,7 +209,7 @@ static inline void invoke_softirq(void) > > if (ksoftirqd_running(local_softirq_pending())) > > return; > > > > - if (!force_irqthreads) { > > + if (!force_irqthreads || !__this_cpu_read(ksoftirqd)) { > > #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK > > /* > > * We can safely execute softirq on the current stack if > > @@ -358,8 +358,8 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) > > > > pending = local_softirq_pending(); > > if (pending) { > > - if (time_before(jiffies, end) && !need_resched() && > > - --max_restart) > > + if (!__this_cpu_read(ksoftirqd) || > > + (time_before(jiffies, end) && !need_resched() && --max_restart)) > > goto restart; > > This is hunk shouldn't be needed. The reason for it is probably that the > following wakeup_softirqd() would avoid further invoke_softirq() > performing the actual softirq work. It would leave early due to > ksoftirqd_running(). Unless I'm wrong, any raise_softirq() invocation > outside of an interrupt would do the same. > > I would like PeterZ / tglx to comment on this one. Basically I'm not > sure if it is okay to expect softirqs beeing served and waited on that > early in the boot. > The ksoftirqd threads get spawned during early_initcall() phase. Why not just spawn them one step earlier what is totally safe? I mean before do_pre_smp_initcalls() that calls early callbacks. + spawn_ksoftirqd(); rcu_init_tasks_generic(); do_pre_smp_initcalls(); With such change the spawning will not be depended on linker/compiler i.e. when and in which order an early_initcall(spawn_ksoftirqd) callback is executed. -- Vlad Rezki