diff options
author | Ingo Molnar <mingo@kernel.org> | 2014-06-18 12:47:03 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-06-18 12:47:03 -0400 |
commit | d490b3e2c23369c6adfa183d18d9a24ced247797 (patch) | |
tree | 3355c2173228ad1986299c84d22d40ce24764390 /include | |
parent | ebe06187bf2aec10d537ce4595e416035367d703 (diff) | |
parent | 3882ec643997757824cd5f25180cd8a787b9dbe1 (diff) |
Merge branch 'timers/nohz-irq-work-v7' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into timers/nohz
Pull nohz updates from Frederic Weisbecker:
" This set moves the nohz kick, used to notify a full dynticks CPU when
events require tick rescheduling, out of the scheduler tick to a
dedicated IPI.
This debloats a bit the scheduler IPI from off-topic work that was
abusing that scheduler fast path for its convenient asynchronous
properties. Now the nohz kick uses irq-work for its own needs.
Of course this implied quite some background infrastructure rework,
including:
* Clean up some irq-work internals
* Implement remote irq-work
* Implement nohz kick on top of remote irq-work
* Move full dynticks timer enqueue notification to new kick
* Move multi-task notification to new kick
* Remove unecessary barriers on multi-task notification
"
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/irq_work.h | 5 | ||||
-rw-r--r-- | include/linux/tick.h | 9 |
2 files changed, 13 insertions, 1 deletions
diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index 19ae05d4b8ec..bf9422c3aefe 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h | |||
@@ -33,6 +33,11 @@ void init_irq_work(struct irq_work *work, void (*func)(struct irq_work *)) | |||
33 | #define DEFINE_IRQ_WORK(name, _f) struct irq_work name = { .func = (_f), } | 33 | #define DEFINE_IRQ_WORK(name, _f) struct irq_work name = { .func = (_f), } |
34 | 34 | ||
35 | bool irq_work_queue(struct irq_work *work); | 35 | bool irq_work_queue(struct irq_work *work); |
36 | |||
37 | #ifdef CONFIG_SMP | ||
38 | bool irq_work_queue_on(struct irq_work *work, int cpu); | ||
39 | #endif | ||
40 | |||
36 | void irq_work_run(void); | 41 | void irq_work_run(void); |
37 | void irq_work_sync(struct irq_work *work); | 42 | void irq_work_sync(struct irq_work *work); |
38 | 43 | ||
diff --git a/include/linux/tick.h b/include/linux/tick.h index b84773cb9f4c..8a4987f2294a 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h | |||
@@ -181,7 +181,13 @@ static inline bool tick_nohz_full_cpu(int cpu) | |||
181 | 181 | ||
182 | extern void tick_nohz_init(void); | 182 | extern void tick_nohz_init(void); |
183 | extern void __tick_nohz_full_check(void); | 183 | extern void __tick_nohz_full_check(void); |
184 | extern void tick_nohz_full_kick(void); | 184 | extern void tick_nohz_full_kick_cpu(int cpu); |
185 | |||
186 | static inline void tick_nohz_full_kick(void) | ||
187 | { | ||
188 | tick_nohz_full_kick_cpu(smp_processor_id()); | ||
189 | } | ||
190 | |||
185 | extern void tick_nohz_full_kick_all(void); | 191 | extern void tick_nohz_full_kick_all(void); |
186 | extern void __tick_nohz_task_switch(struct task_struct *tsk); | 192 | extern void __tick_nohz_task_switch(struct task_struct *tsk); |
187 | #else | 193 | #else |
@@ -189,6 +195,7 @@ static inline void tick_nohz_init(void) { } | |||
189 | static inline bool tick_nohz_full_enabled(void) { return false; } | 195 | static inline bool tick_nohz_full_enabled(void) { return false; } |
190 | static inline bool tick_nohz_full_cpu(int cpu) { return false; } | 196 | static inline bool tick_nohz_full_cpu(int cpu) { return false; } |
191 | static inline void __tick_nohz_full_check(void) { } | 197 | static inline void __tick_nohz_full_check(void) { } |
198 | static inline void tick_nohz_full_kick_cpu(int cpu) { } | ||
192 | static inline void tick_nohz_full_kick(void) { } | 199 | static inline void tick_nohz_full_kick(void) { } |
193 | static inline void tick_nohz_full_kick_all(void) { } | 200 | static inline void tick_nohz_full_kick_all(void) { } |
194 | static inline void __tick_nohz_task_switch(struct task_struct *tsk) { } | 201 | static inline void __tick_nohz_task_switch(struct task_struct *tsk) { } |