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