diff options
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/mm/gup.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/powerpc/mm/gup.c b/arch/powerpc/mm/gup.c index c5f734e20b0f..d8746684f606 100644 --- a/arch/powerpc/mm/gup.c +++ b/arch/powerpc/mm/gup.c | |||
@@ -36,6 +36,11 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr, | |||
36 | do { | 36 | do { |
37 | pte_t pte = ACCESS_ONCE(*ptep); | 37 | pte_t pte = ACCESS_ONCE(*ptep); |
38 | struct page *page; | 38 | struct page *page; |
39 | /* | ||
40 | * Similar to the PMD case, NUMA hinting must take slow path | ||
41 | */ | ||
42 | if (pte_numa(pte)) | ||
43 | return 0; | ||
39 | 44 | ||
40 | if ((pte_val(pte) & mask) != result) | 45 | if ((pte_val(pte) & mask) != result) |
41 | return 0; | 46 | return 0; |
@@ -75,6 +80,14 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end, | |||
75 | if (pmd_none(pmd) || pmd_trans_splitting(pmd)) | 80 | if (pmd_none(pmd) || pmd_trans_splitting(pmd)) |
76 | return 0; | 81 | return 0; |
77 | if (pmd_huge(pmd) || pmd_large(pmd)) { | 82 | if (pmd_huge(pmd) || pmd_large(pmd)) { |
83 | /* | ||
84 | * NUMA hinting faults need to be handled in the GUP | ||
85 | * slowpath for accounting purposes and so that they | ||
86 | * can be serialised against THP migration. | ||
87 | */ | ||
88 | if (pmd_numa(pmd)) | ||
89 | return 0; | ||
90 | |||
78 | if (!gup_hugepte((pte_t *)pmdp, PMD_SIZE, addr, next, | 91 | if (!gup_hugepte((pte_t *)pmdp, PMD_SIZE, addr, next, |
79 | write, pages, nr)) | 92 | write, pages, nr)) |
80 | return 0; | 93 | return 0; |