mm/memory_hotplug.c: prevent memory leak when reusing pgdat
When offlining a node in try_offline_node(), pgdat is not released. So that pgdat could be reused in hotadd_new_pgdat(). While we reallocate pgdat->per_cpu_nodestats if this pgdat is reused. This patch prevents the memory leak by just allocating per_cpu_nodestats when it is a new pgdat. Link: http://lkml.kernel.org/r/20190813020608.10194-1-richardw.yang@linux.intel.com Signed-off-by: Wei Yang <richardw.yang@linux.intel.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Oscar Salvador <OSalvador@suse.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
b6c88d3b9d
Коммит
33fce0113d
|
@ -925,8 +925,11 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)
|
|||
if (!pgdat)
|
||||
return NULL;
|
||||
|
||||
pgdat->per_cpu_nodestats =
|
||||
alloc_percpu(struct per_cpu_nodestat);
|
||||
arch_refresh_nodedata(nid, pgdat);
|
||||
} else {
|
||||
int cpu;
|
||||
/*
|
||||
* Reset the nr_zones, order and classzone_idx before reuse.
|
||||
* Note that kswapd will init kswapd_classzone_idx properly
|
||||
|
@ -935,6 +938,12 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)
|
|||
pgdat->nr_zones = 0;
|
||||
pgdat->kswapd_order = 0;
|
||||
pgdat->kswapd_classzone_idx = 0;
|
||||
for_each_online_cpu(cpu) {
|
||||
struct per_cpu_nodestat *p;
|
||||
|
||||
p = per_cpu_ptr(pgdat->per_cpu_nodestats, cpu);
|
||||
memset(p, 0, sizeof(*p));
|
||||
}
|
||||
}
|
||||
|
||||
/* we can use NODE_DATA(nid) from here */
|
||||
|
@ -944,7 +953,6 @@ 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_core_hotplug(nid);
|
||||
pgdat->per_cpu_nodestats = alloc_percpu(struct per_cpu_nodestat);
|
||||
|
||||
/*
|
||||
* The node we allocated has no zone fallback lists. For avoiding
|
||||
|
|
Загрузка…
Ссылка в новой задаче