lkml.org 
[lkml]   [2023]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/7] timers/nohz: Restructure and reshuffle struct tick_sched
    Date
    Restructure and group fields by access in order to optimize cache
    layout. While at it, also add missing kernel doc for two fields:
    @last_jiffies and @idle_expires.

    Reported-by: Thomas Gleixner <tglx@linutronix.de>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Hillf Danton <hdanton@sina.com>
    Cc: Yu Liao <liaoyu15@huawei.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Wei Li <liwei391@huawei.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Mirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
    Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
    ---
    kernel/time/tick-sched.h | 66 +++++++++++++++++++++++++---------------
    1 file changed, 41 insertions(+), 25 deletions(-)

    diff --git a/kernel/time/tick-sched.h b/kernel/time/tick-sched.h
    index 504649513399..c6663254d17d 100644
    --- a/kernel/time/tick-sched.h
    +++ b/kernel/time/tick-sched.h
    @@ -22,65 +22,81 @@ enum tick_nohz_mode {

    /**
    * struct tick_sched - sched tick emulation and no idle tick control/stats
    - * @sched_timer: hrtimer to schedule the periodic tick in high
    - * resolution mode
    - * @check_clocks: Notification mechanism about clocksource changes
    - * @nohz_mode: Mode - one state of tick_nohz_mode
    + *
    * @inidle: Indicator that the CPU is in the tick idle mode
    * @tick_stopped: Indicator that the idle tick has been stopped
    * @idle_active: Indicator that the CPU is actively in the tick idle mode;
    * it is reset during irq handling phases.
    - * @do_timer_lst: CPU was the last one doing do_timer before going idle
    + * @do_timer_last: CPU was the last one doing do_timer before going idle
    * @got_idle_tick: Tick timer function has run with @inidle set
    + * @stalled_jiffies: Number of stalled jiffies detected across ticks
    + * @last_tick_jiffies: Value of jiffies seen on last tick
    + * @sched_timer: hrtimer to schedule the periodic tick in high
    + * resolution mode
    * @last_tick: Store the last tick expiry time when the tick
    * timer is modified for nohz sleeps. This is necessary
    * to resume the tick timer operation in the timeline
    * when the CPU returns from nohz sleep.
    * @next_tick: Next tick to be fired when in dynticks mode.
    * @idle_jiffies: jiffies at the entry to idle for idle time accounting
    + * @idle_waketime: Time when the idle was interrupted
    + * @idle_entrytime: Time when the idle call was entered
    + * @nohz_mode: Mode - one state of tick_nohz_mode
    + * @last_jiffies: Base jiffies snapshot when next event was last computed
    + * @timer_expires_base: Base time clock monotonic for @timer_expires
    + * @timer_expires: Anticipated timer expiration time (in case sched tick is stopped)
    + * @next_timer: Expiry time of next expiring timer for debugging purpose only
    + * @idle_expires: Next tick in idle, for debugging purpose only
    * @idle_calls: Total number of idle calls
    * @idle_sleeps: Number of idle calls, where the sched tick was stopped
    - * @idle_entrytime: Time when the idle call was entered
    - * @idle_waketime: Time when the idle was interrupted
    * @idle_exittime: Time when the idle state was left
    * @idle_sleeptime: Sum of the time slept in idle with sched tick stopped
    * @iowait_sleeptime: Sum of the time slept in idle with sched tick stopped, with IO outstanding
    - * @timer_expires: Anticipated timer expiration time (in case sched tick is stopped)
    - * @timer_expires_base: Base time clock monotonic for @timer_expires
    - * @next_timer: Expiry time of next expiring timer for debugging purpose only
    * @tick_dep_mask: Tick dependency mask - is set, if someone needs the tick
    - * @last_tick_jiffies: Value of jiffies seen on last tick
    - * @stalled_jiffies: Number of stalled jiffies detected across ticks
    + * @check_clocks: Notification mechanism about clocksource changes
    */
    struct tick_sched {
    - struct hrtimer sched_timer;
    - unsigned long check_clocks;
    - enum tick_nohz_mode nohz_mode;
    -
    + /* Common flags */
    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;

    + /* Tick handling: jiffies stall check */
    + unsigned int stalled_jiffies;
    + unsigned long last_tick_jiffies;
    +
    + /* Tick handling */
    + struct hrtimer sched_timer;
    ktime_t last_tick;
    ktime_t next_tick;
    unsigned long idle_jiffies;
    - unsigned long idle_calls;
    - unsigned long idle_sleeps;
    - ktime_t idle_entrytime;
    ktime_t idle_waketime;
    - ktime_t idle_exittime;
    - ktime_t idle_sleeptime;
    - ktime_t iowait_sleeptime;
    +
    + /* Idle entry */
    + ktime_t idle_entrytime;
    +
    + /* Tick stop */
    + enum tick_nohz_mode nohz_mode;
    unsigned long last_jiffies;
    - u64 timer_expires;
    u64 timer_expires_base;
    + u64 timer_expires;
    u64 next_timer;
    ktime_t idle_expires;
    + unsigned long idle_calls;
    + unsigned long idle_sleeps;
    +
    + /* Idle exit */
    + ktime_t idle_exittime;
    + ktime_t idle_sleeptime;
    + ktime_t iowait_sleeptime;
    +
    + /* Full dynticks handling */
    atomic_t tick_dep_mask;
    - unsigned long last_tick_jiffies;
    - unsigned int stalled_jiffies;
    +
    + /* Clocksource changes */
    + unsigned long check_clocks;
    };

    extern struct tick_sched *tick_get_tick_sched(int cpu);
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-27 00:28    [W:2.531 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site