Commit d179e84b authored by Andrea Arcangeli's avatar Andrea Arcangeli Committed by Linus Torvalds

mm: vmscan: do not use page_count without a page pin

It is unsafe to run page_count during the physical pfn scan because
compound_head could trip on a dangling pointer when reading
page->first_page if the compound page is being freed by another CPU.

[mgorman@suse.de: split out patch]
Signed-off-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
Signed-off-by: default avatarMel Gorman <mgorman@suse.de>
Reviewed-by: default avatarMichal Hocko <mhocko@suse.cz>
Reviewed-by: default avatarMinchan Kim <minchan.kim@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7454f4ba
...@@ -1124,8 +1124,20 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, ...@@ -1124,8 +1124,20 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
nr_lumpy_dirty++; nr_lumpy_dirty++;
scan++; scan++;
} else { } else {
/* the page is freed already. */ /*
if (!page_count(cursor_page)) * Check if the page is freed already.
*
* We can't use page_count() as that
* requires compound_head and we don't
* have a pin on the page here. If a
* page is tail, we may or may not
* have isolated the head, so assume
* it's not free, it'd be tricky to
* track the head status without a
* page pin.
*/
if (!PageTail(cursor_page) &&
!atomic_read(&cursor_page->_count))
continue; continue;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment