mm: Initialise per_cpu_nodestats for all online pgdats at boot
Subsystems (3)
Paul Mackerras and Reza Arbab reported that machines with memoryless nodes fails when vmstats are refreshed. Paul reported an oops as follows
[ 1.713998] Unable to handle kernel paging request for data at address 0xff7a10000 [ 1.714164] Faulting instruction address: 0xc000000000270cd0 [ 1.714304] Oops: Kernel access of bad area, sig: 11 [#1] [ 1.714414] SMP NR_CPUS=2048 NUMA PowerNV [ 1.714530] Modules linked in: [ 1.714647] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.7.0-kvm+ #118 [ 1.714786] task: c000000ff0680010 task.stack: c000000ff0704000 [ 1.714926] NIP: c000000000270cd0 LR: c000000000270ce8 CTR: 0000000000000000 [ 1.715093] REGS: c000000ff0707900 TRAP: 0300 Not tainted (4.7.0-kvm+) [ 1.715232] MSR: 9000000102009033 <SF,HV,VEC,EE,ME,IR,DR,RI,LE,TM[E]> CR: 846b6824 XER: 20000000 [ 1.715748] CFAR: c000000000008768 DAR: 0000000ff7a10000 DSISR: 42000000 SOFTE: 1
GPR00: c000000000270d08 c000000ff0707b80 c0000000011fb200 0000000000000000
GPR04: 0000000000000800 0000000000000000 0000000000000000 0000000000000000
GPR08: ffffffffffffffff 0000000000000000 0000000ff7a10000 c00000000122aae0
GPR12: c000000000a1e440 c00000000fb80000 c00000000000c188 0000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 c000000000cecad0
GPR24: c000000000d035b8 c000000000d6cd18 c000000000d6cd18 c000001fffa86300
GPR28: 0000000000000000 c000001fffa96300 c000000001230034 c00000000122eb18
[ 1.717484] NIP [c000000000270cd0] refresh_zone_stat_thresholds+0x80/0x240 [ 1.717568] LR [c000000000270ce8] refresh_zone_stat_thresholds+0x98/0x240 [ 1.717648] Call Trace: [ 1.717687] [c000000ff0707b80] [c000000000270d08] refresh_zone_stat_thresholds+0xb8/0x240 (unreliable)
Both supplied potential fixes but one potentially misses checks and another had redundant initialisations. This version initialises per_cpu_nodestats on a per-pgdat basis instead of on a per-zone basis.
---
This has been compile-tested and boot-tested on a 32-bit KVM only. A memoryless system was not available to test the patch with. A confirmation from Paul and Reza that it resolves their problem is welcome.
mm/page_alloc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
mm/page_alloc.c +5 -5
@@ -5257,11 +5257,6 @@ static void __meminit setup_zone_pageset(struct zone *zone) zone->pageset = alloc_percpu(struct per_cpu_pageset);for_each_possible_cpu (cpu)zone_pageset_init (zone, cpu); - -if (!zone->zone_pgdat->per_cpu_nodestats) { - zone->zone_pgdat->per_cpu_nodestats = - alloc_percpu(struct per_cpu_nodestat); - } }/*
@@ -5270,10 +5265,15 @@ static void __meminit setup_zone_pageset(struct zone *zone)*/ void __init setup_per_cpu_pageset (void ) { +struct pglist_data *pgdat;struct zone *zone;for_each_populated_zone (zone)setup_zone_pageset (zone); + +for_each_online_pgdat (pgdat) + pgdat->per_cpu_nodestats = + alloc_percpu(struct per_cpu_nodestat); } static noinline __ref
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Reza Arbab
Tested-byQuoted 3 lines · Mel Gorman
This has been compile-tested and boot-tested on a 32-bit KVM only. A memoryless system was not available to test the patch with. A confirmation from Paul and Reza that it resolves their problem is welcome.
Works for me. Thanks, Mel!
Signature · 7 lines
Reza Arbab -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Paul Mackerras
Tested-byQuoted 27 lines · Mel Gorman
Paul Mackerras and Reza Arbab reported that machines with memoryless nodes fails when vmstats are refreshed. Paul reported an oops as follows
[ 1.713998] Unable to handle kernel paging request for data at address 0xff7a10000 [ 1.714164] Faulting instruction address: 0xc000000000270cd0 [ 1.714304] Oops: Kernel access of bad area, sig: 11 [#1] [ 1.714414] SMP NR_CPUS=2048 NUMA PowerNV [ 1.714530] Modules linked in: [ 1.714647] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.7.0-kvm+ #118 [ 1.714786] task: c000000ff0680010 task.stack: c000000ff0704000 [ 1.714926] NIP: c000000000270cd0 LR: c000000000270ce8 CTR: 0000000000000000 [ 1.715093] REGS: c000000ff0707900 TRAP: 0300 Not tainted (4.7.0-kvm+) [ 1.715232] MSR: 9000000102009033 <SF,HV,VEC,EE,ME,IR,DR,RI,LE,TM[E]> CR: 846b6824 XER: 20000000 [ 1.715748] CFAR: c000000000008768 DAR: 0000000ff7a10000 DSISR: 42000000 SOFTE: 1GPR00:
c000000000270d08c000000ff0707b80c0000000011fb2000000000000000000
GPR04: 0000000000000800 0000000000000000 0000000000000000 0000000000000000
GPR08: ffffffffffffffff 00000000000000000000000ff7a10000c00000000122aae0
GPR12:c000000000a1e440c00000000fb80000c00000000000c1880000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000c000000000cecad0
GPR24:c000000000d035b8c000000000d6cd18c000000000d6cd18c000001fffa86300
GPR28: 0000000000000000c000001fffa96300c000000001230034c00000000122eb18[ 1.717484] NIP [c000000000270cd0] refresh_zone_stat_thresholds+0x80/0x240 [ 1.717568] LR [c000000000270ce8] refresh_zone_stat_thresholds+0x98/0x240 [ 1.717648] Call Trace: [ 1.717687] [c000000ff0707b80] [c000000000270d08] refresh_zone_stat_thresholds+0xb8/0x240 (unreliable)
Quoted 7 lines
Both supplied potential fixes but one potentially misses checks and another had redundant initialisations. This version initialises
per_cpu_nodestatson a per-pgdat basis instead of on a per-zone basis.Reported-by Paul Mackerras <[email protected]>Reported-by Reza Arbab <[email protected]>Signed-off-by Mel Gorman <[email protected]>
That works, thanks.
Quoted 19 lines · Mel Gorman
[ 1.713998] Unable to handle kernel paging request for data at address 0xff7a10000 [ 1.714164] Faulting instruction address: 0xc000000000270cd0 [ 1.714304] Oops: Kernel access of bad area, sig: 11 [#1] [ 1.714414] SMP NR_CPUS=2048 NUMA PowerNV [ 1.714530] Modules linked in: [ 1.714647] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.7.0-kvm+ #118 [ 1.714786] task: c000000ff0680010 task.stack: c000000ff0704000 [ 1.714926] NIP: c000000000270cd0 LR: c000000000270ce8 CTR: 0000000000000000 [ 1.715093] REGS: c000000ff0707900 TRAP: 0300 Not tainted (4.7.0-kvm+) [ 1.715232] MSR: 9000000102009033 <SF,HV,VEC,EE,ME,IR,DR,RI,LE,TM[E]> CR: 846b6824 XER: 20000000 [ 1.715748] CFAR: c000000000008768 DAR: 0000000ff7a10000 DSISR: 42000000 SOFTE: 1GPR00:
c000000000270d08c000000ff0707b80c0000000011fb2000000000000000000
GPR04: 0000000000000800 0000000000000000 0000000000000000 0000000000000000
GPR08: ffffffffffffffff 00000000000000000000000ff7a10000c00000000122aae0
GPR12:c000000000a1e440c00000000fb80000c00000000000c1880000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000c000000000cecad0
GPR24:c000000000d035b8c000000000d6cd18c000000000d6cd18c000001fffa86300
GPR28: 0000000000000000c000001fffa96300c000000001230034c00000000122eb18
Quoted 4 lines
[ 1.717484] NIP [c000000000270cd0] refresh_zone_stat_thresholds+0x80/0x240 [ 1.717568] LR [c000000000270ce8] refresh_zone_stat_thresholds+0x98/0x240 [ 1.717648] Call Trace: [ 1.717687] [c000000ff0707b80] [c000000000270d08] refresh_zone_stat_thresholds+0xb8/0x240 (unreliable)
I've been investigating node hotplug. That path is also going to require initialization of per_cpu_nodestats. This worked for me:
mm/memory_hotplug.c +2 -0
@@ -1219,6 +1219,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)/* init node's zones as empty zones, we don't have any present pages.*/ free_area_init_node (nid, zones_size, start_pfn, zholes_size); + pgdat->per_cpu_nodestats = alloc_percpu(struct per_cpu_nodestat);/* * The node we allocated has no zone fallback lists. For avoiding
@@ -1249,6 +1250,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)static void rollback_node_hotadd (int nid,pg_data_t *pgdat) {arch_refresh_nodedata (nid,NULL ); +free_percpu (pgdat->per_cpu_nodestats);arch_free_nodedata (pgdat);return ; }
Signature · 7 lines
Reza Arbab -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 25 lines · Reza Arbab
Quoted 19 lines · Mel Gorman
[ 1.713998] Unable to handle kernel paging request for data at address 0xff7a10000 [ 1.714164] Faulting instruction address: 0xc000000000270cd0 [ 1.714304] Oops: Kernel access of bad area, sig: 11 [#1] [ 1.714414] SMP NR_CPUS=2048 NUMA PowerNV [ 1.714530] Modules linked in: [ 1.714647] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.7.0-kvm+ #118 [ 1.714786] task: c000000ff0680010 task.stack: c000000ff0704000 [ 1.714926] NIP: c000000000270cd0 LR: c000000000270ce8 CTR: 0000000000000000 [ 1.715093] REGS: c000000ff0707900 TRAP: 0300 Not tainted (4.7.0-kvm+) [ 1.715232] MSR: 9000000102009033 <SF,HV,VEC,EE,ME,IR,DR,RI,LE,TM[E]> CR: 846b6824 XER: 20000000 [ 1.715748] CFAR: c000000000008768 DAR: 0000000ff7a10000 DSISR: 42000000 SOFTE: 1GPR00:
c000000000270d08c000000ff0707b80c0000000011fb2000000000000000000
GPR04: 0000000000000800 0000000000000000 0000000000000000 0000000000000000
GPR08: ffffffffffffffff 00000000000000000000000ff7a10000c00000000122aae0
GPR12:c000000000a1e440c00000000fb80000c00000000000c1880000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000c000000000cecad0
GPR24:c000000000d035b8c000000000d6cd18c000000000d6cd18c000001fffa86300
GPR28: 0000000000000000c000001fffa96300c000000001230034c00000000122eb18Quoted 4 lines
[ 1.717484] NIP [c000000000270cd0] refresh_zone_stat_thresholds+0x80/0x240 [ 1.717568] LR [c000000000270ce8] refresh_zone_stat_thresholds+0x98/0x240 [ 1.717648] Call Trace: [ 1.717687] [c000000ff0707b80] [c000000000270d08] refresh_zone_stat_thresholds+0xb8/0x240 (unreliable)
Quoted 3 lines
I've been investigating node hotplug. That path is also going to require initialization of
per_cpu_nodestats. This worked for me:
Fix looks ok. Can you add a proper changelog to it including an example oops or do you need me to do it?
Signature · 8 lines
Mel Gorman SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 2 lines · Mel Gorman
Fix looks ok. Can you add a proper changelog to it including an example oops or do you need me to do it?
Sure, no problem. Patch to follow.
Signature · 7 lines
Reza Arbab -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/1 mm: Initialize per_cpu_nodestats for hotadded pgdats
In reply to Mel GormanThe following oops occurs after a pgdat is hotadded:
[ 86.839956] Unable to handle kernel paging request for data at address 0x00c30001 [ 86.840132] Faulting instruction address: 0xc00000000022f8f4 [ 86.840328] Oops: Kernel access of bad area, sig: 11 [#1] [ 86.840468] SMP NR_CPUS=2048 NUMA pSeries [ 86.840612] Modules linked in: ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_conntrack ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw iptable_filter nls_utf8 isofs sg virtio_balloon uio_pdrv_genirq uio ip_tables xfs libcrc32c sr_mod cdrom sd_mod virtio_net ibmvscsi scsi_transport_srp virtio_pci virtio_ring virtio dm_mirror dm_region_hash dm_log dm_mod [ 86.842955] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W 4.8.0-rc1-device #110 [ 86.843140] task: c000000000ef3080 task.stack: c000000000f6c000 [ 86.843323] NIP: c00000000022f8f4 LR: c00000000022f948 CTR: 0000000000000000 [ 86.843595] REGS: c000000000f6fa50 TRAP: 0300 Tainted: G W (4.8.0-rc1-device) [ 86.843889] MSR: 800000010280b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE,TM[E]> CR: 84002028 XER: 20000000 [ 86.844624] CFAR: d000000001d2013c DAR: 0000000000c30001 DSISR: 40000000 SOFTE: 0
GPR00: c00000000022f948 c000000000f6fcd0 c000000000f71400 0000000000000001
GPR04: 0000000000000100 0000000000000000 0000000000000000 0000000000c30000
GPR08: ffffffffffffffff 0000000000000001 0000000000c30000 00000000ffffffff
GPR12: 0000000000002200 c000000001300000 c000000000faefb4 c000000000faefa8
GPR16: c000000000f6c000 c000000000f6c080 c000000000bf15b0 c000000000f6c080
GPR20: c000000000bf4928 0000000000000000 0000000000000003 c000000000bf4968
GPR24: c0000000ffed0000 0000000000000000 0000000000000000 c000000000f6fd58
GPR28: 0000000000000001 0000000000000001 c000000000f6fcf0 c0000000ffed9c08
[ 86.847747] NIP [c00000000022f8f4] refresh_cpu_vm_stats+0x1a4/0x2f0 [ 86.847897] LR [c00000000022f948] refresh_cpu_vm_stats+0x1f8/0x2f0 [ 86.848060] Call Trace: [ 86.848183] [c000000000f6fcd0] [c00000000022f948] refresh_cpu_vm_stats+0x1f8/0x2f0 (unreliable)
Add per_cpu_nodestats initialization to the hotplug codepath.
--- mm/memory_hotplug.c | 2 ++ 1 file changed, 2 insertions(+)
mm/memory_hotplug.c +2 -0
@@ -1219,6 +1219,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)/* init node's zones as empty zones, we don't have any present pages.*/ free_area_init_node (nid, zones_size, start_pfn, zholes_size); + pgdat->per_cpu_nodestats = alloc_percpu(struct per_cpu_nodestat);/* * The node we allocated has no zone fallback lists. For avoiding
@@ -1249,6 +1250,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)static void rollback_node_hotadd (int nid,pg_data_t *pgdat) {arch_refresh_nodedata (nid,NULL ); +free_percpu (pgdat->per_cpu_nodestats);arch_free_nodedata (pgdat);return ; }
Signature · 7 lines
1.8.3.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH] mm: Initialize per_cpu_nodestats for hotadded pgdats
Quoted 47 lines · Reza Arbab
The following oops occurs after a pgdat is hotadded:
[ 86.839956] Unable to handle kernel paging request for data at address 0x00c30001 [ 86.840132] Faulting instruction address: 0xc00000000022f8f4 [ 86.840328] Oops: Kernel access of bad area, sig: 11 [#1] [ 86.840468] SMP NR_CPUS=2048 NUMA pSeries [ 86.840612] Modules linked in: ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_conntrack ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw iptable_filter nls_utf8 isofs sg virtio_balloon uio_pdrv_genirq uio ip_tables xfs libcrc32c sr_mod cdrom sd_mod virtio_net ibmvscsi scsi_transport_srp virtio_pci virtio_ring virtio dm_mirror dm_region_hash dm_log dm_mod [ 86.842955] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W 4.8.0-rc1-device #110 [ 86.843140] task: c000000000ef3080 task.stack: c000000000f6c000 [ 86.843323] NIP: c00000000022f8f4 LR: c00000000022f948 CTR: 0000000000000000 [ 86.843595] REGS: c000000000f6fa50 TRAP: 0300 Tainted: G W (4.8.0-rc1-device) [ 86.843889] MSR: 800000010280b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE,TM[E]> CR: 84002028 XER: 20000000 [ 86.844624] CFAR: d000000001d2013c DAR: 0000000000c30001 DSISR: 40000000 SOFTE: 0GPR00:
c00000000022f948c000000000f6fcd0c000000000f714000000000000000001
GPR04: 0000000000000100 0000000000000000 00000000000000000000000000c30000
GPR08: ffffffffffffffff 00000000000000010000000000c3000000000000ffffffff
GPR12: 0000000000002200c000000001300000c000000000faefb4c000000000faefa8
GPR16:c000000000f6c000c000000000f6c080c000000000bf15b0c000000000f6c080
GPR20:c000000000bf49280000000000000000 0000000000000003c000000000bf4968
GPR24:c0000000ffed00000000000000000000 0000000000000000c000000000f6fd58
GPR28: 0000000000000001 0000000000000001c000000000f6fcf0c0000000ffed9c08[ 86.847747] NIP [c00000000022f8f4] refresh_cpu_vm_stats+0x1a4/0x2f0 [ 86.847897] LR [c00000000022f948] refresh_cpu_vm_stats+0x1f8/0x2f0 [ 86.848060] Call Trace: [ 86.848183] [c000000000f6fcd0] [c00000000022f948] refresh_cpu_vm_stats+0x1f8/0x2f0 (unreliable)Add
per_cpu_nodestatsinitialization to the hotplug codepath.Signed-off-by Reza Arbab <[email protected]>--- mm/memory_hotplug.c | 2 ++ 1 file changed, 2 insertions(+)mm/memory_hotplug.c +1
-0@@ -1219,6 +1219,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)/* init node's zones as empty zones, we don't have any present pages.*/ free_area_init_node (nid, zones_size, start_pfn, zholes_size); + pgdat->per_cpu_nodestats = alloc_percpu(struct per_cpu_nodestat);/* * The node we allocated has no zone fallback lists. For avoiding
mm/memory_hotplug.c static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start) · line 1256
Quoted 7 lines
mm/memory_hotplug.c +1
-0@@ -1249,6 +1250,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)static void rollback_node_hotadd (int nid,pg_data_t *pgdat) {arch_refresh_nodedata (nid,NULL ); +free_percpu (pgdat->per_cpu_nodestats);arch_free_nodedata (pgdat);return ; }
I wonder if node_set_online() should do the allocation and offline should free. But that would be a larger change
Balbir
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>