diff options
Diffstat (limited to 'mm/huge_memory.c')
| -rw-r--r-- | mm/huge_memory.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index a84909cf20d3..88c6167f194d 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1426,8 +1426,11 @@ int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd)  	 */  	if (unlikely(pmd_trans_migrating(*vmf->pmd))) {  		page = pmd_page(*vmf->pmd); +		if (!get_page_unless_zero(page)) +			goto out_unlock;  		spin_unlock(vmf->ptl);  		wait_on_page_locked(page); +		put_page(page);  		goto out;  	} @@ -1459,9 +1462,12 @@ int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd)  	/* Migration could have started since the pmd_trans_migrating check */  	if (!page_locked) { +		page_nid = -1; +		if (!get_page_unless_zero(page)) +			goto out_unlock;  		spin_unlock(vmf->ptl);  		wait_on_page_locked(page); -		page_nid = -1; +		put_page(page);  		goto out;  	}  |