aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mm.h2
-rw-r--r--mm/memory_hotplug.c1
-rw-r--r--mm/page_alloc.c26
3 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 9a72cc78e6b8..d3c8ae7c8015 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1058,6 +1058,8 @@ extern void setup_per_cpu_pageset(void);
1058static inline void setup_per_cpu_pageset(void) {} 1058static inline void setup_per_cpu_pageset(void) {}
1059#endif 1059#endif
1060 1060
1061extern void zone_pcp_update(struct zone *zone);
1062
1061/* nommu.c */ 1063/* nommu.c */
1062extern atomic_long_t mmap_pages_allocated; 1064extern atomic_long_t mmap_pages_allocated;
1063 1065
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index e4412a676c88..616236e6343f 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -422,6 +422,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages)
422 zone->present_pages += onlined_pages; 422 zone->present_pages += onlined_pages;
423 zone->zone_pgdat->node_present_pages += onlined_pages; 423 zone->zone_pgdat->node_present_pages += onlined_pages;
424 424
425 zone_pcp_update(zone);
425 setup_per_zone_wmarks(); 426 setup_per_zone_wmarks();
426 calculate_zone_inactive_ratio(zone); 427 calculate_zone_inactive_ratio(zone);
427 if (onlined_pages) { 428 if (onlined_pages) {
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index f4e929e356db..1a3a893ef50e 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3142,6 +3142,32 @@ int zone_wait_table_init(struct zone *zone, unsigned long zone_size_pages)
3142 return 0; 3142 return 0;
3143} 3143}
3144 3144
3145static int __zone_pcp_update(void *data)
3146{
3147 struct zone *zone = data;
3148 int cpu;
3149 unsigned long batch = zone_batchsize(zone), flags;
3150
3151 for (cpu = 0; cpu < NR_CPUS; cpu++) {
3152 struct per_cpu_pageset *pset;
3153 struct per_cpu_pages *pcp;
3154
3155 pset = zone_pcp(zone, cpu);
3156 pcp = &pset->pcp;
3157
3158 local_irq_save(flags);
3159 free_pages_bulk(zone, pcp->count, &pcp->list, 0);
3160 setup_pageset(pset, batch);
3161 local_irq_restore(flags);
3162 }
3163 return 0;
3164}
3165
3166void zone_pcp_update(struct zone *zone)
3167{
3168 stop_machine(__zone_pcp_update, zone, NULL);
3169}
3170
3145static __meminit void zone_pcp_init(struct zone *zone) 3171static __meminit void zone_pcp_init(struct zone *zone)
3146{ 3172{
3147 int cpu; 3173 int cpu;