xref: /linux-6.15/include/linux/psi_types.h (revision bcc78db6)
1 #ifndef _LINUX_PSI_TYPES_H
2 #define _LINUX_PSI_TYPES_H
3 
4 #include <linux/seqlock.h>
5 #include <linux/types.h>
6 
7 #ifdef CONFIG_PSI
8 
9 /* Tracked task states */
10 enum psi_task_count {
11 	NR_IOWAIT,
12 	NR_MEMSTALL,
13 	NR_RUNNING,
14 	NR_PSI_TASK_COUNTS = 3,
15 };
16 
17 /* Task state bitmasks */
18 #define TSK_IOWAIT	(1 << NR_IOWAIT)
19 #define TSK_MEMSTALL	(1 << NR_MEMSTALL)
20 #define TSK_RUNNING	(1 << NR_RUNNING)
21 
22 /* Resources that workloads could be stalled on */
23 enum psi_res {
24 	PSI_IO,
25 	PSI_MEM,
26 	PSI_CPU,
27 	NR_PSI_RESOURCES = 3,
28 };
29 
30 /*
31  * Pressure states for each resource:
32  *
33  * SOME: Stalled tasks & working tasks
34  * FULL: Stalled tasks & no working tasks
35  */
36 enum psi_states {
37 	PSI_IO_SOME,
38 	PSI_IO_FULL,
39 	PSI_MEM_SOME,
40 	PSI_MEM_FULL,
41 	PSI_CPU_SOME,
42 	/* Only per-CPU, to weigh the CPU in the global average: */
43 	PSI_NONIDLE,
44 	NR_PSI_STATES = 6,
45 };
46 
47 struct psi_group_cpu {
48 	/* 1st cacheline updated by the scheduler */
49 
50 	/* Aggregator needs to know of concurrent changes */
51 	seqcount_t seq ____cacheline_aligned_in_smp;
52 
53 	/* States of the tasks belonging to this group */
54 	unsigned int tasks[NR_PSI_TASK_COUNTS];
55 
56 	/* Aggregate pressure state derived from the tasks */
57 	u32 state_mask;
58 
59 	/* Period time sampling buckets for each state of interest (ns) */
60 	u32 times[NR_PSI_STATES];
61 
62 	/* Time of last task change in this group (rq_clock) */
63 	u64 state_start;
64 
65 	/* 2nd cacheline updated by the aggregator */
66 
67 	/* Delta detection against the sampling buckets */
68 	u32 times_prev[NR_PSI_STATES] ____cacheline_aligned_in_smp;
69 };
70 
71 struct psi_group {
72 	/* Protects data used by the aggregator */
73 	struct mutex avgs_lock;
74 
75 	/* Per-cpu task state & time tracking */
76 	struct psi_group_cpu __percpu *pcpu;
77 
78 	/* Running pressure averages */
79 	u64 avg_total[NR_PSI_STATES - 1];
80 	u64 avg_last_update;
81 	u64 avg_next_update;
82 	struct delayed_work avgs_work;
83 
84 	/* Total stall times and sampled pressure averages */
85 	u64 total[NR_PSI_STATES - 1];
86 	unsigned long avg[NR_PSI_STATES - 1][3];
87 };
88 
89 #else /* CONFIG_PSI */
90 
91 struct psi_group { };
92 
93 #endif /* CONFIG_PSI */
94 
95 #endif /* _LINUX_PSI_TYPES_H */
96