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