|
@@ -1182,10 +1182,12 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
int to_drain;
|
|
|
+ unsigned long batch;
|
|
|
|
|
|
local_irq_save(flags);
|
|
|
- if (pcp->count >= pcp->batch)
|
|
|
- to_drain = pcp->batch;
|
|
|
+ batch = ACCESS_ONCE(pcp->batch);
|
|
|
+ if (pcp->count >= batch)
|
|
|
+ to_drain = batch;
|
|
|
else
|
|
|
to_drain = pcp->count;
|
|
|
if (to_drain > 0) {
|
|
@@ -1353,8 +1355,9 @@ void free_hot_cold_page(struct page *page, int cold)
|
|
|
list_add(&page->lru, &pcp->lists[migratetype]);
|
|
|
pcp->count++;
|
|
|
if (pcp->count >= pcp->high) {
|
|
|
- free_pcppages_bulk(zone, pcp->batch, pcp);
|
|
|
- pcp->count -= pcp->batch;
|
|
|
+ unsigned long batch = ACCESS_ONCE(pcp->batch);
|
|
|
+ free_pcppages_bulk(zone, batch, pcp);
|
|
|
+ pcp->count -= batch;
|
|
|
}
|
|
|
|
|
|
out:
|