diff options
Diffstat (limited to 'mm/huge_memory.c')
| -rw-r--r-- | mm/huge_memory.c | 20 | 
1 files changed, 9 insertions, 11 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 82166bf974e1..1546655a2d78 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1166,8 +1166,10 @@ alloc:  		} else {  			ret = do_huge_pmd_wp_page_fallback(mm, vma, address,  					pmd, orig_pmd, page, haddr); -			if (ret & VM_FAULT_OOM) +			if (ret & VM_FAULT_OOM) {  				split_huge_page(page); +				ret |= VM_FAULT_FALLBACK; +			}  			put_page(page);  		}  		count_vm_event(THP_FAULT_FALLBACK); @@ -1179,9 +1181,10 @@ alloc:  		if (page) {  			split_huge_page(page);  			put_page(page); -		} +		} else +			split_huge_page_pmd(vma, address, pmd); +		ret |= VM_FAULT_FALLBACK;  		count_vm_event(THP_FAULT_FALLBACK); -		ret |= VM_FAULT_OOM;  		goto out;  	} @@ -1545,6 +1548,7 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,  				entry = pmd_mknonnuma(entry);  			entry = pmd_modify(entry, newprot);  			ret = HPAGE_PMD_NR; +			set_pmd_at(mm, addr, pmd, entry);  			BUG_ON(pmd_write(entry));  		} else {  			struct page *page = pmd_page(*pmd); @@ -1557,16 +1561,10 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,  			 */  			if (!is_huge_zero_page(page) &&  			    !pmd_numa(*pmd)) { -				entry = *pmd; -				entry = pmd_mknuma(entry); +				pmdp_set_numa(mm, addr, pmd);  				ret = HPAGE_PMD_NR;  			}  		} - -		/* Set PMD if cleared earlier */ -		if (ret == HPAGE_PMD_NR) -			set_pmd_at(mm, addr, pmd, entry); -  		spin_unlock(ptl);  	} @@ -1963,7 +1961,7 @@ out:  	return ret;  } -#define VM_NO_THP (VM_SPECIAL|VM_MIXEDMAP|VM_HUGETLB|VM_SHARED|VM_MAYSHARE) +#define VM_NO_THP (VM_SPECIAL | VM_HUGETLB | VM_SHARED | VM_MAYSHARE)  int hugepage_madvise(struct vm_area_struct *vma,  		     unsigned long *vm_flags, int advice)  | 
