lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <aD_4loC1m_Ff0HwR@tiehlicka>
Date: Wed, 4 Jun 2025 09:41:10 +0200
From: Michal Hocko <mhocko@...e.com>
To: "Kirill A. Shutemov" <kirill.shutemov@...ux.intel.com>
Cc: Andrew Morton <akpm@...ux-foundation.org>,
	David Hildenbrand <david@...hat.com>, lorenzo.stoakes@...cle.com,
	Liam.Howlett@...cle.com, vbabka@...e.cz, rppt@...nel.org,
	surenb@...gle.com, hch@....de, linux-mm@...ck.org,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH, REBASED mm-unstable] mm/vmstat: Utilize designated
 initializers for the vmstat_text array

On Tue 03-06-25 11:45:56, Kirill A. Shutemov wrote:
> The vmstat_text array defines labels for counters displayed in
> /proc/vmstat. The current definition of the array implies a specific
> order of the counters in their enums, making it fragile.
> 
> To make it clear which counter the label is for, use designated
> initializers.
> 
> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@...ux.intel.com>
> Reviewed-by: Christoph Hellwig <hch@....de>
> Acked-by: Vlastimil Babka <vbabka@...e.cz>

I really hate excessive use of macros but I have to admit that despite
the trickery the resulting definition is easier to follow and hopefully
less tricky as well.
Acked-by: Michal Hocko <mhocko@...e.com>
Thanks!

> ---
>  mm/vmstat.c | 443 +++++++++++++++++++++++++++-------------------------
>  1 file changed, 232 insertions(+), 211 deletions(-)
> 
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> index 918488e3d6e8..27dc37168cfd 100644
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -1163,320 +1163,341 @@ int fragmentation_index(struct zone *zone, unsigned int order)
>  #if defined(CONFIG_PROC_FS) || defined(CONFIG_SYSFS) || \
>      defined(CONFIG_NUMA) || defined(CONFIG_MEMCG)
>  #ifdef CONFIG_ZONE_DMA
> -#define TEXT_FOR_DMA(xx) xx "_dma",
> +#define TEXT_FOR_DMA(xx, yy) [xx##_DMA] = yy "_dma",
>  #else
> -#define TEXT_FOR_DMA(xx)
> +#define TEXT_FOR_DMA(xx, yy)
>  #endif
>  
>  #ifdef CONFIG_ZONE_DMA32
> -#define TEXT_FOR_DMA32(xx) xx "_dma32",
> +#define TEXT_FOR_DMA32(xx, yy) [xx##_DMA32] = yy "_dma32",
>  #else
> -#define TEXT_FOR_DMA32(xx)
> +#define TEXT_FOR_DMA32(xx, yy)
>  #endif
>  
>  #ifdef CONFIG_HIGHMEM
> -#define TEXT_FOR_HIGHMEM(xx) xx "_high",
> +#define TEXT_FOR_HIGHMEM(xx, yy) [xx##_HIGH] = yy "_high",
>  #else
> -#define TEXT_FOR_HIGHMEM(xx)
> +#define TEXT_FOR_HIGHMEM(xx, yy)
>  #endif
>  
>  #ifdef CONFIG_ZONE_DEVICE
> -#define TEXT_FOR_DEVICE(xx) xx "_device",
> +#define TEXT_FOR_DEVICE(xx, yy) [xx##_DEVICE] = yy "_device",
>  #else
> -#define TEXT_FOR_DEVICE(xx)
> +#define TEXT_FOR_DEVICE(xx, yy)
>  #endif
>  
> -#define TEXTS_FOR_ZONES(xx) TEXT_FOR_DMA(xx) TEXT_FOR_DMA32(xx) xx "_normal", \
> -					TEXT_FOR_HIGHMEM(xx) xx "_movable", \
> -					TEXT_FOR_DEVICE(xx)
> +#define TEXTS_FOR_ZONES(xx, yy)			\
> +	TEXT_FOR_DMA(xx, yy)			\
> +	TEXT_FOR_DMA32(xx, yy)			\
> +	[xx##_NORMAL] = yy "_normal",		\
> +	TEXT_FOR_HIGHMEM(xx, yy)		\
> +	[xx##_MOVABLE] = yy "_movable",		\
> +	TEXT_FOR_DEVICE(xx, yy)
>  
>  const char * const vmstat_text[] = {
>  	/* enum zone_stat_item counters */
> -	"nr_free_pages",
> -	"nr_free_pages_blocks",
> -	"nr_zone_inactive_anon",
> -	"nr_zone_active_anon",
> -	"nr_zone_inactive_file",
> -	"nr_zone_active_file",
> -	"nr_zone_unevictable",
> -	"nr_zone_write_pending",
> -	"nr_mlock",
> +#define I(x) (x)
> +	[I(NR_FREE_PAGES)]			= "nr_free_pages",
> +	[I(NR_FREE_PAGES_BLOCKS)]		= "nr_free_pages_blocks",
> +	[I(NR_ZONE_INACTIVE_ANON)]		= "nr_zone_inactive_anon",
> +	[I(NR_ZONE_ACTIVE_ANON)]		= "nr_zone_active_anon",
> +	[I(NR_ZONE_INACTIVE_FILE)]		= "nr_zone_inactive_file",
> +	[I(NR_ZONE_ACTIVE_FILE)]		= "nr_zone_active_file",
> +	[I(NR_ZONE_UNEVICTABLE)]		= "nr_zone_unevictable",
> +	[I(NR_ZONE_WRITE_PENDING)]		= "nr_zone_write_pending",
> +	[I(NR_MLOCK)]				= "nr_mlock",
>  #if IS_ENABLED(CONFIG_ZSMALLOC)
> -	"nr_zspages",
> +	[I(NR_ZSPAGES)]				= "nr_zspages",
>  #endif
> -	"nr_free_cma",
> +	[I(NR_FREE_CMA_PAGES)]			= "nr_free_cma",
>  #ifdef CONFIG_UNACCEPTED_MEMORY
> -	"nr_unaccepted",
> +	[I(NR_UNACCEPTED)]			= "nr_unaccepted",
>  #endif
> +#undef I
>  
>  	/* enum numa_stat_item counters */
> +#define I(x) (NR_VM_ZONE_STAT_ITEMS + x)
>  #ifdef CONFIG_NUMA
> -	"numa_hit",
> -	"numa_miss",
> -	"numa_foreign",
> -	"numa_interleave",
> -	"numa_local",
> -	"numa_other",
> +	[I(NUMA_HIT)]				= "numa_hit",
> +	[I(NUMA_MISS)]				= "numa_miss",
> +	[I(NUMA_FOREIGN)]			= "numa_foreign",
> +	[I(NUMA_INTERLEAVE_HIT)]		= "numa_interleave",
> +	[I(NUMA_LOCAL)]				= "numa_local",
> +	[I(NUMA_OTHER)]				= "numa_other",
>  #endif
> +#undef I
>  
>  	/* enum node_stat_item counters */
> -	"nr_inactive_anon",
> -	"nr_active_anon",
> -	"nr_inactive_file",
> -	"nr_active_file",
> -	"nr_unevictable",
> -	"nr_slab_reclaimable",
> -	"nr_slab_unreclaimable",
> -	"nr_isolated_anon",
> -	"nr_isolated_file",
> -	"workingset_nodes",
> -	"workingset_refault_anon",
> -	"workingset_refault_file",
> -	"workingset_activate_anon",
> -	"workingset_activate_file",
> -	"workingset_restore_anon",
> -	"workingset_restore_file",
> -	"workingset_nodereclaim",
> -	"nr_anon_pages",
> -	"nr_mapped",
> -	"nr_file_pages",
> -	"nr_dirty",
> -	"nr_writeback",
> -	"nr_writeback_temp",
> -	"nr_shmem",
> -	"nr_shmem_hugepages",
> -	"nr_shmem_pmdmapped",
> -	"nr_file_hugepages",
> -	"nr_file_pmdmapped",
> -	"nr_anon_transparent_hugepages",
> -	"nr_vmscan_write",
> -	"nr_vmscan_immediate_reclaim",
> -	"nr_dirtied",
> -	"nr_written",
> -	"nr_throttled_written",
> -	"nr_kernel_misc_reclaimable",
> -	"nr_foll_pin_acquired",
> -	"nr_foll_pin_released",
> -	"nr_kernel_stack",
> +#define I(x) (NR_VM_ZONE_STAT_ITEMS + NR_VM_NUMA_EVENT_ITEMS + x)
> +	[I(NR_INACTIVE_ANON)]			= "nr_inactive_anon",
> +	[I(NR_ACTIVE_ANON)]			= "nr_active_anon",
> +	[I(NR_INACTIVE_FILE)]			= "nr_inactive_file",
> +	[I(NR_ACTIVE_FILE)]			= "nr_active_file",
> +	[I(NR_UNEVICTABLE)]			= "nr_unevictable",
> +	[I(NR_SLAB_RECLAIMABLE_B)]		= "nr_slab_reclaimable",
> +	[I(NR_SLAB_UNRECLAIMABLE_B)]		= "nr_slab_unreclaimable",
> +	[I(NR_ISOLATED_ANON)]			= "nr_isolated_anon",
> +	[I(NR_ISOLATED_FILE)]			= "nr_isolated_file",
> +	[I(WORKINGSET_NODES)]			= "workingset_nodes",
> +	[I(WORKINGSET_REFAULT_ANON)]		= "workingset_refault_anon",
> +	[I(WORKINGSET_REFAULT_FILE)]		= "workingset_refault_file",
> +	[I(WORKINGSET_ACTIVATE_ANON)]		= "workingset_activate_anon",
> +	[I(WORKINGSET_ACTIVATE_FILE)]		= "workingset_activate_file",
> +	[I(WORKINGSET_RESTORE_ANON)]		= "workingset_restore_anon",
> +	[I(WORKINGSET_RESTORE_FILE)]		= "workingset_restore_file",
> +	[I(WORKINGSET_NODERECLAIM)]		= "workingset_nodereclaim",
> +	[I(NR_ANON_MAPPED)]			= "nr_anon_pages",
> +	[I(NR_FILE_MAPPED)]			= "nr_mapped",
> +	[I(NR_FILE_PAGES)]			= "nr_file_pages",
> +	[I(NR_FILE_DIRTY)]			= "nr_dirty",
> +	[I(NR_WRITEBACK)]			= "nr_writeback",
> +	[I(NR_WRITEBACK_TEMP)]			= "nr_writeback_temp",
> +	[I(NR_SHMEM)]				= "nr_shmem",
> +	[I(NR_SHMEM_THPS)]			= "nr_shmem_hugepages",
> +	[I(NR_SHMEM_PMDMAPPED)]			= "nr_shmem_pmdmapped",
> +	[I(NR_FILE_THPS)]			= "nr_file_hugepages",
> +	[I(NR_FILE_PMDMAPPED)]			= "nr_file_pmdmapped",
> +	[I(NR_ANON_THPS)]			= "nr_anon_transparent_hugepages",
> +	[I(NR_VMSCAN_WRITE)]			= "nr_vmscan_write",
> +	[I(NR_VMSCAN_IMMEDIATE)]		= "nr_vmscan_immediate_reclaim",
> +	[I(NR_DIRTIED)]				= "nr_dirtied",
> +	[I(NR_WRITTEN)]				= "nr_written",
> +	[I(NR_THROTTLED_WRITTEN)]		= "nr_throttled_written",
> +	[I(NR_KERNEL_MISC_RECLAIMABLE)]		= "nr_kernel_misc_reclaimable",
> +	[I(NR_FOLL_PIN_ACQUIRED)]		= "nr_foll_pin_acquired",
> +	[I(NR_FOLL_PIN_RELEASED)]		= "nr_foll_pin_released",
> +	[I(NR_KERNEL_STACK_KB)]			= "nr_kernel_stack",
>  #if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
> -	"nr_shadow_call_stack",
> +	[I(NR_KERNEL_SCS_KB)]			= "nr_shadow_call_stack",
>  #endif
> -	"nr_page_table_pages",
> -	"nr_sec_page_table_pages",
> +	[I(NR_PAGETABLE)]			= "nr_page_table_pages",
> +	[I(NR_SECONDARY_PAGETABLE)]		= "nr_sec_page_table_pages",
>  #ifdef CONFIG_IOMMU_SUPPORT
> -	"nr_iommu_pages",
> +	[I(NR_IOMMU_PAGES)]			= "nr_iommu_pages",
>  #endif
>  #ifdef CONFIG_SWAP
> -	"nr_swapcached",
> +	[I(NR_SWAPCACHE)]			= "nr_swapcached",
>  #endif
>  #ifdef CONFIG_NUMA_BALANCING
> -	"pgpromote_success",
> -	"pgpromote_candidate",
> +	[I(PGPROMOTE_SUCCESS)]			= "pgpromote_success",
> +	[I(PGPROMOTE_CANDIDATE)]		= "pgpromote_candidate",
>  #endif
> -	"pgdemote_kswapd",
> -	"pgdemote_direct",
> -	"pgdemote_khugepaged",
> -	"pgdemote_proactive",
> +	[I(PGDEMOTE_KSWAPD)]			= "pgdemote_kswapd",
> +	[I(PGDEMOTE_DIRECT)]			= "pgdemote_direct",
> +	[I(PGDEMOTE_KHUGEPAGED)]		= "pgdemote_khugepaged",
> +	[I(PGDEMOTE_PROACTIVE)]			= "pgdemote_proactive",
>  #ifdef CONFIG_HUGETLB_PAGE
> -	"nr_hugetlb",
> +	[I(NR_HUGETLB)]				= "nr_hugetlb",
>  #endif
> -	"nr_balloon_pages",
> +	[I(NR_BALLOON_PAGES)]			= "nr_balloon_pages",
> +#undef I
> +
>  	/* system-wide enum vm_stat_item counters */
> -	"nr_dirty_threshold",
> -	"nr_dirty_background_threshold",
> -	"nr_memmap_pages",
> -	"nr_memmap_boot_pages",
> +#define I(x) (NR_VM_ZONE_STAT_ITEMS + NR_VM_NUMA_EVENT_ITEMS + \
> +	     NR_VM_NODE_STAT_ITEMS + x)
> +	[I(NR_DIRTY_THRESHOLD)]			= "nr_dirty_threshold",
> +	[I(NR_DIRTY_BG_THRESHOLD)]		= "nr_dirty_background_threshold",
> +	[I(NR_MEMMAP_PAGES)]			= "nr_memmap_pages",
> +	[I(NR_MEMMAP_BOOT_PAGES)]		= "nr_memmap_boot_pages",
> +#undef I
>  
>  #if defined(CONFIG_VM_EVENT_COUNTERS) || defined(CONFIG_MEMCG)
>  	/* enum vm_event_item counters */
> -	"pgpgin",
> -	"pgpgout",
> -	"pswpin",
> -	"pswpout",
> +#define I(x) (NR_VM_ZONE_STAT_ITEMS + NR_VM_NUMA_EVENT_ITEMS + \
> +	     NR_VM_NODE_STAT_ITEMS + NR_VM_STAT_ITEMS + x)
>  
> -	TEXTS_FOR_ZONES("pgalloc")
> -	TEXTS_FOR_ZONES("allocstall")
> -	TEXTS_FOR_ZONES("pgskip")
> +	[I(PGPGIN)]				= "pgpgin",
> +	[I(PGPGOUT)]				= "pgpgout",
> +	[I(PSWPIN)]				= "pswpin",
> +	[I(PSWPOUT)]				= "pswpout",
>  
> -	"pgfree",
> -	"pgactivate",
> -	"pgdeactivate",
> -	"pglazyfree",
> +#define OFF (NR_VM_ZONE_STAT_ITEMS + NR_VM_NUMA_EVENT_ITEMS + \
> +	     NR_VM_NODE_STAT_ITEMS + NR_VM_STAT_ITEMS)
> +	TEXTS_FOR_ZONES(OFF+PGALLOC, "pgalloc")
> +	TEXTS_FOR_ZONES(OFF+ALLOCSTALL, "allocstall")
> +	TEXTS_FOR_ZONES(OFF+PGSCAN_SKIP, "pgskip")
> +#undef OFF
>  
> -	"pgfault",
> -	"pgmajfault",
> -	"pglazyfreed",
> +	[I(PGFREE)]				= "pgfree",
> +	[I(PGACTIVATE)]				= "pgactivate",
> +	[I(PGDEACTIVATE)]			= "pgdeactivate",
> +	[I(PGLAZYFREE)]				= "pglazyfree",
>  
> -	"pgrefill",
> -	"pgreuse",
> -	"pgsteal_kswapd",
> -	"pgsteal_direct",
> -	"pgsteal_khugepaged",
> -	"pgsteal_proactive",
> -	"pgscan_kswapd",
> -	"pgscan_direct",
> -	"pgscan_khugepaged",
> -	"pgscan_proactive",
> -	"pgscan_direct_throttle",
> -	"pgscan_anon",
> -	"pgscan_file",
> -	"pgsteal_anon",
> -	"pgsteal_file",
> +	[I(PGFAULT)]				= "pgfault",
> +	[I(PGMAJFAULT)]				= "pgmajfault",
> +	[I(PGLAZYFREED)]			= "pglazyfreed",
> +
> +	[I(PGREFILL)]				= "pgrefill",
> +	[I(PGREUSE)]				= "pgreuse",
> +	[I(PGSTEAL_KSWAPD)]			= "pgsteal_kswapd",
> +	[I(PGSTEAL_DIRECT)]			= "pgsteal_direct",
> +	[I(PGSTEAL_KHUGEPAGED)]			= "pgsteal_khugepaged",
> +	[I(PGSTEAL_PROACTIVE)]			= "pgsteal_proactive",
> +	[I(PGSCAN_KSWAPD)]			= "pgscan_kswapd",
> +	[I(PGSCAN_DIRECT)]			= "pgscan_direct",
> +	[I(PGSCAN_KHUGEPAGED)]			= "pgscan_khugepaged",
> +	[I(PGSCAN_PROACTIVE)]			= "pgscan_proactive",
> +	[I(PGSCAN_DIRECT_THROTTLE)]		= "pgscan_direct_throttle",
> +	[I(PGSCAN_ANON)]			= "pgscan_anon",
> +	[I(PGSCAN_FILE)]			= "pgscan_file",
> +	[I(PGSTEAL_ANON)]			= "pgsteal_anon",
> +	[I(PGSTEAL_FILE)]			= "pgsteal_file",
>  
>  #ifdef CONFIG_NUMA
> -	"zone_reclaim_success",
> -	"zone_reclaim_failed",
> +	[I(PGSCAN_ZONE_RECLAIM_SUCCESS)]	= "zone_reclaim_success",
> +	[I(PGSCAN_ZONE_RECLAIM_FAILED)]		= "zone_reclaim_failed",
>  #endif
> -	"pginodesteal",
> -	"slabs_scanned",
> -	"kswapd_inodesteal",
> -	"kswapd_low_wmark_hit_quickly",
> -	"kswapd_high_wmark_hit_quickly",
> -	"pageoutrun",
> +	[I(PGINODESTEAL)]			= "pginodesteal",
> +	[I(SLABS_SCANNED)]			= "slabs_scanned",
> +	[I(KSWAPD_INODESTEAL)]			= "kswapd_inodesteal",
> +	[I(KSWAPD_LOW_WMARK_HIT_QUICKLY)]	= "kswapd_low_wmark_hit_quickly",
> +	[I(KSWAPD_HIGH_WMARK_HIT_QUICKLY)]	= "kswapd_high_wmark_hit_quickly",
> +	[I(PAGEOUTRUN)]				= "pageoutrun",
>  
> -	"pgrotated",
> +	[I(PGROTATED)]				= "pgrotated",
>  
> -	"drop_pagecache",
> -	"drop_slab",
> -	"oom_kill",
> +	[I(DROP_PAGECACHE)]			= "drop_pagecache",
> +	[I(DROP_SLAB)]				= "drop_slab",
> +	[I(OOM_KILL)]				= "oom_kill",
>  
>  #ifdef CONFIG_NUMA_BALANCING
> -	"numa_pte_updates",
> -	"numa_huge_pte_updates",
> -	"numa_hint_faults",
> -	"numa_hint_faults_local",
> -	"numa_pages_migrated",
> -	"numa_task_migrated",
> -	"numa_task_swapped",
> +	[I(NUMA_PTE_UPDATES)]			= "numa_pte_updates",
> +	[I(NUMA_HUGE_PTE_UPDATES)]		= "numa_huge_pte_updates",
> +	[I(NUMA_HINT_FAULTS)]			= "numa_hint_faults",
> +	[I(NUMA_HINT_FAULTS_LOCAL)]		= "numa_hint_faults_local",
> +	[I(NUMA_PAGE_MIGRATE)]			= "numa_pages_migrated",
> +	[I(NUMA_TASK_MIGRATE)]			= "numa_task_migrated",
> +	[I(NUMA_TASK_SWAP)]			= "numa_task_swapped",
>  #endif
>  #ifdef CONFIG_MIGRATION
> -	"pgmigrate_success",
> -	"pgmigrate_fail",
> -	"thp_migration_success",
> -	"thp_migration_fail",
> -	"thp_migration_split",
> +	[I(PGMIGRATE_SUCCESS)]			= "pgmigrate_success",
> +	[I(PGMIGRATE_FAIL)]			= "pgmigrate_fail",
> +	[I(THP_MIGRATION_SUCCESS)]		= "thp_migration_success",
> +	[I(THP_MIGRATION_FAIL)]			= "thp_migration_fail",
> +	[I(THP_MIGRATION_SPLIT)]		= "thp_migration_split",
>  #endif
>  #ifdef CONFIG_COMPACTION
> -	"compact_migrate_scanned",
> -	"compact_free_scanned",
> -	"compact_isolated",
> -	"compact_stall",
> -	"compact_fail",
> -	"compact_success",
> -	"compact_daemon_wake",
> -	"compact_daemon_migrate_scanned",
> -	"compact_daemon_free_scanned",
> +	[I(COMPACTMIGRATE_SCANNED)]		= "compact_migrate_scanned",
> +	[I(COMPACTFREE_SCANNED)]		= "compact_free_scanned",
> +	[I(COMPACTISOLATED)]			= "compact_isolated",
> +	[I(COMPACTSTALL)]			= "compact_stall",
> +	[I(COMPACTFAIL)]			= "compact_fail",
> +	[I(COMPACTSUCCESS)]			= "compact_success",
> +	[I(KCOMPACTD_WAKE)]			= "compact_daemon_wake",
> +	[I(KCOMPACTD_MIGRATE_SCANNED)]		= "compact_daemon_migrate_scanned",
> +	[I(KCOMPACTD_FREE_SCANNED)]		= "compact_daemon_free_scanned",
>  #endif
>  
>  #ifdef CONFIG_HUGETLB_PAGE
> -	"htlb_buddy_alloc_success",
> -	"htlb_buddy_alloc_fail",
> +	[I(HTLB_BUDDY_PGALLOC)]			= "htlb_buddy_alloc_success",
> +	[I(HTLB_BUDDY_PGALLOC_FAIL)]		= "htlb_buddy_alloc_fail",
>  #endif
>  #ifdef CONFIG_CMA
> -	"cma_alloc_success",
> -	"cma_alloc_fail",
> +	[I(CMA_ALLOC_SUCCESS)]			= "cma_alloc_success",
> +	[I(CMA_ALLOC_FAIL)]			= "cma_alloc_fail",
>  #endif
> -	"unevictable_pgs_culled",
> -	"unevictable_pgs_scanned",
> -	"unevictable_pgs_rescued",
> -	"unevictable_pgs_mlocked",
> -	"unevictable_pgs_munlocked",
> -	"unevictable_pgs_cleared",
> -	"unevictable_pgs_stranded",
> +	[I(UNEVICTABLE_PGCULLED)]		= "unevictable_pgs_culled",
> +	[I(UNEVICTABLE_PGSCANNED)]		= "unevictable_pgs_scanned",
> +	[I(UNEVICTABLE_PGRESCUED)]		= "unevictable_pgs_rescued",
> +	[I(UNEVICTABLE_PGMLOCKED)]		= "unevictable_pgs_mlocked",
> +	[I(UNEVICTABLE_PGMUNLOCKED)]		= "unevictable_pgs_munlocked",
> +	[I(UNEVICTABLE_PGCLEARED)]		= "unevictable_pgs_cleared",
> +	[I(UNEVICTABLE_PGSTRANDED)]		= "unevictable_pgs_stranded",
>  
>  #ifdef CONFIG_TRANSPARENT_HUGEPAGE
> -	"thp_fault_alloc",
> -	"thp_fault_fallback",
> -	"thp_fault_fallback_charge",
> -	"thp_collapse_alloc",
> -	"thp_collapse_alloc_failed",
> -	"thp_file_alloc",
> -	"thp_file_fallback",
> -	"thp_file_fallback_charge",
> -	"thp_file_mapped",
> -	"thp_split_page",
> -	"thp_split_page_failed",
> -	"thp_deferred_split_page",
> -	"thp_underused_split_page",
> -	"thp_split_pmd",
> -	"thp_scan_exceed_none_pte",
> -	"thp_scan_exceed_swap_pte",
> -	"thp_scan_exceed_share_pte",
> +	[I(THP_FAULT_ALLOC)]			= "thp_fault_alloc",
> +	[I(THP_FAULT_FALLBACK)]			= "thp_fault_fallback",
> +	[I(THP_FAULT_FALLBACK_CHARGE)]		= "thp_fault_fallback_charge",
> +	[I(THP_COLLAPSE_ALLOC)]			= "thp_collapse_alloc",
> +	[I(THP_COLLAPSE_ALLOC_FAILED)]		= "thp_collapse_alloc_failed",
> +	[I(THP_FILE_ALLOC)]			= "thp_file_alloc",
> +	[I(THP_FILE_FALLBACK)]			= "thp_file_fallback",
> +	[I(THP_FILE_FALLBACK_CHARGE)]		= "thp_file_fallback_charge",
> +	[I(THP_FILE_MAPPED)]			= "thp_file_mapped",
> +	[I(THP_SPLIT_PAGE)]			= "thp_split_page",
> +	[I(THP_SPLIT_PAGE_FAILED)]		= "thp_split_page_failed",
> +	[I(THP_DEFERRED_SPLIT_PAGE)]		= "thp_deferred_split_page",
> +	[I(THP_UNDERUSED_SPLIT_PAGE)]		= "thp_underused_split_page",
> +	[I(THP_SPLIT_PMD)]			= "thp_split_pmd",
> +	[I(THP_SCAN_EXCEED_NONE_PTE)]		= "thp_scan_exceed_none_pte",
> +	[I(THP_SCAN_EXCEED_SWAP_PTE)]		= "thp_scan_exceed_swap_pte",
> +	[I(THP_SCAN_EXCEED_SHARED_PTE)]		= "thp_scan_exceed_share_pte",
>  #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
> -	"thp_split_pud",
> +	[I(THP_SPLIT_PUD)]			= "thp_split_pud",
>  #endif
> -	"thp_zero_page_alloc",
> -	"thp_zero_page_alloc_failed",
> -	"thp_swpout",
> -	"thp_swpout_fallback",
> +	[I(THP_ZERO_PAGE_ALLOC)]		= "thp_zero_page_alloc",
> +	[I(THP_ZERO_PAGE_ALLOC_FAILED)]		= "thp_zero_page_alloc_failed",
> +	[I(THP_SWPOUT)]				= "thp_swpout",
> +	[I(THP_SWPOUT_FALLBACK)]		= "thp_swpout_fallback",
>  #endif
>  #ifdef CONFIG_MEMORY_BALLOON
> -	"balloon_inflate",
> -	"balloon_deflate",
> +	[I(BALLOON_INFLATE)]			= "balloon_inflate",
> +	[I(BALLOON_DEFLATE)]			= "balloon_deflate",
>  #ifdef CONFIG_BALLOON_COMPACTION
> -	"balloon_migrate",
> +	[I(BALLOON_MIGRATE)]			= "balloon_migrate",
>  #endif
>  #endif /* CONFIG_MEMORY_BALLOON */
>  #ifdef CONFIG_DEBUG_TLBFLUSH
> -	"nr_tlb_remote_flush",
> -	"nr_tlb_remote_flush_received",
> -	"nr_tlb_local_flush_all",
> -	"nr_tlb_local_flush_one",
> +	[I(NR_TLB_REMOTE_FLUSH)]		= "nr_tlb_remote_flush",
> +	[I(NR_TLB_REMOTE_FLUSH_RECEIVED)]	= "nr_tlb_remote_flush_received",
> +	[I(NR_TLB_LOCAL_FLUSH_ALL)]		= "nr_tlb_local_flush_all",
> +	[I(NR_TLB_LOCAL_FLUSH_ONE)]		= "nr_tlb_local_flush_one",
>  #endif /* CONFIG_DEBUG_TLBFLUSH */
>  
>  #ifdef CONFIG_SWAP
> -	"swap_ra",
> -	"swap_ra_hit",
> -	"swpin_zero",
> -	"swpout_zero",
> +	[I(SWAP_RA)]				= "swap_ra",
> +	[I(SWAP_RA_HIT)]			= "swap_ra_hit",
> +	[I(SWPIN_ZERO)]				= "swpin_zero",
> +	[I(SWPOUT_ZERO)]			= "swpout_zero",
>  #ifdef CONFIG_KSM
> -	"ksm_swpin_copy",
> +	[I(KSM_SWPIN_COPY)]			= "ksm_swpin_copy",
>  #endif
>  #endif
>  #ifdef CONFIG_KSM
> -	"cow_ksm",
> +	[I(COW_KSM)]				= "cow_ksm",
>  #endif
>  #ifdef CONFIG_ZSWAP
> -	"zswpin",
> -	"zswpout",
> -	"zswpwb",
> +	[I(ZSWPIN)]				= "zswpin",
> +	[I(ZSWPOUT)]				= "zswpout",
> +	[I(ZSWPWB)]				= "zswpwb",
>  #endif
>  #ifdef CONFIG_X86
> -	"direct_map_level2_splits",
> -	"direct_map_level3_splits",
> -	"direct_map_level2_collapses",
> -	"direct_map_level3_collapses",
> +	[I(DIRECT_MAP_LEVEL2_SPLIT)]		= "direct_map_level2_splits",
> +	[I(DIRECT_MAP_LEVEL3_SPLIT)]		= "direct_map_level3_splits",
> +	[I(DIRECT_MAP_LEVEL2_COLLAPSE)]		= "direct_map_level2_collapses",
> +	[I(DIRECT_MAP_LEVEL3_COLLAPSE)]		= "direct_map_level3_collapses",
>  #endif
>  #ifdef CONFIG_PER_VMA_LOCK_STATS
> -	"vma_lock_success",
> -	"vma_lock_abort",
> -	"vma_lock_retry",
> -	"vma_lock_miss",
> +	[I(VMA_LOCK_SUCCESS)]			= "vma_lock_success",
> +	[I(VMA_LOCK_ABORT)]			= "vma_lock_abort",
> +	[I(VMA_LOCK_RETRY)]			= "vma_lock_retry",
> +	[I(VMA_LOCK_MISS)]			= "vma_lock_miss",
>  #endif
>  #ifdef CONFIG_DEBUG_STACK_USAGE
> -	"kstack_1k",
> +	[I(KSTACK_1K)]				= "kstack_1k",
>  #if THREAD_SIZE > 1024
> -	"kstack_2k",
> +	[I(KSTACK_2K)]				= "kstack_2k",
>  #endif
>  #if THREAD_SIZE > 2048
> -	"kstack_4k",
> +	[I(KSTACK_4K)]				= "kstack_4k",
>  #endif
>  #if THREAD_SIZE > 4096
> -	"kstack_8k",
> +	[I(KSTACK_8K)]				= "kstack_8k",
>  #endif
>  #if THREAD_SIZE > 8192
> -	"kstack_16k",
> +	[I(KSTACK_16K)]				= "kstack_16k",
>  #endif
>  #if THREAD_SIZE > 16384
> -	"kstack_32k",
> +	[I(KSTACK_32K)]				= "kstack_32k",
>  #endif
>  #if THREAD_SIZE > 32768
> -	"kstack_64k",
> +	[I(KSTACK_64K)]				= "kstack_64k",
>  #endif
>  #if THREAD_SIZE > 65536
> -	"kstack_rest",
> +	[I(KSTACK_REST)]			= "kstack_rest",
>  #endif
>  #endif
> +#undef I
>  #endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */
>  };
>  #endif /* CONFIG_PROC_FS || CONFIG_SYSFS || CONFIG_NUMA || CONFIG_MEMCG */
> -- 
> 2.47.2

-- 
Michal Hocko
SUSE Labs

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ