mm/migration: fix possible do_pages_stat_array racing with memory offline
When follow_page peeks a page, the page could be migrated and then be offlined while it's still being used by the do_pages_stat_array(). Use FOLL_GET to hold the page refcnt to fix this potential race. Link: https://lkml.kernel.org/r/20220318111709.60311-12-linmiaohe@huawei.com Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> Acked-by: "Huang, Ying" <ying.huang@intel.com> Reviewed-by: Muchun Song <songmuchun@bytedance.com> Cc: Alistair Popple <apopple@nvidia.com> Cc: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
3f26c88bd6
commit
4cd614841c
@ -1796,13 +1796,18 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
|
||||
goto set_status;
|
||||
|
||||
/* FOLL_DUMP to ignore special (like zero) pages */
|
||||
page = follow_page(vma, addr, FOLL_DUMP);
|
||||
page = follow_page(vma, addr, FOLL_GET | FOLL_DUMP);
|
||||
|
||||
err = PTR_ERR(page);
|
||||
if (IS_ERR(page))
|
||||
goto set_status;
|
||||
|
||||
err = page ? page_to_nid(page) : -ENOENT;
|
||||
if (page) {
|
||||
err = page_to_nid(page);
|
||||
put_page(page);
|
||||
} else {
|
||||
err = -ENOENT;
|
||||
}
|
||||
set_status:
|
||||
*status = err;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user