Skip to content

Commit b4911ea

Browse files
gormanmtorvalds
authored andcommittedAug 5, 2016
mm: initialise per_cpu_nodestats for all online pgdats at boot
Paul Mackerras and Reza Arbab reported that machines with memoryless nodes fail when vmstats are refreshed. Paul reported an oops as follows Unable to handle kernel paging request for data at address 0xff7a10000 Faulting instruction address: 0xc000000000270cd0 Oops: Kernel access of bad area, sig: 11 [#1] SMP NR_CPUS=2048 NUMA PowerNV Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.7.0-kvm+ #118 task: c000000ff0680010 task.stack: c000000ff0704000 NIP: c000000000270cd0 LR: c000000000270ce8 CTR: 0000000000000000 REGS: c000000ff0707900 TRAP: 0300 Not tainted (4.7.0-kvm+) MSR: 9000000102009033 <SF,HV,VEC,EE,ME,IR,DR,RI,LE,TM[E]> CR: 846b6824 XER: 20000000 CFAR: c000000000008768 DAR: 0000000ff7a10000 DSISR: 42000000 SOFTE: 1 NIP refresh_zone_stat_thresholds+0x80/0x240 LR refresh_zone_stat_thresholds+0x98/0x240 Call Trace: 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. Link: http://lkml.kernel.org/r/20160804092404.GI2799@techsingularity.net Signed-off-by: Mel Gorman <mgorman@techsingularity.net> Reported-by: Paul Mackerras <paulus@ozlabs.org> Reported-by: Reza Arbab <arbab@linux.vnet.ibm.com> Tested-by: Reza Arbab <arbab@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 412d000 commit b4911ea

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed
 

‎mm/page_alloc.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -5257,11 +5257,6 @@ static void __meminit setup_zone_pageset(struct zone *zone)
52575257
zone->pageset = alloc_percpu(struct per_cpu_pageset);
52585258
for_each_possible_cpu(cpu)
52595259
zone_pageset_init(zone, cpu);
5260-
5261-
if (!zone->zone_pgdat->per_cpu_nodestats) {
5262-
zone->zone_pgdat->per_cpu_nodestats =
5263-
alloc_percpu(struct per_cpu_nodestat);
5264-
}
52655260
}
52665261

52675262
/*
@@ -5270,10 +5265,15 @@ static void __meminit setup_zone_pageset(struct zone *zone)
52705265
*/
52715266
void __init setup_per_cpu_pageset(void)
52725267
{
5268+
struct pglist_data *pgdat;
52735269
struct zone *zone;
52745270

52755271
for_each_populated_zone(zone)
52765272
setup_zone_pageset(zone);
5273+
5274+
for_each_online_pgdat(pgdat)
5275+
pgdat->per_cpu_nodestats =
5276+
alloc_percpu(struct per_cpu_nodestat);
52775277
}
52785278

52795279
static noinline __ref

0 commit comments

Comments
 (0)
Please sign in to comment.