1#ifndef _LINUX_PSI_TYPES_H
2#define _LINUX_PSI_TYPES_H
3
4#include <linux/kthread.h>
5#include <linux/seqlock.h>
6#include <linux/types.h>
7#include <linux/kref.h>
8#include <linux/wait.h>
9
10#ifdef CONFIG_PSI
11
12
13enum psi_task_count {
14 NR_IOWAIT,
15 NR_MEMSTALL,
16 NR_RUNNING,
17
18
19
20
21
22
23 NR_ONCPU,
24 NR_PSI_TASK_COUNTS = 4,
25};
26
27
28#define TSK_IOWAIT (1 << NR_IOWAIT)
29#define TSK_MEMSTALL (1 << NR_MEMSTALL)
30#define TSK_RUNNING (1 << NR_RUNNING)
31#define TSK_ONCPU (1 << NR_ONCPU)
32
33
34enum psi_res {
35 PSI_IO,
36 PSI_MEM,
37 PSI_CPU,
38 NR_PSI_RESOURCES = 3,
39};
40
41
42
43
44
45
46
47enum psi_states {
48 PSI_IO_SOME,
49 PSI_IO_FULL,
50 PSI_MEM_SOME,
51 PSI_MEM_FULL,
52 PSI_CPU_SOME,
53
54 PSI_NONIDLE,
55 NR_PSI_STATES = 6,
56};
57
58enum psi_aggregators {
59 PSI_AVGS = 0,
60 PSI_POLL,
61 NR_PSI_AGGREGATORS,
62};
63
64struct psi_group_cpu {
65
66
67
68 seqcount_t seq ____cacheline_aligned_in_smp;
69
70
71 unsigned int tasks[NR_PSI_TASK_COUNTS];
72
73
74 u32 state_mask;
75
76
77 u32 times[NR_PSI_STATES];
78
79
80 u64 state_start;
81
82
83
84
85 u32 times_prev[NR_PSI_AGGREGATORS][NR_PSI_STATES]
86 ____cacheline_aligned_in_smp;
87};
88
89
90struct psi_window {
91
92 u64 size;
93
94
95 u64 start_time;
96
97
98 u64 start_value;
99
100
101 u64 prev_growth;
102};
103
104struct psi_trigger {
105
106 enum psi_states state;
107
108
109 u64 threshold;
110
111
112 struct list_head node;
113
114
115 struct psi_group *group;
116
117
118 wait_queue_head_t event_wait;
119
120
121 int event;
122
123
124 struct psi_window win;
125
126
127
128
129
130 u64 last_event_time;
131
132
133 struct kref refcount;
134};
135
136struct psi_group {
137
138 struct mutex avgs_lock;
139
140
141 struct psi_group_cpu __percpu *pcpu;
142
143
144 u64 avg_total[NR_PSI_STATES - 1];
145 u64 avg_last_update;
146 u64 avg_next_update;
147
148
149 struct delayed_work avgs_work;
150
151
152 u64 total[NR_PSI_AGGREGATORS][NR_PSI_STATES - 1];
153 unsigned long avg[NR_PSI_STATES - 1][3];
154
155
156 struct task_struct __rcu *poll_task;
157 struct timer_list poll_timer;
158 wait_queue_head_t poll_wait;
159 atomic_t poll_wakeup;
160
161
162 struct mutex trigger_lock;
163
164
165 struct list_head triggers;
166 u32 nr_triggers[NR_PSI_STATES - 1];
167 u32 poll_states;
168 u64 poll_min_period;
169
170
171 u64 polling_total[NR_PSI_STATES - 1];
172 u64 polling_next_update;
173 u64 polling_until;
174};
175
176#else
177
178struct psi_group { };
179
180#endif
181
182#endif
183