On Fri, 31 Jan 2025 11:12:23 -0800 Bart Van Assche wrote: > Commit 30c2de0a267c ("mm/vmstat: fix a W=1 clang compiler warning") > suppresses some but not all compiler warnings that are reported by clang > when building mm/ with W=1. Hence revert commit 30c2de0a267c and instead > make NR_LRU_BASE and NR_ZONE_LRU_BASE integer constants instead of > enumeration constants. Additionally, convert the item##_NORMAL constants > from type enum vm_event_item into int before subtracting ZONE_NORMAL. The > latter constant has type enum zone_type. Could we possibly please still consider taking this in for 6.14? :( Since the warning comes from vmstat.h pretty much every object file generates this warning. clang 19 is getting more widely used now, its making it hard to see new warnings. > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 9540b41894da..bc139c704538 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -135,11 +135,20 @@ enum numa_stat_item { > #define NR_VM_NUMA_EVENT_ITEMS 0 > #endif > > +/* > + * NR_ZONE_LRU_BASE and NR_VM_ZONE_STAT_ITEMS are often added to enumeration > + * constants of another type than enum_zone_stat_item. Define these constants > + * as an integer instead of enum node_stat_item to prevent that the compiler > + * warns about enumeration type mismatches when these constants are used. > + */ > +#define NR_ZONE_LRU_BASE (__NR_ZONE_LRU_BASE + 0) > +#define NR_VM_ZONE_STAT_ITEMS (__NR_VM_ZONE_STAT_ITEMS + 0) > + > enum zone_stat_item { > /* First 128 byte cacheline (assuming 64 bit words) */ > NR_FREE_PAGES, > - NR_ZONE_LRU_BASE, /* Used only for compaction and reclaim retry */ > - NR_ZONE_INACTIVE_ANON = NR_ZONE_LRU_BASE, > + __NR_ZONE_LRU_BASE, /* Used only for compaction and reclaim retry */ > + NR_ZONE_INACTIVE_ANON = __NR_ZONE_LRU_BASE, > NR_ZONE_ACTIVE_ANON, > NR_ZONE_INACTIVE_FILE, > NR_ZONE_ACTIVE_FILE, > @@ -155,11 +164,18 @@ enum zone_stat_item { > #ifdef CONFIG_UNACCEPTED_MEMORY > NR_UNACCEPTED, > #endif > - NR_VM_ZONE_STAT_ITEMS }; > + __NR_VM_ZONE_STAT_ITEMS }; > + > +/* > + * enum lru_list constants are often added to NR_LRU_BASE. Define NR_LRU_BASE > + * as an integer instead of enum node_stat_item to prevent that the compiler > + * warns about enumeration type mismatches. > + */ > +#define NR_LRU_BASE (__NR_LRU_BASE + 0) > > enum node_stat_item { > - NR_LRU_BASE, > - NR_INACTIVE_ANON = NR_LRU_BASE, /* must match order of LRU_[IN]ACTIVE */ > + __NR_LRU_BASE, > + NR_INACTIVE_ANON = __NR_LRU_BASE, /*must match order of LRU_[IN]ACTIVE*/ > NR_ACTIVE_ANON, /* " " " " " */ > NR_INACTIVE_FILE, /* " " " " " */ > NR_ACTIVE_FILE, /* " " " " " */ > diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h > index 9f3a04345b86..72d1974ee81f 100644 > --- a/include/linux/vmstat.h > +++ b/include/linux/vmstat.h > @@ -135,8 +135,13 @@ static inline void vm_events_fold_cpu(int cpu) > #define count_vm_vma_lock_event(x) do {} while (0) > #endif > > +/* > + * item##_NORMAL has type enum vm_event_item while ZONE_NORMAL and zid have > + * type enum zone_type. Suppress compiler warnings about mixing different > + * enumeration types by converting item##_NORMAL into an int with '+ 0'. > + */ > #define __count_zid_vm_events(item, zid, delta) \ > - __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta) > + __count_vm_events((item##_NORMAL + 0) - ZONE_NORMAL + zid, delta) > > /* > * Zone and node-based page accounting with per cpu differentials. > @@ -515,7 +520,7 @@ static inline const char *node_stat_name(enum node_stat_item item) > > static inline const char *lru_list_name(enum lru_list lru) > { > - return node_stat_name(NR_LRU_BASE + (enum node_stat_item)lru) + 3; // skip "nr_" > + return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" > } > > #if defined(CONFIG_VM_EVENT_COUNTERS) || defined(CONFIG_MEMCG) > >