|
@@ -1112,6 +1112,7 @@ static void free_pcppages_bulk(struct zone *zone, int count,
|
|
|
page = list_last_entry(list, struct page, lru);
|
|
|
/* must delete as __free_one_page list manipulates */
|
|
|
list_del(&page->lru);
|
|
|
+ pcp->count--;
|
|
|
|
|
|
mt = get_pcppage_migratetype(page);
|
|
|
/* MIGRATE_ISOLATE page should not go to pcplists */
|
|
@@ -2495,10 +2496,8 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp)
|
|
|
local_irq_save(flags);
|
|
|
batch = READ_ONCE(pcp->batch);
|
|
|
to_drain = min(pcp->count, batch);
|
|
|
- if (to_drain > 0) {
|
|
|
+ if (to_drain > 0)
|
|
|
free_pcppages_bulk(zone, to_drain, pcp);
|
|
|
- pcp->count -= to_drain;
|
|
|
- }
|
|
|
local_irq_restore(flags);
|
|
|
}
|
|
|
#endif
|
|
@@ -2520,10 +2519,8 @@ static void drain_pages_zone(unsigned int cpu, struct zone *zone)
|
|
|
pset = per_cpu_ptr(zone->pageset, cpu);
|
|
|
|
|
|
pcp = &pset->pcp;
|
|
|
- if (pcp->count) {
|
|
|
+ if (pcp->count)
|
|
|
free_pcppages_bulk(zone, pcp->count, pcp);
|
|
|
- pcp->count = 0;
|
|
|
- }
|
|
|
local_irq_restore(flags);
|
|
|
}
|
|
|
|
|
@@ -2747,7 +2744,6 @@ static void free_unref_page_commit(struct page *page, unsigned long pfn)
|
|
|
if (pcp->count >= pcp->high) {
|
|
|
unsigned long batch = READ_ONCE(pcp->batch);
|
|
|
free_pcppages_bulk(zone, batch, pcp);
|
|
|
- pcp->count -= batch;
|
|
|
}
|
|
|
}
|
|
|
|