hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _TICK_SCHED_H
#define _TICK_SCHED_H
 
#include <linux/hrtimer.h>
 
enum tick_device_mode {
   TICKDEV_MODE_PERIODIC,
   TICKDEV_MODE_ONESHOT,
};
 
struct tick_device {
   struct clock_event_device *evtdev;
   enum tick_device_mode mode;
};
 
enum tick_nohz_mode {
   NOHZ_MODE_INACTIVE,
   NOHZ_MODE_LOWRES,
   NOHZ_MODE_HIGHRES,
};
 
/**
 * 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 resetted during irq handling phases.
 * @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
 * @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_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
 */
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;
   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;
   unsigned long            last_jiffies;
   u64                timer_expires;
   u64                timer_expires_base;
   u64                next_timer;
   ktime_t                idle_expires;
   atomic_t            tick_dep_mask;
};
 
extern struct tick_sched *tick_get_tick_sched(int cpu);
 
extern void tick_setup_sched_timer(void);
#if defined CONFIG_NO_HZ_COMMON || defined CONFIG_HIGH_RES_TIMERS
extern void tick_cancel_sched_timer(int cpu);
#else
static inline void tick_cancel_sched_timer(int cpu) { }
#endif
 
#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
extern int __tick_broadcast_oneshot_control(enum tick_broadcast_state state);
#else
static inline int
__tick_broadcast_oneshot_control(enum tick_broadcast_state state)
{
   return -EBUSY;
}
#endif
 
#endif