0001
0002 #ifndef _LINUX_PSI_TYPES_H
0003 #define _LINUX_PSI_TYPES_H
0004
0005 #include <linux/kthread.h>
0006 #include <linux/seqlock.h>
0007 #include <linux/types.h>
0008 #include <linux/kref.h>
0009 #include <linux/wait.h>
0010
0011 #ifdef CONFIG_PSI
0012
0013
0014 enum psi_task_count {
0015 NR_IOWAIT,
0016 NR_MEMSTALL,
0017 NR_RUNNING,
0018
0019
0020
0021
0022
0023
0024 NR_ONCPU,
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 NR_MEMSTALL_RUNNING,
0035 NR_PSI_TASK_COUNTS = 5,
0036 };
0037
0038
0039 #define TSK_IOWAIT (1 << NR_IOWAIT)
0040 #define TSK_MEMSTALL (1 << NR_MEMSTALL)
0041 #define TSK_RUNNING (1 << NR_RUNNING)
0042 #define TSK_ONCPU (1 << NR_ONCPU)
0043 #define TSK_MEMSTALL_RUNNING (1 << NR_MEMSTALL_RUNNING)
0044
0045
0046 enum psi_res {
0047 PSI_IO,
0048 PSI_MEM,
0049 PSI_CPU,
0050 NR_PSI_RESOURCES = 3,
0051 };
0052
0053
0054
0055
0056
0057
0058
0059 enum psi_states {
0060 PSI_IO_SOME,
0061 PSI_IO_FULL,
0062 PSI_MEM_SOME,
0063 PSI_MEM_FULL,
0064 PSI_CPU_SOME,
0065 PSI_CPU_FULL,
0066
0067 PSI_NONIDLE,
0068 NR_PSI_STATES = 7,
0069 };
0070
0071 enum psi_aggregators {
0072 PSI_AVGS = 0,
0073 PSI_POLL,
0074 NR_PSI_AGGREGATORS,
0075 };
0076
0077 struct psi_group_cpu {
0078
0079
0080
0081 seqcount_t seq ____cacheline_aligned_in_smp;
0082
0083
0084 unsigned int tasks[NR_PSI_TASK_COUNTS];
0085
0086
0087 u32 state_mask;
0088
0089
0090 u32 times[NR_PSI_STATES];
0091
0092
0093 u64 state_start;
0094
0095
0096
0097
0098 u32 times_prev[NR_PSI_AGGREGATORS][NR_PSI_STATES]
0099 ____cacheline_aligned_in_smp;
0100 };
0101
0102
0103 struct psi_window {
0104
0105 u64 size;
0106
0107
0108 u64 start_time;
0109
0110
0111 u64 start_value;
0112
0113
0114 u64 prev_growth;
0115 };
0116
0117 struct psi_trigger {
0118
0119 enum psi_states state;
0120
0121
0122 u64 threshold;
0123
0124
0125 struct list_head node;
0126
0127
0128 struct psi_group *group;
0129
0130
0131 wait_queue_head_t event_wait;
0132
0133
0134 int event;
0135
0136
0137 struct psi_window win;
0138
0139
0140
0141
0142
0143 u64 last_event_time;
0144
0145
0146 bool pending_event;
0147 };
0148
0149 struct psi_group {
0150
0151 struct mutex avgs_lock;
0152
0153
0154 struct psi_group_cpu __percpu *pcpu;
0155
0156
0157 u64 avg_total[NR_PSI_STATES - 1];
0158 u64 avg_last_update;
0159 u64 avg_next_update;
0160
0161
0162 struct delayed_work avgs_work;
0163
0164
0165 u64 total[NR_PSI_AGGREGATORS][NR_PSI_STATES - 1];
0166 unsigned long avg[NR_PSI_STATES - 1][3];
0167
0168
0169 struct task_struct __rcu *poll_task;
0170 struct timer_list poll_timer;
0171 wait_queue_head_t poll_wait;
0172 atomic_t poll_wakeup;
0173
0174
0175 struct mutex trigger_lock;
0176
0177
0178 struct list_head triggers;
0179 u32 nr_triggers[NR_PSI_STATES - 1];
0180 u32 poll_states;
0181 u64 poll_min_period;
0182
0183
0184 u64 polling_total[NR_PSI_STATES - 1];
0185 u64 polling_next_update;
0186 u64 polling_until;
0187 };
0188
0189 #else
0190
0191 struct psi_group { };
0192
0193 #endif
0194
0195 #endif