mirror of https://gitee.com/openkylin/linux.git
mm/page_alloc: protect pcp->batch accesses with ACCESS_ONCE
pcp->batch could change at any point, avoid relying on it being a stable value. Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com> Cc: Gilad Ben-Yossef <gilad@benyossef.com> Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Pekka Enberg <penberg@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8d7a8fa97a
commit
998d39cb23
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue