diff --git a/patches.kabi/kabi-fix-zone-unaccepted-memory.patch b/patches.kabi/kabi-fix-zone-unaccepted-memory.patch index ff645b3..e552f31 100644 --- a/patches.kabi/kabi-fix-zone-unaccepted-memory.patch +++ b/patches.kabi/kabi-fix-zone-unaccepted-memory.patch @@ -1,7 +1,7 @@ From: Vlastimil Babka Subject: kabi: fix struct zone kabi after adding unaccepted_pages and NR_UNACCEPTED Patch-mainline: Never, KABI -References: jsc#PED-7167 bsc#1218643 +References: jsc#PED-7167 bsc#1218643 bsc#1221338 bsc#1220114 To add unaccepted_pages, we can move it to the hole before pad1. Keep exposing it to kabi checker outside of x86_64 so the hole assumption is forced to be @@ -24,22 +24,19 @@ Caveat: any future patches adding code with NR_UNACCEPTED using the normal helpers will compile, but modify NR_FREE_PAGES due to having the same value and typing on enums not being strong enough. +In vmstat_text[] we add the new field as the very last one and adjust printing +vmstat, node vmstat, zoneinfo, to include the field. + Signed-off-by: Vlastimil Babka -[mkoutny: Strictly speaking vmstat_text[] is as part of KABI as enum - zone_stat_item. Instead of adding the secondary vmstat_text[] translation - table, carefully account for the added member in idx->name helpers. The - correction reduces to 0 when !CONFIG_UNACCEPTED_MEMORY. - Helpers inlined in 3rd party code remain broken (but assume this code won't - depend on/expose the string representations).] --- - drivers/base/node.c | 2 +- + drivers/base/node.c | 7 ++++++- fs/proc/meminfo.c | 2 +- include/linux/mmzone.h | 30 ++++++++++++++++++++++++------ - include/linux/vmstat.h | 40 ++++++++++++++++++++++++++++++++++++---- + include/linux/vmstat.h | 42 ++++++++++++++++++++++++++++++++++++++++++ mm/page_alloc.c | 6 +++--- - mm/vmstat.c | 26 ++++++++++++++++++++++++++ - 6 files changed, 91 insertions(+), 15 deletions(-) + mm/vmstat.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- + 6 files changed, 118 insertions(+), 15 deletions(-) --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -52,6 +49,18 @@ Signed-off-by: Vlastimil Babka #endif ); len += hugetlb_report_node_meminfo(buf, len, nid); +@@ -540,6 +540,11 @@ static ssize_t node_read_vmstat(struct d + pages); + } + ++ for (i = 0; i < NR_VM_ZONE_STAT_ITEMS_2; i++) ++ len += sysfs_emit_at(buf, len, "%s %lu\n", ++ zone_stat_name_2(i), ++ sum_zone_node_page_state_2(nid, i)); ++ + return len; + } + static DEVICE_ATTR(vmstat, 0444, node_read_vmstat, NULL); --- a/fs/proc/meminfo.c +++ b/fs/proc/meminfo.c @@ -148,7 +148,7 @@ static int meminfo_proc_show(struct seq_ @@ -202,44 +211,26 @@ Signed-off-by: Vlastimil Babka void __inc_zone_page_state(struct page *, enum zone_stat_item); void __dec_zone_page_state(struct page *, enum zone_stat_item); -@@ -433,14 +465,14 @@ static inline const char *zone_stat_name - #ifdef CONFIG_NUMA - static inline const char *numa_stat_name(enum numa_stat_item item) - { -- return vmstat_text[NR_VM_ZONE_STAT_ITEMS + -+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS + NR_VM_ZONE_STAT_ITEMS_2 + - item]; +@@ -469,6 +501,16 @@ static inline const char *vm_event_name( } - #endif /* CONFIG_NUMA */ + #endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */ - static inline const char *node_stat_name(enum node_stat_item item) - { -- return vmstat_text[NR_VM_ZONE_STAT_ITEMS + -+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS + NR_VM_ZONE_STAT_ITEMS_2 + - NR_VM_NUMA_EVENT_ITEMS + - item]; - } -@@ -452,7 +484,7 @@ static inline const char *lru_list_name( ++static inline const char *zone_stat_name_2(enum zone_stat_item_2 item) ++{ ++ return vmstat_text[NR_VM_ZONE_STAT_ITEMS + ++ NR_VM_NUMA_EVENT_ITEMS + ++ NR_VM_NODE_STAT_ITEMS + ++ NR_VM_WRITEBACK_STAT_ITEMS + ++ NR_VM_EVENT_ITEMS + ++ item]; ++} ++ + #ifdef CONFIG_MEMCG - static inline const char *writeback_stat_name(enum writeback_stat_item item) - { -- return vmstat_text[NR_VM_ZONE_STAT_ITEMS + -+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS + NR_VM_ZONE_STAT_ITEMS_2 + - NR_VM_NUMA_EVENT_ITEMS + - NR_VM_NODE_STAT_ITEMS + - item]; -@@ -461,7 +493,7 @@ static inline const char *writeback_stat - #if defined(CONFIG_VM_EVENT_COUNTERS) || defined(CONFIG_MEMCG) - static inline const char *vm_event_name(enum vm_event_item item) - { -- return vmstat_text[NR_VM_ZONE_STAT_ITEMS + -+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS + NR_VM_ZONE_STAT_ITEMS_2 + - NR_VM_NUMA_EVENT_ITEMS + - NR_VM_NODE_STAT_ITEMS + - NR_VM_WRITEBACK_STAT_ITEMS + + void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -3834,7 +3834,7 @@ static inline long __zone_watermark_unus +@@ -3835,7 +3835,7 @@ static inline long __zone_watermark_unus unusable_free += zone_page_state(z, NR_FREE_CMA_PAGES); #endif #ifdef CONFIG_UNACCEPTED_MEMORY @@ -248,7 +239,7 @@ Signed-off-by: Vlastimil Babka #endif return unusable_free; -@@ -9682,7 +9682,7 @@ static bool try_to_accept_memory_one(str +@@ -9709,7 +9709,7 @@ static bool try_to_accept_memory_one(str last = list_empty(&zone->unaccepted_pages); __mod_zone_freepage_state(zone, -MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE); @@ -257,7 +248,7 @@ Signed-off-by: Vlastimil Babka spin_unlock_irqrestore(&zone->lock, flags); accept_page(page, MAX_ORDER - 1); -@@ -9734,7 +9734,7 @@ static bool __free_unaccepted(struct pag +@@ -9761,7 +9761,7 @@ static bool __free_unaccepted(struct pag first = list_empty(&zone->unaccepted_pages); list_add_tail(&page->lru, &zone->unaccepted_pages); __mod_zone_freepage_state(zone, MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE); @@ -268,7 +259,7 @@ Signed-off-by: Vlastimil Babka if (first) --- a/mm/vmstat.c +++ b/mm/vmstat.c -@@ -160,6 +160,7 @@ void vm_events_fold_cpu(int cpu) +@@ -161,6 +161,7 @@ void vm_events_fold_cpu(int cpu) * vm_stat contains the global counters */ atomic_long_t vm_zone_stat[NR_VM_ZONE_STAT_ITEMS] __cacheline_aligned_in_smp; @@ -276,7 +267,7 @@ Signed-off-by: Vlastimil Babka atomic_long_t vm_node_stat[NR_VM_NODE_STAT_ITEMS] __cacheline_aligned_in_smp; atomic_long_t vm_numa_event[NR_VM_NUMA_EVENT_ITEMS] __cacheline_aligned_in_smp; EXPORT_SYMBOL(vm_zone_stat); -@@ -372,6 +373,18 @@ void __mod_zone_page_state(struct zone * +@@ -373,6 +374,18 @@ void __mod_zone_page_state(struct zone * } EXPORT_SYMBOL(__mod_zone_page_state); @@ -295,11 +286,10 @@ Signed-off-by: Vlastimil Babka void __mod_node_page_state(struct pglist_data *pgdat, enum node_stat_item item, long delta) { -@@ -1003,6 +1016,19 @@ unsigned long sum_zone_node_page_state(i - +@@ -1005,6 +1018,19 @@ unsigned long sum_zone_node_page_state(i return count; } -+ + +unsigned long sum_zone_node_page_state_2(int node, + enum zone_stat_item_2 item) +{ @@ -312,6 +302,62 @@ Signed-off-by: Vlastimil Babka + + return count; +} - ++ /* Determine the per node value of a numa stat item. */ unsigned long sum_zone_numa_event_state(int node, + enum numa_stat_item item) +@@ -1181,9 +1207,6 @@ const char * const vmstat_text[] = { + "nr_zspages", + #endif + "nr_free_cma", +-#ifdef CONFIG_UNACCEPTED_MEMORY +- "nr_unaccepted", +-#endif + + /* enum numa_stat_item counters */ + #ifdef CONFIG_NUMA +@@ -1390,6 +1413,11 @@ const char * const vmstat_text[] = { + "direct_map_level3_splits", + #endif + #endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */ ++ ++ /* enum zone_stat_item_2 counters */ ++#ifdef CONFIG_UNACCEPTED_MEMORY ++ "nr_unaccepted", ++#endif + }; + #endif /* CONFIG_PROC_FS || CONFIG_SYSFS || CONFIG_NUMA || CONFIG_MEMCG */ + +@@ -1699,6 +1727,10 @@ static void zoneinfo_show_print(struct s + seq_printf(m, "\n %-12s %lu", zone_stat_name(i), + zone_page_state(zone, i)); + ++ for (i = 0; i < NR_VM_ZONE_STAT_ITEMS_2; i++) ++ seq_printf(m, "\n %-12s %lu", zone_stat_name_2(i), ++ zone_page_state_2(zone, i)); ++ + #ifdef CONFIG_NUMA + for (i = 0; i < NR_VM_NUMA_EVENT_ITEMS; i++) + seq_printf(m, "\n %-12s %lu", numa_stat_name(i), +@@ -1760,7 +1792,8 @@ static const struct seq_operations zonei + NR_VM_NODE_STAT_ITEMS + \ + NR_VM_WRITEBACK_STAT_ITEMS + \ + (IS_ENABLED(CONFIG_VM_EVENT_COUNTERS) ? \ +- NR_VM_EVENT_ITEMS : 0)) ++ NR_VM_EVENT_ITEMS : 0) + \ ++ NR_VM_ZONE_STAT_ITEMS_2) + + static void *vmstat_start(struct seq_file *m, loff_t *pos) + { +@@ -1802,6 +1835,11 @@ static void *vmstat_start(struct seq_fil + v[PGPGIN] /= 2; /* sectors -> kbytes */ + v[PGPGOUT] /= 2; + #endif ++ v += NR_VM_EVENT_ITEMS; ++ ++ for (i = 0; i < NR_VM_ZONE_STAT_ITEMS_2; i++) ++ v[i] = global_zone_page_state_2(i); ++ + return (unsigned long *)m->private + *pos; + } +