• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef MEM_EVENTS_BPF_TYES_H_
18 #define MEM_EVENTS_BPF_TYES_H_
19 
20 #include <inttypes.h>
21 
22 #define MEM_EVENT_PROC_NAME_LEN 16  // linux/sched.h
23 #define MEM_EVENTS_RINGBUF_SIZE 4096
24 
25 typedef unsigned int mem_event_type_t;
26 /* Supported mem_event_type_t */
27 #define MEM_EVENT_OOM_KILL 0
28 #define MEM_EVENT_BASE MEM_EVENT_OOM_KILL
29 #define MEM_EVENT_DIRECT_RECLAIM_BEGIN 1
30 #define MEM_EVENT_DIRECT_RECLAIM_END 2
31 #define MEM_EVENT_KSWAPD_WAKE 3
32 #define MEM_EVENT_KSWAPD_SLEEP 4
33 #define MEM_EVENT_VENDOR_LMK_KILL 5
34 #define MEM_EVENT_UPDATE_ZONEINFO 6
35 
36 // This always comes after the last valid event type
37 #define NR_MEM_EVENTS 7
38 
39 /* BPF-Rb Paths */
40 #define MEM_EVENTS_AMS_RB "/sys/fs/bpf/memevents/map_bpfMemEvents_ams_rb"
41 #define MEM_EVENTS_LMKD_RB "/sys/fs/bpf/memevents/map_bpfMemEvents_lmkd_rb"
42 #define MEM_EVENTS_TEST_RB "/sys/fs/bpf/memevents/map_bpfMemEventsTest_rb"
43 
44 /* BPF-Prog Paths */
45 #define MEM_EVENTS_AMS_OOM_MARK_VICTIM_TP \
46     "/sys/fs/bpf/memevents/prog_bpfMemEvents_tracepoint_oom_mark_victim_ams"
47 #define MEM_EVENTS_LMKD_VMSCAN_DR_BEGIN_TP \
48     "/sys/fs/bpf/memevents/"               \
49     "prog_bpfMemEvents_tracepoint_vmscan_mm_vmscan_direct_reclaim_begin_lmkd"
50 #define MEM_EVENTS_LMKD_VMSCAN_DR_END_TP \
51     "/sys/fs/bpf/memevents/prog_bpfMemEvents_tracepoint_vmscan_mm_vmscan_direct_reclaim_end_lmkd"
52 #define MEM_EVENTS_LMKD_VMSCAN_KSWAPD_WAKE_TP \
53     "/sys/fs/bpf/memevents/prog_bpfMemEvents_tracepoint_vmscan_mm_vmscan_kswapd_wake_lmkd"
54 #define MEM_EVENTS_LMKD_VMSCAN_KSWAPD_SLEEP_TP \
55     "/sys/fs/bpf/memevents/prog_bpfMemEvents_tracepoint_vmscan_mm_vmscan_kswapd_sleep_lmkd"
56 #define MEM_EVENTS_LMKD_TRIGGER_VENDOR_LMK_KILL_TP \
57     "/sys/fs/bpf/memevents/"                       \
58     "prog_bpfMemEvents_tracepoint_android_vendor_lmk_android_trigger_vendor_lmk_kill_lmkd"
59 #define MEM_EVENTS_LMKD_CALCULATE_TOTALRESERVE_PAGES_TP \
60     "/sys/fs/bpf/memevents/prog_bpfMemEvents_tracepoint_kmem_mm_calculate_totalreserve_pages_lmkd"
61 #define MEM_EVENTS_TEST_OOM_MARK_VICTIM_TP \
62     "/sys/fs/bpf/memevents/prog_bpfMemEventsTest_tracepoint_oom_mark_victim"
63 
64 /* Number of kill reasons.  Currently,
65 *  kill reasons are values from 0 to 999.
66 *  This range is expected to cover all
67 *  foreseeable kill reasons.  If the number of
68 *  kill reasons exceeds this limit in the future,
69 *  this constant should be adjusted accordingly.
70 */
71 #define NUM_VENDOR_LMK_KILL_REASON 1000
72 
73 /* Struct to collect data from tracepoints */
74 struct mem_event_t {
75     uint64_t type;
76 
77     union EventData {
78         struct OomKill {
79             uint32_t pid;
80             uint64_t timestamp_ms;
81             short oom_score_adj;
82             uint32_t uid;
83             char process_name[MEM_EVENT_PROC_NAME_LEN];
84             uint64_t total_vm_kb;
85             uint64_t anon_rss_kb;
86             uint64_t file_rss_kb;
87             uint64_t shmem_rss_kb;
88             uint64_t pgtables_kb;
89         } oom_kill;
90 
91         struct KswapdWake {
92             uint32_t node_id;
93             uint32_t zone_id;
94             uint32_t alloc_order;
95         } kswapd_wake;
96 
97         struct KswapdSleep {
98             uint32_t node_id;
99         } kswapd_sleep;
100 
101         struct VendorKill {
102             uint32_t reason;
103             short min_oom_score_adj;
104         } vendor_kill;
105 
106         struct TotalReservePages {
107             uint32_t num_pages;
108         } reserve_pages;
109     } event_data;
110 };
111 
112 /* Expected args for tracepoints */
113 
114 struct mark_victim_args {
115     uint64_t __ignore;
116     /* Actual fields start at offset 8 */
117     uint32_t pid;
118     uint32_t __data_loc_comm;
119     uint64_t total_vm;
120     uint64_t anon_rss;
121     uint64_t file_rss;
122     uint64_t shmem_rss;
123     uint32_t uid;
124     uint64_t pgtables;
125     short oom_score_adj;
126 };
127 
128 struct direct_reclaim_begin_args {
129     char __ignore[24];
130 };
131 
132 struct direct_reclaim_end_args {
133     char __ignore[16];
134 };
135 
136 struct kswapd_wake_args {
137     uint64_t __ignore;
138     /* Actual fields start at offset 8 */
139     uint32_t nid;
140     uint32_t zid;
141     uint32_t order;
142 };
143 
144 struct kswapd_sleep_args {
145     uint64_t __ignore;
146     /* Actual fields start at offset 8 */
147     uint32_t nid;
148 };
149 
150 struct vendor_lmk_kill_args {
151     uint64_t __ignore;
152     /* Actual fields start at offset 8 */
153     uint32_t reason;
154     short min_oom_score_adj;
155 };
156 
157 struct calculate_totalreserve_pages_args {
158     uint64_t __ignore;
159     /* Actual fields start at offset 8 */
160     uint64_t totalreserve_pages;
161 };
162 #endif /* MEM_EVENTS_BPF_TYES_H_ */
163