anolis: mm: honor THP defrag setting for direct file collapse
ANBZ: #23087 Currently, our kernel supports collapsing file-backed pages into hugepages during file reads by prioritizing the file for collapse in khugepaged. The allocation flags for collapsing are determined based on khugepaged's defrag setting. With this patch, the /sys/kernel/mm/transparent_hugepage/defrag setting is honored for direct file collapse, ensuring the defrag behavior for file direct collapse uses the same allocation policy as other THP paths. Signed-off-by: Weilin Tong <tongweilin@linux.alibaba.com> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Link: https://gitee.com/anolis/cloud-kernel/pulls/5557
This commit is contained in:
parent
c6dd932e4d
commit
3ab761d2a7
|
@ -126,6 +126,9 @@ struct collapse_control {
|
|||
|
||||
/* Last target selected in khugepaged_find_target_node() */
|
||||
int last_target_node;
|
||||
|
||||
/* Only effective when direct hugetext is enabled. */
|
||||
struct vm_area_struct *hugetext_direct_vma;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2104,7 +2107,8 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
|
|||
*/
|
||||
static void collapse_file(struct mm_struct *mm,
|
||||
struct file *file, pgoff_t start,
|
||||
struct page **hpage, int node)
|
||||
struct page **hpage, int node,
|
||||
struct collapse_control *cc)
|
||||
{
|
||||
struct address_space *mapping = file->f_mapping;
|
||||
gfp_t gfp;
|
||||
|
@ -2120,7 +2124,10 @@ static void collapse_file(struct mm_struct *mm,
|
|||
VM_BUG_ON(start & (HPAGE_PMD_NR - 1));
|
||||
|
||||
/* Only allocate from the target node */
|
||||
gfp = alloc_hugepage_khugepaged_gfpmask() | __GFP_THISNODE;
|
||||
if (cc->hugetext_direct_vma)
|
||||
gfp = vma_thp_gfp_mask(cc->hugetext_direct_vma) | __GFP_THISNODE;
|
||||
else
|
||||
gfp = alloc_hugepage_khugepaged_gfpmask() | __GFP_THISNODE;
|
||||
|
||||
new_page = khugepaged_alloc_page(hpage, gfp, node);
|
||||
if (!new_page) {
|
||||
|
@ -2533,7 +2540,7 @@ static void khugepaged_scan_file(struct mm_struct *mm, struct file *file,
|
|||
result = SCAN_EXCEED_NONE_PTE;
|
||||
} else {
|
||||
node = khugepaged_find_target_node(cc);
|
||||
collapse_file(mm, file, start, hpage, node);
|
||||
collapse_file(mm, file, start, hpage, node, cc);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3550,6 +3557,7 @@ static void hugetext_try_file_collapse(struct callback_head *twork)
|
|||
if (!cc)
|
||||
goto out_mmdrop;
|
||||
cc->last_target_node = NUMA_NO_NODE;
|
||||
cc->hugetext_direct_vma = vma;
|
||||
memset(cc->node_load, 0, sizeof(cc->node_load));
|
||||
khugepaged_scan_file(mm, file, pgoff, &hpage, cc);
|
||||
kfree(cc);
|
||||
|
|
Loading…
Reference in New Issue