提交 d179e84b 编写于 作者: A Andrea Arcangeli 提交者: 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: NAndrea Arcangeli <aarcange@redhat.com>
Signed-off-by: NMel Gorman <mgorman@suse.de>
Reviewed-by: NMichal Hocko <mhocko@suse.cz>
Reviewed-by: NMinchan Kim <minchan.kim@gmail.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册