@@ -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);
@@ -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();
@@ -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++;
@@ -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
@@ -1 +1 @@
--rt12
+-rt13