• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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