Commit 239fdf8b authored by ZhangPeng's avatar ZhangPeng Committed by Ma Wupeng
Browse files

userswap: add handling of ZERO_PAGE

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6CAIM



--------------------------------

We call follow_page() with FOLL_DUMP to handle ZERO_PAGE. Although
FOLL_DUMP is intended for get_dump_page(), it just so happens that its
special treatment of the ZERO_PAGE (returning an error instead of doing
get_page) suits uswap very well. If somehow an abnormal page has sneaked
into the range, we won't oops here.

Signed-off-by: default avatarZhangPeng <zhangpeng362@huawei.com>
parent 92751dfb
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ static unsigned long pages_can_be_swapped(struct mm_struct *mm,
		 * follow_page will inc page ref, dec the ref after we remap
		 * the page.
		 */
		page = follow_page(vma, addr, FOLL_GET);
		page = follow_page(vma, addr, FOLL_GET | FOLL_DUMP);
		if (IS_ERR_OR_NULL(page)) {
			ret = -ENODEV;
			goto out_err;
@@ -416,9 +416,9 @@ int mfill_atomic_pte_nocopy(struct mm_struct *mm,

	if (!vma_uswap_compatible(src_vma))
		return -EINVAL;

	page = follow_page(src_vma, src_addr, FOLL_GET | FOLL_MIGRATION);
	if (!page)
	page = follow_page(src_vma, src_addr, FOLL_GET | FOLL_MIGRATION |
			   FOLL_DUMP);
	if (IS_ERR_OR_NULL(page))
		return -ENODEV;

	src_pmd = mm_find_pmd(mm, src_addr);