diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 26 |
1 files changed, 26 insertions, 0 deletions
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; |