|
@@ -539,23 +539,26 @@ static int __do_huge_pmd_anonymous_page(struct fault_env *fe, struct page *page,
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
- * If THP is set to always then directly reclaim/compact as necessary
|
|
|
|
- * If set to defer then do no reclaim and defer to khugepaged
|
|
|
|
|
|
+ * If THP defrag is set to always then directly reclaim/compact as necessary
|
|
|
|
+ * If set to defer then do only background reclaim/compact and defer to khugepaged
|
|
* If set to madvise and the VMA is flagged then directly reclaim/compact
|
|
* If set to madvise and the VMA is flagged then directly reclaim/compact
|
|
|
|
+ * When direct reclaim/compact is allowed, don't retry except for flagged VMA's
|
|
*/
|
|
*/
|
|
static inline gfp_t alloc_hugepage_direct_gfpmask(struct vm_area_struct *vma)
|
|
static inline gfp_t alloc_hugepage_direct_gfpmask(struct vm_area_struct *vma)
|
|
{
|
|
{
|
|
- gfp_t reclaim_flags = 0;
|
|
|
|
-
|
|
|
|
- if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags) &&
|
|
|
|
- (vma->vm_flags & VM_HUGEPAGE))
|
|
|
|
- reclaim_flags = __GFP_DIRECT_RECLAIM;
|
|
|
|
- else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags))
|
|
|
|
- reclaim_flags = __GFP_KSWAPD_RECLAIM;
|
|
|
|
- else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags))
|
|
|
|
- reclaim_flags = __GFP_DIRECT_RECLAIM;
|
|
|
|
-
|
|
|
|
- return GFP_TRANSHUGE | reclaim_flags;
|
|
|
|
|
|
+ bool vma_madvised = !!(vma->vm_flags & VM_HUGEPAGE);
|
|
|
|
+
|
|
|
|
+ if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG,
|
|
|
|
+ &transparent_hugepage_flags) && vma_madvised)
|
|
|
|
+ return GFP_TRANSHUGE;
|
|
|
|
+ else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG,
|
|
|
|
+ &transparent_hugepage_flags))
|
|
|
|
+ return GFP_TRANSHUGE_LIGHT | __GFP_KSWAPD_RECLAIM;
|
|
|
|
+ else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG,
|
|
|
|
+ &transparent_hugepage_flags))
|
|
|
|
+ return GFP_TRANSHUGE | (vma_madvised ? 0 : __GFP_NORETRY);
|
|
|
|
+
|
|
|
|
+ return GFP_TRANSHUGE_LIGHT;
|
|
}
|
|
}
|
|
|
|
|
|
/* Caller must hold page table lock. */
|
|
/* Caller must hold page table lock. */
|