nohz: Gather tick_sched booleans under a common flag field
authorFrederic Weisbecker <frederic@kernel.org>
Fri, 6 Apr 2018 02:32:37 +0000 (04:32 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 9 Apr 2018 09:54:57 +0000 (11:54 +0200)
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>
kernel/time/tick-sched.c
kernel/time/tick-sched.h

index edb9d49..a9d5cc7 100644 (file)
@@ -465,7 +465,9 @@ __setup("nohz=", setup_tick_nohz);
 
 bool tick_nohz_tick_stopped(void)
 {
-       return __this_cpu_read(tick_cpu_sched.tick_stopped);
+       struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched);
+
+       return ts->tick_stopped;
 }
 
 bool tick_nohz_tick_stopped_cpu(int cpu)
@@ -1014,8 +1016,8 @@ bool tick_nohz_idle_got_tick(void)
 {
        struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched);
 
-       if (ts->inidle > 1) {
-               ts->inidle = 1;
+       if (ts->got_idle_tick) {
+               ts->got_idle_tick = 0;
                return true;
        }
        return false;
@@ -1161,7 +1163,7 @@ static void tick_nohz_handler(struct clock_event_device *dev)
        ktime_t now = ktime_get();
 
        if (ts->inidle)
-               ts->inidle = 2;
+               ts->got_idle_tick = 1;
 
        dev->next_event = KTIME_MAX;
 
@@ -1261,7 +1263,7 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
        ktime_t now = ktime_get();
 
        if (ts->inidle)
-               ts->inidle = 2;
+               ts->got_idle_tick = 1;
 
        tick_sched_do_timer(now);
 
index 2b845f2..6de959a 100644 (file)
@@ -41,19 +41,24 @@ enum tick_nohz_mode {
  * @timer_expires:     Anticipated timer expiration time (in case sched tick is stopped)
  * @timer_expires_base:        Base time clock monotonic for @timer_expires
  * @do_timer_lst:      CPU was the last one doing do_timer before going idle
+ * @got_idle_tick:     Tick timer function has run with @inidle set
  */
 struct tick_sched {
        struct hrtimer                  sched_timer;
        unsigned long                   check_clocks;
        enum tick_nohz_mode             nohz_mode;
+
+       unsigned int                    inidle          : 1;
+       unsigned int                    tick_stopped    : 1;
+       unsigned int                    idle_active     : 1;
+       unsigned int                    do_timer_last   : 1;
+       unsigned int                    got_idle_tick   : 1;
+
        ktime_t                         last_tick;
        ktime_t                         next_tick;
-       int                             inidle;
-       int                             tick_stopped;
        unsigned long                   idle_jiffies;
        unsigned long                   idle_calls;
        unsigned long                   idle_sleeps;
-       int                             idle_active;
        ktime_t                         idle_entrytime;
        ktime_t                         idle_waketime;
        ktime_t                         idle_exittime;
@@ -64,7 +69,6 @@ struct tick_sched {
        u64                             timer_expires_base;
        u64                             next_timer;
        ktime_t                         idle_expires;
-       int                             do_timer_last;
        atomic_t                        tick_dep_mask;
 };