diff options
author | Frederic Weisbecker <frederic@kernel.org> | 2018-04-05 22:32:37 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-04-09 05:54:57 -0400 |
commit | 2bc629a692a76b9ee3dab9c303e3f501bece66a4 (patch) | |
tree | 228053069ba53acb9f5e11d5d6c6cfbcc075e460 | |
parent | 87c9fe6ee495f78f36d39cb37f6a714444a093ee (diff) |
nohz: Gather tick_sched booleans under a common flag field
Optimize the space and leave plenty of room for further flags.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
[ rjw: Do not use __this_cpu_read() to access tick_stopped and add
got_idle_tick to avoid overloading inidle ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | kernel/time/tick-sched.c | 12 | ||||
-rw-r--r-- | kernel/time/tick-sched.h | 12 |
2 files changed, 15 insertions, 9 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index edb9d49b4996..a9d5cc7406d3 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -465,7 +465,9 @@ __setup("nohz=", setup_tick_nohz); | |||
465 | 465 | ||
466 | bool tick_nohz_tick_stopped(void) | 466 | bool tick_nohz_tick_stopped(void) |
467 | { | 467 | { |
468 | return __this_cpu_read(tick_cpu_sched.tick_stopped); | 468 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
469 | |||
470 | return ts->tick_stopped; | ||
469 | } | 471 | } |
470 | 472 | ||
471 | bool tick_nohz_tick_stopped_cpu(int cpu) | 473 | bool tick_nohz_tick_stopped_cpu(int cpu) |
@@ -1014,8 +1016,8 @@ bool tick_nohz_idle_got_tick(void) | |||
1014 | { | 1016 | { |
1015 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); | 1017 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
1016 | 1018 | ||
1017 | if (ts->inidle > 1) { | 1019 | if (ts->got_idle_tick) { |
1018 | ts->inidle = 1; | 1020 | ts->got_idle_tick = 0; |
1019 | return true; | 1021 | return true; |
1020 | } | 1022 | } |
1021 | return false; | 1023 | return false; |
@@ -1161,7 +1163,7 @@ static void tick_nohz_handler(struct clock_event_device *dev) | |||
1161 | ktime_t now = ktime_get(); | 1163 | ktime_t now = ktime_get(); |
1162 | 1164 | ||
1163 | if (ts->inidle) | 1165 | if (ts->inidle) |
1164 | ts->inidle = 2; | 1166 | ts->got_idle_tick = 1; |
1165 | 1167 | ||
1166 | dev->next_event = KTIME_MAX; | 1168 | dev->next_event = KTIME_MAX; |
1167 | 1169 | ||
@@ -1261,7 +1263,7 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer) | |||
1261 | ktime_t now = ktime_get(); | 1263 | ktime_t now = ktime_get(); |
1262 | 1264 | ||
1263 | if (ts->inidle) | 1265 | if (ts->inidle) |
1264 | ts->inidle = 2; | 1266 | ts->got_idle_tick = 1; |
1265 | 1267 | ||
1266 | tick_sched_do_timer(now); | 1268 | tick_sched_do_timer(now); |
1267 | 1269 | ||
diff --git a/kernel/time/tick-sched.h b/kernel/time/tick-sched.h index 2b845f2c44b1..6de959a854b2 100644 --- a/kernel/time/tick-sched.h +++ b/kernel/time/tick-sched.h | |||
@@ -41,19 +41,24 @@ enum tick_nohz_mode { | |||
41 | * @timer_expires: Anticipated timer expiration time (in case sched tick is stopped) | 41 | * @timer_expires: Anticipated timer expiration time (in case sched tick is stopped) |
42 | * @timer_expires_base: Base time clock monotonic for @timer_expires | 42 | * @timer_expires_base: Base time clock monotonic for @timer_expires |
43 | * @do_timer_lst: CPU was the last one doing do_timer before going idle | 43 | * @do_timer_lst: CPU was the last one doing do_timer before going idle |
44 | * @got_idle_tick: Tick timer function has run with @inidle set | ||
44 | */ | 45 | */ |
45 | struct tick_sched { | 46 | struct tick_sched { |
46 | struct hrtimer sched_timer; | 47 | struct hrtimer sched_timer; |
47 | unsigned long check_clocks; | 48 | unsigned long check_clocks; |
48 | enum tick_nohz_mode nohz_mode; | 49 | enum tick_nohz_mode nohz_mode; |
50 | |||
51 | unsigned int inidle : 1; | ||
52 | unsigned int tick_stopped : 1; | ||
53 | unsigned int idle_active : 1; | ||
54 | unsigned int do_timer_last : 1; | ||
55 | unsigned int got_idle_tick : 1; | ||
56 | |||
49 | ktime_t last_tick; | 57 | ktime_t last_tick; |
50 | ktime_t next_tick; | 58 | ktime_t next_tick; |
51 | int inidle; | ||
52 | int tick_stopped; | ||
53 | unsigned long idle_jiffies; | 59 | unsigned long idle_jiffies; |
54 | unsigned long idle_calls; | 60 | unsigned long idle_calls; |
55 | unsigned long idle_sleeps; | 61 | unsigned long idle_sleeps; |
56 | int idle_active; | ||
57 | ktime_t idle_entrytime; | 62 | ktime_t idle_entrytime; |
58 | ktime_t idle_waketime; | 63 | ktime_t idle_waketime; |
59 | ktime_t idle_exittime; | 64 | ktime_t idle_exittime; |
@@ -64,7 +69,6 @@ struct tick_sched { | |||
64 | u64 timer_expires_base; | 69 | u64 timer_expires_base; |
65 | u64 next_timer; | 70 | u64 next_timer; |
66 | ktime_t idle_expires; | 71 | ktime_t idle_expires; |
67 | int do_timer_last; | ||
68 | atomic_t tick_dep_mask; | 72 | atomic_t tick_dep_mask; |
69 | }; | 73 | }; |
70 | 74 | ||