diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index e286e6b6fdf9b..db4a23d07a571 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -600,7 +600,6 @@ asmlinkage void __do_softirq(void); extern void open_softirq(int nr, void (*action)(struct softirq_action *)); extern void softirq_init(void); -extern void softirq_spawn_ksoftirqd(void); extern void __raise_softirq_irqoff(unsigned int nr); extern void raise_softirq_irqoff(unsigned int nr); diff --git a/init/main.c b/init/main.c index a0014b8bae203..65fa2e41a9c09 100644 --- a/init/main.c +++ b/init/main.c @@ -1598,7 +1598,6 @@ static noinline void __init kernel_init_freeable(void) init_mm_internals(); - softirq_spawn_ksoftirqd(); rcu_init_tasks_generic(); do_pre_smp_initcalls(); lockup_detector_init(); diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h index f804afb304135..e99f9e61cc7a3 100644 --- a/kernel/rcu/tasks.h +++ b/kernel/rcu/tasks.h @@ -630,12 +630,15 @@ static void rcu_tasks_wait_gp(struct rcu_tasks *rtp) while (!list_empty(&holdouts)) { bool firstreport; bool needreport; + ktime_t exp; int rtst; /* Slowly back off waiting for holdouts */ set_tasks_gp_state(rtp, RTGS_WAIT_SCAN_HOLDOUTS); - schedule_timeout_idle(fract); - + exp = jiffies_to_nsecs(fract); + __set_current_state(TASK_IDLE); + schedule_hrtimeout_range(&exp, jiffies_to_nsecs(HZ / 2), + HRTIMER_MODE_REL_HARD); if (fract < HZ) fract++; diff --git a/kernel/softirq.c b/kernel/softirq.c index 32c1c503b9d65..22948c2109f5b 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -1037,14 +1037,17 @@ static struct smp_hotplug_thread timer_threads = { .thread_comm = "ktimers/%u", }; -__init void softirq_spawn_ksoftirqd(void) +static __init int spawn_ksoftirqd(void) { cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL, takeover_tasklets); BUG_ON(smpboot_register_percpu_thread(&softirq_threads)); if (IS_ENABLED(CONFIG_PREEMPT_RT)) BUG_ON(smpboot_register_percpu_thread(&timer_threads)); + + return 0; } +early_initcall(spawn_ksoftirqd); /* * [ These __weak aliases are kept in a separate compilation unit, so that diff --git a/localversion-rt b/localversion-rt index 6e44e540b927b..9f7d0bdbffb18 100644 --- a/localversion-rt +++ b/localversion-rt @@ -1 +1 @@ --rt12 +-rt13