huge_memory.c (ac79f78dab892fcdc11fda8af5cc5e80d09dca8a) | huge_memory.c (19deb7695e072deaff025e03de40c61b525bd57e) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2009 Red Hat, Inc. 4 */ 5 6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 7 8#include <linux/mm.h> --- 631 unchanged lines hidden (view full) --- 640 * always: directly stall for all thp allocations 641 * defer: wake kswapd and fail if not immediately available 642 * defer+madvise: wake kswapd and directly stall for MADV_HUGEPAGE, otherwise 643 * fail if not immediately available 644 * madvise: directly stall for MADV_HUGEPAGE, otherwise fail if not immediately 645 * available 646 * never: never stall for any thp allocation 647 */ | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2009 Red Hat, Inc. 4 */ 5 6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 7 8#include <linux/mm.h> --- 631 unchanged lines hidden (view full) --- 640 * always: directly stall for all thp allocations 641 * defer: wake kswapd and fail if not immediately available 642 * defer+madvise: wake kswapd and directly stall for MADV_HUGEPAGE, otherwise 643 * fail if not immediately available 644 * madvise: directly stall for MADV_HUGEPAGE, otherwise fail if not immediately 645 * available 646 * never: never stall for any thp allocation 647 */ |
648static inline gfp_t alloc_hugepage_direct_gfpmask(struct vm_area_struct *vma, unsigned long addr) | 648static inline gfp_t alloc_hugepage_direct_gfpmask(struct vm_area_struct *vma) |
649{ 650 const bool vma_madvised = !!(vma->vm_flags & VM_HUGEPAGE); | 649{ 650 const bool vma_madvised = !!(vma->vm_flags & VM_HUGEPAGE); |
651 const gfp_t gfp_mask = GFP_TRANSHUGE_LIGHT | __GFP_THISNODE; | |
652 653 /* Always do synchronous compaction */ 654 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags)) | 651 652 /* Always do synchronous compaction */ 653 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags)) |
655 return GFP_TRANSHUGE | __GFP_THISNODE | 656 (vma_madvised ? 0 : __GFP_NORETRY); | 654 return GFP_TRANSHUGE | (vma_madvised ? 0 : __GFP_NORETRY); |
657 658 /* Kick kcompactd and fail quickly */ 659 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags)) | 655 656 /* Kick kcompactd and fail quickly */ 657 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags)) |
660 return gfp_mask | __GFP_KSWAPD_RECLAIM; | 658 return GFP_TRANSHUGE_LIGHT | __GFP_KSWAPD_RECLAIM; |
661 662 /* Synchronous compaction if madvised, otherwise kick kcompactd */ 663 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags)) | 659 660 /* Synchronous compaction if madvised, otherwise kick kcompactd */ 661 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags)) |
664 return gfp_mask | (vma_madvised ? __GFP_DIRECT_RECLAIM : 665 __GFP_KSWAPD_RECLAIM); | 662 return GFP_TRANSHUGE_LIGHT | 663 (vma_madvised ? __GFP_DIRECT_RECLAIM : 664 __GFP_KSWAPD_RECLAIM); |
666 667 /* Only do synchronous compaction if madvised */ 668 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags)) | 665 666 /* Only do synchronous compaction if madvised */ 667 if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags)) |
669 return gfp_mask | (vma_madvised ? __GFP_DIRECT_RECLAIM : 0); | 668 return GFP_TRANSHUGE_LIGHT | 669 (vma_madvised ? __GFP_DIRECT_RECLAIM : 0); |
670 | 670 |
671 return gfp_mask; | 671 return GFP_TRANSHUGE_LIGHT; |
672} 673 674/* Caller must hold page table lock. */ 675static bool set_huge_zero_page(pgtable_t pgtable, struct mm_struct *mm, 676 struct vm_area_struct *vma, unsigned long haddr, pmd_t *pmd, 677 struct page *zero_page) 678{ 679 pmd_t entry; --- 55 unchanged lines hidden (view full) --- 735 set = true; 736 } 737 } else 738 spin_unlock(vmf->ptl); 739 if (!set) 740 pte_free(vma->vm_mm, pgtable); 741 return ret; 742 } | 672} 673 674/* Caller must hold page table lock. */ 675static bool set_huge_zero_page(pgtable_t pgtable, struct mm_struct *mm, 676 struct vm_area_struct *vma, unsigned long haddr, pmd_t *pmd, 677 struct page *zero_page) 678{ 679 pmd_t entry; --- 55 unchanged lines hidden (view full) --- 735 set = true; 736 } 737 } else 738 spin_unlock(vmf->ptl); 739 if (!set) 740 pte_free(vma->vm_mm, pgtable); 741 return ret; 742 } |
743 gfp = alloc_hugepage_direct_gfpmask(vma, haddr); 744 page = alloc_pages_vma(gfp, HPAGE_PMD_ORDER, vma, haddr, numa_node_id()); | 743 gfp = alloc_hugepage_direct_gfpmask(vma); 744 page = alloc_hugepage_vma(gfp, vma, haddr, HPAGE_PMD_ORDER); |
745 if (unlikely(!page)) { 746 count_vm_event(THP_FAULT_FALLBACK); 747 return VM_FAULT_FALLBACK; 748 } 749 prep_transhuge_page(page); 750 return __do_huge_pmd_anonymous_page(vmf, page, gfp); 751} 752 --- 590 unchanged lines hidden (view full) --- 1343 goto out_unlock; 1344 } 1345 unlock_page(page); 1346 get_page(page); 1347 spin_unlock(vmf->ptl); 1348alloc: 1349 if (__transparent_hugepage_enabled(vma) && 1350 !transparent_hugepage_debug_cow()) { | 745 if (unlikely(!page)) { 746 count_vm_event(THP_FAULT_FALLBACK); 747 return VM_FAULT_FALLBACK; 748 } 749 prep_transhuge_page(page); 750 return __do_huge_pmd_anonymous_page(vmf, page, gfp); 751} 752 --- 590 unchanged lines hidden (view full) --- 1343 goto out_unlock; 1344 } 1345 unlock_page(page); 1346 get_page(page); 1347 spin_unlock(vmf->ptl); 1348alloc: 1349 if (__transparent_hugepage_enabled(vma) && 1350 !transparent_hugepage_debug_cow()) { |
1351 huge_gfp = alloc_hugepage_direct_gfpmask(vma, haddr); 1352 new_page = alloc_pages_vma(huge_gfp, HPAGE_PMD_ORDER, vma, 1353 haddr, numa_node_id()); | 1351 huge_gfp = alloc_hugepage_direct_gfpmask(vma); 1352 new_page = alloc_hugepage_vma(huge_gfp, vma, haddr, HPAGE_PMD_ORDER); |
1354 } else 1355 new_page = NULL; 1356 1357 if (likely(new_page)) { 1358 prep_transhuge_page(new_page); 1359 } else { 1360 if (!page) { 1361 split_huge_pmd(vma, vmf->pmd, vmf->address); --- 1644 unchanged lines hidden --- | 1353 } else 1354 new_page = NULL; 1355 1356 if (likely(new_page)) { 1357 prep_transhuge_page(new_page); 1358 } else { 1359 if (!page) { 1360 split_huge_pmd(vma, vmf->pmd, vmf->address); --- 1644 unchanged lines hidden --- |