Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / mm / hmm.c
index e9a5457..0809bae 100644 (file)
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -165,12 +165,19 @@ static int hmm_vma_walk_hole(unsigned long addr, unsigned long end,
        return hmm_pfns_fill(addr, end, range, 0);
 }
 
+static inline unsigned long hmm_pfn_flags_order(unsigned long order)
+{
+       return order << HMM_PFN_ORDER_SHIFT;
+}
+
 static inline unsigned long pmd_to_hmm_pfn_flags(struct hmm_range *range,
                                                 pmd_t pmd)
 {
        if (pmd_protnone(pmd))
                return 0;
-       return pmd_write(pmd) ? (HMM_PFN_VALID | HMM_PFN_WRITE) : HMM_PFN_VALID;
+       return (pmd_write(pmd) ? (HMM_PFN_VALID | HMM_PFN_WRITE) :
+                                HMM_PFN_VALID) |
+              hmm_pfn_flags_order(PMD_SHIFT - PAGE_SHIFT);
 }
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
@@ -389,7 +396,9 @@ static inline unsigned long pud_to_hmm_pfn_flags(struct hmm_range *range,
 {
        if (!pud_present(pud))
                return 0;
-       return pud_write(pud) ? (HMM_PFN_VALID | HMM_PFN_WRITE) : HMM_PFN_VALID;
+       return (pud_write(pud) ? (HMM_PFN_VALID | HMM_PFN_WRITE) :
+                                HMM_PFN_VALID) |
+              hmm_pfn_flags_order(PUD_SHIFT - PAGE_SHIFT);
 }
 
 static int hmm_vma_walk_pud(pud_t *pudp, unsigned long start, unsigned long end,
@@ -474,7 +483,8 @@ static int hmm_vma_walk_hugetlb_entry(pte_t *pte, unsigned long hmask,
 
        i = (start - range->start) >> PAGE_SHIFT;
        pfn_req_flags = range->hmm_pfns[i];
-       cpu_flags = pte_to_hmm_pfn_flags(range, entry);
+       cpu_flags = pte_to_hmm_pfn_flags(range, entry) |
+                   hmm_pfn_flags_order(huge_page_order(hstate_vma(vma)));
        required_fault =
                hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, cpu_flags);
        if (required_fault) {