projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
a683f39
)
timers: Only wake softirq if necessary
author
Thomas Gleixner
<
[email protected]
>
Mon, 4 Jul 2016 09:50:37 +0000
(09:50 +0000)
committer
Ingo Molnar
<
[email protected]
>
Thu, 7 Jul 2016 08:35:11 +0000
(10:35 +0200)
With the wheel forwading in place and with the HZ=1000 4ms folding we can
avoid running the softirq at all.
Signed-off-by: Thomas Gleixner <
[email protected]
>
Cc: Arjan van de Ven <
[email protected]
>
Cc: Chris Mason <
[email protected]
>
Cc: Frederic Weisbecker <
[email protected]
>
Cc: George Spelvin <
[email protected]
>
Cc: Josh Triplett <
[email protected]
>
Cc: Len Brown <
[email protected]
>
Cc: Linus Torvalds <
[email protected]
>
Cc: Paul McKenney <
[email protected]
>
Cc: Peter Zijlstra <
[email protected]
>
Cc: Rik van Riel <
[email protected]
>
Cc:
[email protected]
Link:
http://lkml.kernel.org/r/
[email protected]
Signed-off-by: Ingo Molnar <
[email protected]
>
kernel/time/timer.c
patch
|
blob
|
history
diff --git
a/kernel/time/timer.c
b/kernel/time/timer.c
index 9339d71ee998ccd2fc73f9cfdacfa5b4321d5cd6..8d830f1f6a6acd45ecd8fa2176dc670402574869 100644
(file)
--- a/
kernel/time/timer.c
+++ b/
kernel/time/timer.c
@@
-1608,7
+1608,18
@@
static void run_timer_softirq(struct softirq_action *h)
*/
void run_local_timers(void)
{
+ struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
+
hrtimer_run_queues();
+ /* Raise the softirq only if required. */
+ if (time_before(jiffies, base->clk)) {
+ if (!IS_ENABLED(CONFIG_NO_HZ_COMMON) || !base->nohz_active)
+ return;
+ /* CPU is awake, so check the deferrable base. */
+ base++;
+ if (time_before(jiffies, base->clk))
+ return;
+ }
raise_softirq(TIMER_SOFTIRQ);
}