• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 INCLUDE_PERFETTO_EXT_TRACED_SYS_STATS_COUNTERS_H_
18 #define INCLUDE_PERFETTO_EXT_TRACED_SYS_STATS_COUNTERS_H_
19 
20 #include "perfetto/ext/base/utils.h"
21 #include "protos/perfetto/common/sys_stats_counters.pbzero.h"
22 
23 #include <vector>
24 
25 namespace perfetto {
26 
27 struct KeyAndId {
28   const char* str;
29   int id;
30 };
31 
32 constexpr KeyAndId kMeminfoKeys[] = {
33     {"MemUnspecified", protos::pbzero::MeminfoCounters::MEMINFO_UNSPECIFIED},
34     {"MemTotal", protos::pbzero::MeminfoCounters::MEMINFO_MEM_TOTAL},
35     {"MemFree", protos::pbzero::MeminfoCounters::MEMINFO_MEM_FREE},
36     {"MemAvailable", protos::pbzero::MeminfoCounters::MEMINFO_MEM_AVAILABLE},
37     {"Buffers", protos::pbzero::MeminfoCounters::MEMINFO_BUFFERS},
38     {"Cached", protos::pbzero::MeminfoCounters::MEMINFO_CACHED},
39     {"SwapCached", protos::pbzero::MeminfoCounters::MEMINFO_SWAP_CACHED},
40     {"Active", protos::pbzero::MeminfoCounters::MEMINFO_ACTIVE},
41     {"Inactive", protos::pbzero::MeminfoCounters::MEMINFO_INACTIVE},
42     {"Active(anon)", protos::pbzero::MeminfoCounters::MEMINFO_ACTIVE_ANON},
43     {"Inactive(anon)", protos::pbzero::MeminfoCounters::MEMINFO_INACTIVE_ANON},
44     {"Active(file)", protos::pbzero::MeminfoCounters::MEMINFO_ACTIVE_FILE},
45     {"Inactive(file)", protos::pbzero::MeminfoCounters::MEMINFO_INACTIVE_FILE},
46     {"Unevictable", protos::pbzero::MeminfoCounters::MEMINFO_UNEVICTABLE},
47     {"Mlocked", protos::pbzero::MeminfoCounters::MEMINFO_MLOCKED},
48     {"SwapTotal", protos::pbzero::MeminfoCounters::MEMINFO_SWAP_TOTAL},
49     {"SwapFree", protos::pbzero::MeminfoCounters::MEMINFO_SWAP_FREE},
50     {"Dirty", protos::pbzero::MeminfoCounters::MEMINFO_DIRTY},
51     {"Writeback", protos::pbzero::MeminfoCounters::MEMINFO_WRITEBACK},
52     {"AnonPages", protos::pbzero::MeminfoCounters::MEMINFO_ANON_PAGES},
53     {"Mapped", protos::pbzero::MeminfoCounters::MEMINFO_MAPPED},
54     {"Shmem", protos::pbzero::MeminfoCounters::MEMINFO_SHMEM},
55     {"Slab", protos::pbzero::MeminfoCounters::MEMINFO_SLAB},
56     {"SReclaimable", protos::pbzero::MeminfoCounters::MEMINFO_SLAB_RECLAIMABLE},
57     {"SUnreclaim", protos::pbzero::MeminfoCounters::MEMINFO_SLAB_UNRECLAIMABLE},
58     {"KernelStack", protos::pbzero::MeminfoCounters::MEMINFO_KERNEL_STACK},
59     {"PageTables", protos::pbzero::MeminfoCounters::MEMINFO_PAGE_TABLES},
60     {"CommitLimit", protos::pbzero::MeminfoCounters::MEMINFO_COMMIT_LIMIT},
61     {"Committed_AS", protos::pbzero::MeminfoCounters::MEMINFO_COMMITED_AS},
62     {"VmallocTotal", protos::pbzero::MeminfoCounters::MEMINFO_VMALLOC_TOTAL},
63     {"VmallocUsed", protos::pbzero::MeminfoCounters::MEMINFO_VMALLOC_USED},
64     {"VmallocChunk", protos::pbzero::MeminfoCounters::MEMINFO_VMALLOC_CHUNK},
65     {"CmaTotal", protos::pbzero::MeminfoCounters::MEMINFO_CMA_TOTAL},
66     {"CmaFree", protos::pbzero::MeminfoCounters::MEMINFO_CMA_FREE},
67 };
68 
69 const KeyAndId kVmstatKeys[] = {
70     {"VmstatUnspecified", protos::pbzero::VmstatCounters::VMSTAT_UNSPECIFIED},
71     {"nr_free_pages", protos::pbzero::VmstatCounters::VMSTAT_NR_FREE_PAGES},
72     {"nr_alloc_batch", protos::pbzero::VmstatCounters::VMSTAT_NR_ALLOC_BATCH},
73     {"nr_inactive_anon",
74      protos::pbzero::VmstatCounters::VMSTAT_NR_INACTIVE_ANON},
75     {"nr_active_anon", protos::pbzero::VmstatCounters::VMSTAT_NR_ACTIVE_ANON},
76     {"nr_inactive_file",
77      protos::pbzero::VmstatCounters::VMSTAT_NR_INACTIVE_FILE},
78     {"nr_active_file", protos::pbzero::VmstatCounters::VMSTAT_NR_ACTIVE_FILE},
79     {"nr_unevictable", protos::pbzero::VmstatCounters::VMSTAT_NR_UNEVICTABLE},
80     {"nr_mlock", protos::pbzero::VmstatCounters::VMSTAT_NR_MLOCK},
81     {"nr_anon_pages", protos::pbzero::VmstatCounters::VMSTAT_NR_ANON_PAGES},
82     {"nr_mapped", protos::pbzero::VmstatCounters::VMSTAT_NR_MAPPED},
83     {"nr_file_pages", protos::pbzero::VmstatCounters::VMSTAT_NR_FILE_PAGES},
84     {"nr_dirty", protos::pbzero::VmstatCounters::VMSTAT_NR_DIRTY},
85     {"nr_writeback", protos::pbzero::VmstatCounters::VMSTAT_NR_WRITEBACK},
86     {"nr_slab_reclaimable",
87      protos::pbzero::VmstatCounters::VMSTAT_NR_SLAB_RECLAIMABLE},
88     {"nr_slab_unreclaimable",
89      protos::pbzero::VmstatCounters::VMSTAT_NR_SLAB_UNRECLAIMABLE},
90     {"nr_page_table_pages",
91      protos::pbzero::VmstatCounters::VMSTAT_NR_PAGE_TABLE_PAGES},
92     {"nr_kernel_stack", protos::pbzero::VmstatCounters::VMSTAT_NR_KERNEL_STACK},
93     {"nr_overhead", protos::pbzero::VmstatCounters::VMSTAT_NR_OVERHEAD},
94     {"nr_unstable", protos::pbzero::VmstatCounters::VMSTAT_NR_UNSTABLE},
95     {"nr_bounce", protos::pbzero::VmstatCounters::VMSTAT_NR_BOUNCE},
96     {"nr_vmscan_write", protos::pbzero::VmstatCounters::VMSTAT_NR_VMSCAN_WRITE},
97     {"nr_vmscan_immediate_reclaim",
98      protos::pbzero::VmstatCounters::VMSTAT_NR_VMSCAN_IMMEDIATE_RECLAIM},
99     {"nr_writeback_temp",
100      protos::pbzero::VmstatCounters::VMSTAT_NR_WRITEBACK_TEMP},
101     {"nr_isolated_anon",
102      protos::pbzero::VmstatCounters::VMSTAT_NR_ISOLATED_ANON},
103     {"nr_isolated_file",
104      protos::pbzero::VmstatCounters::VMSTAT_NR_ISOLATED_FILE},
105     {"nr_shmem", protos::pbzero::VmstatCounters::VMSTAT_NR_SHMEM},
106     {"nr_dirtied", protos::pbzero::VmstatCounters::VMSTAT_NR_DIRTIED},
107     {"nr_written", protos::pbzero::VmstatCounters::VMSTAT_NR_WRITTEN},
108     {"nr_pages_scanned",
109      protos::pbzero::VmstatCounters::VMSTAT_NR_PAGES_SCANNED},
110     {"workingset_refault",
111      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_REFAULT},
112     {"workingset_activate",
113      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_ACTIVATE},
114     {"workingset_nodereclaim",
115      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_NODERECLAIM},
116     {"nr_anon_transparent_hugepages",
117      protos::pbzero::VmstatCounters::VMSTAT_NR_ANON_TRANSPARENT_HUGEPAGES},
118     {"nr_free_cma", protos::pbzero::VmstatCounters::VMSTAT_NR_FREE_CMA},
119     {"nr_swapcache", protos::pbzero::VmstatCounters::VMSTAT_NR_SWAPCACHE},
120     {"nr_dirty_threshold",
121      protos::pbzero::VmstatCounters::VMSTAT_NR_DIRTY_THRESHOLD},
122     {"nr_dirty_background_threshold",
123      protos::pbzero::VmstatCounters::VMSTAT_NR_DIRTY_BACKGROUND_THRESHOLD},
124     {"pgpgin", protos::pbzero::VmstatCounters::VMSTAT_PGPGIN},
125     {"pgpgout", protos::pbzero::VmstatCounters::VMSTAT_PGPGOUT},
126     {"pgpgoutclean", protos::pbzero::VmstatCounters::VMSTAT_PGPGOUTCLEAN},
127     {"pswpin", protos::pbzero::VmstatCounters::VMSTAT_PSWPIN},
128     {"pswpout", protos::pbzero::VmstatCounters::VMSTAT_PSWPOUT},
129     {"pgalloc_dma", protos::pbzero::VmstatCounters::VMSTAT_PGALLOC_DMA},
130     {"pgalloc_normal", protos::pbzero::VmstatCounters::VMSTAT_PGALLOC_NORMAL},
131     {"pgalloc_movable", protos::pbzero::VmstatCounters::VMSTAT_PGALLOC_MOVABLE},
132     {"pgfree", protos::pbzero::VmstatCounters::VMSTAT_PGFREE},
133     {"pgactivate", protos::pbzero::VmstatCounters::VMSTAT_PGACTIVATE},
134     {"pgdeactivate", protos::pbzero::VmstatCounters::VMSTAT_PGDEACTIVATE},
135     {"pgfault", protos::pbzero::VmstatCounters::VMSTAT_PGFAULT},
136     {"pgmajfault", protos::pbzero::VmstatCounters::VMSTAT_PGMAJFAULT},
137     {"pgrefill_dma", protos::pbzero::VmstatCounters::VMSTAT_PGREFILL_DMA},
138     {"pgrefill_normal", protos::pbzero::VmstatCounters::VMSTAT_PGREFILL_NORMAL},
139     {"pgrefill_movable",
140      protos::pbzero::VmstatCounters::VMSTAT_PGREFILL_MOVABLE},
141     {"pgsteal_kswapd_dma",
142      protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_KSWAPD_DMA},
143     {"pgsteal_kswapd_normal",
144      protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_KSWAPD_NORMAL},
145     {"pgsteal_kswapd_movable",
146      protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_KSWAPD_MOVABLE},
147     {"pgsteal_direct_dma",
148      protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_DIRECT_DMA},
149     {"pgsteal_direct_normal",
150      protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_DIRECT_NORMAL},
151     {"pgsteal_direct_movable",
152      protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_DIRECT_MOVABLE},
153     {"pgscan_kswapd_dma",
154      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_KSWAPD_DMA},
155     {"pgscan_kswapd_normal",
156      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_KSWAPD_NORMAL},
157     {"pgscan_kswapd_movable",
158      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_KSWAPD_MOVABLE},
159     {"pgscan_direct_dma",
160      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_DIRECT_DMA},
161     {"pgscan_direct_normal",
162      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_DIRECT_NORMAL},
163     {"pgscan_direct_movable",
164      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_DIRECT_MOVABLE},
165     {"pgscan_direct_throttle",
166      protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_DIRECT_THROTTLE},
167     {"pginodesteal", protos::pbzero::VmstatCounters::VMSTAT_PGINODESTEAL},
168     {"slabs_scanned", protos::pbzero::VmstatCounters::VMSTAT_SLABS_SCANNED},
169     {"kswapd_inodesteal",
170      protos::pbzero::VmstatCounters::VMSTAT_KSWAPD_INODESTEAL},
171     {"kswapd_low_wmark_hit_quickly",
172      protos::pbzero::VmstatCounters::VMSTAT_KSWAPD_LOW_WMARK_HIT_QUICKLY},
173     {"kswapd_high_wmark_hit_quickly",
174      protos::pbzero::VmstatCounters::VMSTAT_KSWAPD_HIGH_WMARK_HIT_QUICKLY},
175     {"pageoutrun", protos::pbzero::VmstatCounters::VMSTAT_PAGEOUTRUN},
176     {"allocstall", protos::pbzero::VmstatCounters::VMSTAT_ALLOCSTALL},
177     {"pgrotated", protos::pbzero::VmstatCounters::VMSTAT_PGROTATED},
178     {"drop_pagecache", protos::pbzero::VmstatCounters::VMSTAT_DROP_PAGECACHE},
179     {"drop_slab", protos::pbzero::VmstatCounters::VMSTAT_DROP_SLAB},
180     {"pgmigrate_success",
181      protos::pbzero::VmstatCounters::VMSTAT_PGMIGRATE_SUCCESS},
182     {"pgmigrate_fail", protos::pbzero::VmstatCounters::VMSTAT_PGMIGRATE_FAIL},
183     {"compact_migrate_scanned",
184      protos::pbzero::VmstatCounters::VMSTAT_COMPACT_MIGRATE_SCANNED},
185     {"compact_free_scanned",
186      protos::pbzero::VmstatCounters::VMSTAT_COMPACT_FREE_SCANNED},
187     {"compact_isolated",
188      protos::pbzero::VmstatCounters::VMSTAT_COMPACT_ISOLATED},
189     {"compact_stall", protos::pbzero::VmstatCounters::VMSTAT_COMPACT_STALL},
190     {"compact_fail", protos::pbzero::VmstatCounters::VMSTAT_COMPACT_FAIL},
191     {"compact_success", protos::pbzero::VmstatCounters::VMSTAT_COMPACT_SUCCESS},
192     {"compact_daemon_wake",
193      protos::pbzero::VmstatCounters::VMSTAT_COMPACT_DAEMON_WAKE},
194     {"unevictable_pgs_culled",
195      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_CULLED},
196     {"unevictable_pgs_scanned",
197      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_SCANNED},
198     {"unevictable_pgs_rescued",
199      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_RESCUED},
200     {"unevictable_pgs_mlocked",
201      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_MLOCKED},
202     {"unevictable_pgs_munlocked",
203      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_MUNLOCKED},
204     {"unevictable_pgs_cleared",
205      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_CLEARED},
206     {"unevictable_pgs_stranded",
207      protos::pbzero::VmstatCounters::VMSTAT_UNEVICTABLE_PGS_STRANDED},
208     {"nr_zspages", protos::pbzero::VmstatCounters::VMSTAT_NR_ZSPAGES},
209     {"nr_ion_heap", protos::pbzero::VmstatCounters::VMSTAT_NR_ION_HEAP},
210     {"nr_gpu_heap", protos::pbzero::VmstatCounters::VMSTAT_NR_GPU_HEAP},
211     {"allocstall_dma", protos::pbzero::VmstatCounters::VMSTAT_ALLOCSTALL_DMA},
212     {"allocstall_movable",
213      protos::pbzero::VmstatCounters::VMSTAT_ALLOCSTALL_MOVABLE},
214     {"allocstall_normal",
215      protos::pbzero::VmstatCounters::VMSTAT_ALLOCSTALL_NORMAL},
216     {"compact_daemon_free_scanned",
217      protos::pbzero::VmstatCounters::VMSTAT_COMPACT_DAEMON_FREE_SCANNED},
218     {"compact_daemon_migrate_scanned",
219      protos::pbzero::VmstatCounters::VMSTAT_COMPACT_DAEMON_MIGRATE_SCANNED},
220     {"nr_fastrpc", protos::pbzero::VmstatCounters::VMSTAT_NR_FASTRPC},
221     {"nr_indirectly_reclaimable",
222      protos::pbzero::VmstatCounters::VMSTAT_NR_INDIRECTLY_RECLAIMABLE},
223     {"nr_ion_heap_pool",
224      protos::pbzero::VmstatCounters::VMSTAT_NR_ION_HEAP_POOL},
225     {"nr_kernel_misc_reclaimable",
226      protos::pbzero::VmstatCounters::VMSTAT_NR_KERNEL_MISC_RECLAIMABLE},
227     {"nr_shadow_call_stack_bytes",
228      protos::pbzero::VmstatCounters::VMSTAT_NR_SHADOW_CALL_STACK_BYTES},
229     {"nr_shmem_hugepages",
230      protos::pbzero::VmstatCounters::VMSTAT_NR_SHMEM_HUGEPAGES},
231     {"nr_shmem_pmdmapped",
232      protos::pbzero::VmstatCounters::VMSTAT_NR_SHMEM_PMDMAPPED},
233     {"nr_unreclaimable_pages",
234      protos::pbzero::VmstatCounters::VMSTAT_NR_UNRECLAIMABLE_PAGES},
235     {"nr_zone_active_anon",
236      protos::pbzero::VmstatCounters::VMSTAT_NR_ZONE_ACTIVE_ANON},
237     {"nr_zone_active_file",
238      protos::pbzero::VmstatCounters::VMSTAT_NR_ZONE_ACTIVE_FILE},
239     {"nr_zone_inactive_anon",
240      protos::pbzero::VmstatCounters::VMSTAT_NR_ZONE_INACTIVE_ANON},
241     {"nr_zone_inactive_file",
242      protos::pbzero::VmstatCounters::VMSTAT_NR_ZONE_INACTIVE_FILE},
243     {"nr_zone_unevictable",
244      protos::pbzero::VmstatCounters::VMSTAT_NR_ZONE_UNEVICTABLE},
245     {"nr_zone_write_pending",
246      protos::pbzero::VmstatCounters::VMSTAT_NR_ZONE_WRITE_PENDING},
247     {"oom_kill", protos::pbzero::VmstatCounters::VMSTAT_OOM_KILL},
248     {"pglazyfree", protos::pbzero::VmstatCounters::VMSTAT_PGLAZYFREE},
249     {"pglazyfreed", protos::pbzero::VmstatCounters::VMSTAT_PGLAZYFREED},
250     {"pgrefill", protos::pbzero::VmstatCounters::VMSTAT_PGREFILL},
251     {"pgscan_direct", protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_DIRECT},
252     {"pgscan_kswapd", protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_KSWAPD},
253     {"pgskip_dma", protos::pbzero::VmstatCounters::VMSTAT_PGSKIP_DMA},
254     {"pgskip_movable", protos::pbzero::VmstatCounters::VMSTAT_PGSKIP_MOVABLE},
255     {"pgskip_normal", protos::pbzero::VmstatCounters::VMSTAT_PGSKIP_NORMAL},
256     {"pgsteal_direct", protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_DIRECT},
257     {"pgsteal_kswapd", protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_KSWAPD},
258     {"swap_ra_hit", protos::pbzero::VmstatCounters::VMSTAT_SWAP_RA_HIT},
259     {"swap_ra", protos::pbzero::VmstatCounters::VMSTAT_SWAP_RA},
260     {"workingset_restore",
261      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_RESTORE},
262     {"allocstall_device",
263      protos::pbzero::VmstatCounters::VMSTAT_ALLOCSTALL_DEVICE},
264     {"allocstall_dma32",
265      protos::pbzero::VmstatCounters::VMSTAT_ALLOCSTALL_DMA32},
266     {"balloon_deflate", protos::pbzero::VmstatCounters::VMSTAT_BALLOON_DEFLATE},
267     {"balloon_inflate", protos::pbzero::VmstatCounters::VMSTAT_BALLOON_INFLATE},
268     {"balloon_migrate", protos::pbzero::VmstatCounters::VMSTAT_BALLOON_MIGRATE},
269     {"cma_alloc_fail", protos::pbzero::VmstatCounters::VMSTAT_CMA_ALLOC_FAIL},
270     {"cma_alloc_success",
271      protos::pbzero::VmstatCounters::VMSTAT_CMA_ALLOC_SUCCESS},
272     {"nr_file_hugepages",
273      protos::pbzero::VmstatCounters::VMSTAT_NR_FILE_HUGEPAGES},
274     {"nr_file_pmdmapped",
275      protos::pbzero::VmstatCounters::VMSTAT_NR_FILE_PMDMAPPED},
276     {"nr_foll_pin_acquired",
277      protos::pbzero::VmstatCounters::VMSTAT_NR_FOLL_PIN_ACQUIRED},
278     {"nr_foll_pin_released",
279      protos::pbzero::VmstatCounters::VMSTAT_NR_FOLL_PIN_RELEASED},
280     {"nr_sec_page_table_pages",
281      protos::pbzero::VmstatCounters::VMSTAT_NR_SEC_PAGE_TABLE_PAGES},
282     {"nr_shadow_call_stack",
283      protos::pbzero::VmstatCounters::VMSTAT_NR_SHADOW_CALL_STACK},
284     {"nr_swapcached", protos::pbzero::VmstatCounters::VMSTAT_NR_SWAPCACHED},
285     {"nr_throttled_written",
286      protos::pbzero::VmstatCounters::VMSTAT_NR_THROTTLED_WRITTEN},
287     {"pgalloc_device", protos::pbzero::VmstatCounters::VMSTAT_PGALLOC_DEVICE},
288     {"pgalloc_dma32", protos::pbzero::VmstatCounters::VMSTAT_PGALLOC_DMA32},
289     {"pgdemote_direct", protos::pbzero::VmstatCounters::VMSTAT_PGDEMOTE_DIRECT},
290     {"pgdemote_kswapd", protos::pbzero::VmstatCounters::VMSTAT_PGDEMOTE_KSWAPD},
291     {"pgreuse", protos::pbzero::VmstatCounters::VMSTAT_PGREUSE},
292     {"pgscan_anon", protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_ANON},
293     {"pgscan_file", protos::pbzero::VmstatCounters::VMSTAT_PGSCAN_FILE},
294     {"pgskip_device", protos::pbzero::VmstatCounters::VMSTAT_PGSKIP_DEVICE},
295     {"pgskip_dma32", protos::pbzero::VmstatCounters::VMSTAT_PGSKIP_DMA32},
296     {"pgsteal_anon", protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_ANON},
297     {"pgsteal_file", protos::pbzero::VmstatCounters::VMSTAT_PGSTEAL_FILE},
298     {"thp_collapse_alloc",
299      protos::pbzero::VmstatCounters::VMSTAT_THP_COLLAPSE_ALLOC},
300     {"thp_collapse_alloc_failed",
301      protos::pbzero::VmstatCounters::VMSTAT_THP_COLLAPSE_ALLOC_FAILED},
302     {"thp_deferred_split_page",
303      protos::pbzero::VmstatCounters::VMSTAT_THP_DEFERRED_SPLIT_PAGE},
304     {"thp_fault_alloc", protos::pbzero::VmstatCounters::VMSTAT_THP_FAULT_ALLOC},
305     {"thp_fault_fallback",
306      protos::pbzero::VmstatCounters::VMSTAT_THP_FAULT_FALLBACK},
307     {"thp_fault_fallback_charge",
308      protos::pbzero::VmstatCounters::VMSTAT_THP_FAULT_FALLBACK_CHARGE},
309     {"thp_file_alloc", protos::pbzero::VmstatCounters::VMSTAT_THP_FILE_ALLOC},
310     {"thp_file_fallback",
311      protos::pbzero::VmstatCounters::VMSTAT_THP_FILE_FALLBACK},
312     {"thp_file_fallback_charge",
313      protos::pbzero::VmstatCounters::VMSTAT_THP_FILE_FALLBACK_CHARGE},
314     {"thp_file_mapped", protos::pbzero::VmstatCounters::VMSTAT_THP_FILE_MAPPED},
315     {"thp_migration_fail",
316      protos::pbzero::VmstatCounters::VMSTAT_THP_MIGRATION_FAIL},
317     {"thp_migration_split",
318      protos::pbzero::VmstatCounters::VMSTAT_THP_MIGRATION_SPLIT},
319     {"thp_migration_success",
320      protos::pbzero::VmstatCounters::VMSTAT_THP_MIGRATION_SUCCESS},
321     {"thp_scan_exceed_none_pte",
322      protos::pbzero::VmstatCounters::VMSTAT_THP_SCAN_EXCEED_NONE_PTE},
323     {"thp_scan_exceed_share_pte",
324      protos::pbzero::VmstatCounters::VMSTAT_THP_SCAN_EXCEED_SHARE_PTE},
325     {"thp_scan_exceed_swap_pte",
326      protos::pbzero::VmstatCounters::VMSTAT_THP_SCAN_EXCEED_SWAP_PTE},
327     {"thp_split_page", protos::pbzero::VmstatCounters::VMSTAT_THP_SPLIT_PAGE},
328     {"thp_split_page_failed",
329      protos::pbzero::VmstatCounters::VMSTAT_THP_SPLIT_PAGE_FAILED},
330     {"thp_split_pmd", protos::pbzero::VmstatCounters::VMSTAT_THP_SPLIT_PMD},
331     {"thp_swpout", protos::pbzero::VmstatCounters::VMSTAT_THP_SWPOUT},
332     {"thp_swpout_fallback",
333      protos::pbzero::VmstatCounters::VMSTAT_THP_SWPOUT_FALLBACK},
334     {"thp_zero_page_alloc",
335      protos::pbzero::VmstatCounters::VMSTAT_THP_ZERO_PAGE_ALLOC},
336     {"thp_zero_page_alloc_failed",
337      protos::pbzero::VmstatCounters::VMSTAT_THP_ZERO_PAGE_ALLOC_FAILED},
338     {"vma_lock_abort", protos::pbzero::VmstatCounters::VMSTAT_VMA_LOCK_ABORT},
339     {"vma_lock_miss", protos::pbzero::VmstatCounters::VMSTAT_VMA_LOCK_MISS},
340     {"vma_lock_retry", protos::pbzero::VmstatCounters::VMSTAT_VMA_LOCK_RETRY},
341     {"vma_lock_success",
342      protos::pbzero::VmstatCounters::VMSTAT_VMA_LOCK_SUCCESS},
343     {"workingset_activate_anon",
344      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_ACTIVATE_ANON},
345     {"workingset_activate_file",
346      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_ACTIVATE_FILE},
347     {"workingset_nodes",
348      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_NODES},
349     {"workingset_refault_anon",
350      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_REFAULT_ANON},
351     {"workingset_refault_file",
352      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_REFAULT_FILE},
353     {"workingset_restore_anon",
354      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_RESTORE_ANON},
355     {"workingset_restore_file",
356      protos::pbzero::VmstatCounters::VMSTAT_WORKINGSET_RESTORE_FILE},
357 };
358 
359 // Returns a lookup table of meminfo counter names addressable by counter id.
BuildMeminfoCounterNames()360 inline std::vector<const char*> BuildMeminfoCounterNames() {
361   int max_id = 0;
362   for (size_t i = 0; i < base::ArraySize(kMeminfoKeys); i++)
363     max_id = std::max(max_id, kMeminfoKeys[i].id);
364   std::vector<const char*> v;
365   v.resize(static_cast<size_t>(max_id) + 1);
366   for (size_t i = 0; i < base::ArraySize(kMeminfoKeys); i++)
367     v[static_cast<size_t>(kMeminfoKeys[i].id)] = kMeminfoKeys[i].str;
368   return v;
369 }
370 
BuildVmstatCounterNames()371 inline std::vector<const char*> BuildVmstatCounterNames() {
372   int max_id = 0;
373   for (size_t i = 0; i < base::ArraySize(kVmstatKeys); i++)
374     max_id = std::max(max_id, kVmstatKeys[i].id);
375   std::vector<const char*> v;
376   v.resize(static_cast<size_t>(max_id) + 1);
377   for (size_t i = 0; i < base::ArraySize(kVmstatKeys); i++)
378     v[static_cast<size_t>(kVmstatKeys[i].id)] = kVmstatKeys[i].str;
379   return v;
380 }
381 
382 }  // namespace perfetto
383 
384 #endif  // INCLUDE_PERFETTO_EXT_TRACED_SYS_STATS_COUNTERS_H_
385