diff options
-rw-r--r-- | include/linux/mm.h | 2 | ||||
-rw-r--r-- | mm/memory_hotplug.c | 1 | ||||
-rw-r--r-- | mm/page_alloc.c | 26 |
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); | |||
1058 | static inline void setup_per_cpu_pageset(void) {} | 1058 | static inline void setup_per_cpu_pageset(void) {} |
1059 | #endif | 1059 | #endif |
1060 | 1060 | ||
1061 | extern void zone_pcp_update(struct zone *zone); | ||
1062 | |||
1061 | /* nommu.c */ | 1063 | /* nommu.c */ |
1062 | extern atomic_long_t mmap_pages_allocated; | 1064 | extern 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 | ||
3145 | static 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 | |||
3166 | void zone_pcp_update(struct zone *zone) | ||
3167 | { | ||
3168 | stop_machine(__zone_pcp_update, zone, NULL); | ||
3169 | } | ||
3170 | |||
3145 | static __meminit void zone_pcp_init(struct zone *zone) | 3171 | static __meminit void zone_pcp_init(struct zone *zone) |
3146 | { | 3172 | { |
3147 | int cpu; | 3173 | int cpu; |