1 /*
2 * Copyright 2018 Google, Inc
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 _STATSLOG_H_
18 #define _STATSLOG_H_
19
20 #include <assert.h>
21 #include <inttypes.h>
22 #include <statslog_lmkd.h>
23 #include <stdbool.h>
24 #include <sys/cdefs.h>
25 #include <sys/types.h>
26
27 #include <cutils/properties.h>
28
29 __BEGIN_DECLS
30
31 struct memory_stat {
32 int64_t pgfault;
33 int64_t pgmajfault;
34 int64_t rss_in_bytes;
35 int64_t cache_in_bytes;
36 int64_t swap_in_bytes;
37 int64_t process_start_time_ns;
38 };
39
40 // If you update this, also update the corresponding stats enum mapping.
41 enum kill_reasons {
42 NONE = -1, /* To denote no kill condition */
43 PRESSURE_AFTER_KILL = 0,
44 NOT_RESPONDING,
45 LOW_SWAP_AND_THRASHING,
46 LOW_MEM_AND_SWAP,
47 LOW_MEM_AND_THRASHING,
48 DIRECT_RECL_AND_THRASHING,
49 LOW_MEM_AND_SWAP_UTIL,
50 KILL_REASON_COUNT
51 };
52
53 struct kill_stat {
54 int32_t uid;
55 char *taskname;
56 enum kill_reasons kill_reason;
57 int32_t oom_score;
58 int32_t min_oom_score;
59 int64_t free_mem_kb;
60 int64_t free_swap_kb;
61 int tasksize;
62 };
63
64 #ifdef LMKD_LOG_STATS
65
66 #define MEMCG_PROCESS_MEMORY_STAT_PATH "/dev/memcg/apps/uid_%u/pid_%u/memory.stat"
67 #define PROC_STAT_FILE_PATH "/proc/%d/stat"
68 #define PROC_STAT_BUFFER_SIZE 1024
69 #define BYTES_IN_KILOBYTE 1024
70
71 /**
72 * Logs the change in LMKD state which is used as start/stop boundaries for logging
73 * LMK_KILL_OCCURRED event.
74 * Code: LMK_STATE_CHANGED = 54
75 */
76 int
77 stats_write_lmk_state_changed(int32_t state);
78
79 /**
80 * Logs the event when LMKD kills a process to reduce memory pressure.
81 * Code: LMK_KILL_OCCURRED = 51
82 */
83 int stats_write_lmk_kill_occurred(struct kill_stat *kill_st, struct memory_stat *mem_st);
84
85 /**
86 * Logs the event when LMKD kills a process to reduce memory pressure.
87 * Code: LMK_KILL_OCCURRED = 51
88 */
89 int stats_write_lmk_kill_occurred_pid(int pid, struct kill_stat *kill_st,
90 struct memory_stat* mem_st);
91
92 struct memory_stat *stats_read_memory_stat(bool per_app_memcg, int pid, uid_t uid);
93
94 /**
95 * Registers a process taskname by pid, while it is still alive.
96 */
97 void stats_store_taskname(int pid, const char* taskname);
98
99 /**
100 * Unregister all process tasknames.
101 */
102 void stats_purge_tasknames();
103
104 /**
105 * Unregister a process taskname, e.g. after it has been killed.
106 */
107 void stats_remove_taskname(int pid);
108
109 #else /* LMKD_LOG_STATS */
110
111 static inline int
stats_write_lmk_state_changed(int32_t state __unused)112 stats_write_lmk_state_changed(int32_t state __unused) { return -EINVAL; }
113
114 static inline int
stats_write_lmk_kill_occurred(struct kill_stat * kill_st __unused,struct memory_stat * mem_st __unused)115 stats_write_lmk_kill_occurred(struct kill_stat *kill_st __unused,
116 struct memory_stat *mem_st __unused) {
117 return -EINVAL;
118 }
119
stats_write_lmk_kill_occurred_pid(int pid __unused,struct kill_stat * kill_st __unused,struct memory_stat * mem_st __unused)120 int stats_write_lmk_kill_occurred_pid(int pid __unused, struct kill_stat *kill_st __unused,
121 struct memory_stat* mem_st __unused) {
122 return -EINVAL;
123 }
124
stats_read_memory_stat(bool per_app_memcg __unused,int pid __unused,uid_t uid __unused)125 static inline struct memory_stat *stats_read_memory_stat(bool per_app_memcg __unused,
126 int pid __unused, uid_t uid __unused) { return NULL; }
127
stats_store_taskname(int pid __unused,const char * taskname __unused)128 static inline void stats_store_taskname(int pid __unused, const char* taskname __unused) {}
129
stats_purge_tasknames()130 static inline void stats_purge_tasknames() {}
131
stats_remove_taskname(int pid __unused)132 static inline void stats_remove_taskname(int pid __unused) {}
133
134 #endif /* LMKD_LOG_STATS */
135
136 __END_DECLS
137
138 #endif /* _STATSLOG_H_ */
139