diff options
-rw-r--r-- | kernel/rcutree.c | 5 | ||||
-rw-r--r-- | kernel/rcutree.h | 9 | ||||
-rw-r--r-- | kernel/rcutree_plugin.h | 19 |
3 files changed, 33 insertions, 0 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 8807019138c6..4f27b85d8c86 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -224,6 +224,10 @@ EXPORT_SYMBOL_GPL(rcu_note_context_switch); | |||
224 | DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = { | 224 | DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = { |
225 | .dynticks_nesting = DYNTICK_TASK_EXIT_IDLE, | 225 | .dynticks_nesting = DYNTICK_TASK_EXIT_IDLE, |
226 | .dynticks = ATOMIC_INIT(1), | 226 | .dynticks = ATOMIC_INIT(1), |
227 | #ifdef CONFIG_NO_HZ_FULL_SYSIDLE | ||
228 | .dynticks_idle_nesting = DYNTICK_TASK_NEST_VALUE, | ||
229 | .dynticks_idle = ATOMIC_INIT(1), | ||
230 | #endif /* #ifdef CONFIG_NO_HZ_FULL_SYSIDLE */ | ||
227 | }; | 231 | }; |
228 | 232 | ||
229 | static long blimit = 10; /* Maximum callbacks per rcu_do_batch. */ | 233 | static long blimit = 10; /* Maximum callbacks per rcu_do_batch. */ |
@@ -2904,6 +2908,7 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible) | |||
2904 | rdp->blimit = blimit; | 2908 | rdp->blimit = blimit; |
2905 | init_callback_list(rdp); /* Re-enable callbacks on this CPU. */ | 2909 | init_callback_list(rdp); /* Re-enable callbacks on this CPU. */ |
2906 | rdp->dynticks->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE; | 2910 | rdp->dynticks->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE; |
2911 | rcu_sysidle_init_percpu_data(rdp->dynticks); | ||
2907 | atomic_set(&rdp->dynticks->dynticks, | 2912 | atomic_set(&rdp->dynticks->dynticks, |
2908 | (atomic_read(&rdp->dynticks->dynticks) & ~0x1) + 1); | 2913 | (atomic_read(&rdp->dynticks->dynticks) & ~0x1) + 1); |
2909 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 2914 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index cbdeac6cea9e..52d1be108e75 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
@@ -88,6 +88,14 @@ struct rcu_dynticks { | |||
88 | /* Process level is worth LLONG_MAX/2. */ | 88 | /* Process level is worth LLONG_MAX/2. */ |
89 | int dynticks_nmi_nesting; /* Track NMI nesting level. */ | 89 | int dynticks_nmi_nesting; /* Track NMI nesting level. */ |
90 | atomic_t dynticks; /* Even value for idle, else odd. */ | 90 | atomic_t dynticks; /* Even value for idle, else odd. */ |
91 | #ifdef CONFIG_NO_HZ_FULL_SYSIDLE | ||
92 | long long dynticks_idle_nesting; | ||
93 | /* irq/process nesting level from idle. */ | ||
94 | atomic_t dynticks_idle; /* Even value for idle, else odd. */ | ||
95 | /* "Idle" excludes userspace execution. */ | ||
96 | unsigned long dynticks_idle_jiffies; | ||
97 | /* End of last non-NMI non-idle period. */ | ||
98 | #endif /* #ifdef CONFIG_NO_HZ_FULL_SYSIDLE */ | ||
91 | #ifdef CONFIG_RCU_FAST_NO_HZ | 99 | #ifdef CONFIG_RCU_FAST_NO_HZ |
92 | bool all_lazy; /* Are all CPU's CBs lazy? */ | 100 | bool all_lazy; /* Are all CPU's CBs lazy? */ |
93 | unsigned long nonlazy_posted; | 101 | unsigned long nonlazy_posted; |
@@ -545,6 +553,7 @@ static void rcu_boot_init_nocb_percpu_data(struct rcu_data *rdp); | |||
545 | static void rcu_spawn_nocb_kthreads(struct rcu_state *rsp); | 553 | static void rcu_spawn_nocb_kthreads(struct rcu_state *rsp); |
546 | static void rcu_kick_nohz_cpu(int cpu); | 554 | static void rcu_kick_nohz_cpu(int cpu); |
547 | static bool init_nocb_callback_list(struct rcu_data *rdp); | 555 | static bool init_nocb_callback_list(struct rcu_data *rdp); |
556 | static void rcu_sysidle_init_percpu_data(struct rcu_dynticks *rdtp); | ||
548 | 557 | ||
549 | #endif /* #ifndef RCU_TREE_NONCORE */ | 558 | #endif /* #ifndef RCU_TREE_NONCORE */ |
550 | 559 | ||
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index dff86f53ee09..e5baccbd8038 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
@@ -2373,3 +2373,22 @@ static void rcu_kick_nohz_cpu(int cpu) | |||
2373 | smp_send_reschedule(cpu); | 2373 | smp_send_reschedule(cpu); |
2374 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ | 2374 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ |
2375 | } | 2375 | } |
2376 | |||
2377 | |||
2378 | #ifdef CONFIG_NO_HZ_FULL_SYSIDLE | ||
2379 | |||
2380 | /* | ||
2381 | * Initialize dynticks sysidle state for CPUs coming online. | ||
2382 | */ | ||
2383 | static void rcu_sysidle_init_percpu_data(struct rcu_dynticks *rdtp) | ||
2384 | { | ||
2385 | rdtp->dynticks_idle_nesting = DYNTICK_TASK_NEST_VALUE; | ||
2386 | } | ||
2387 | |||
2388 | #else /* #ifdef CONFIG_NO_HZ_FULL_SYSIDLE */ | ||
2389 | |||
2390 | static void rcu_sysidle_init_percpu_data(struct rcu_dynticks *rdtp) | ||
2391 | { | ||
2392 | } | ||
2393 | |||
2394 | #endif /* #else #ifdef CONFIG_NO_HZ_FULL_SYSIDLE */ | ||