Skip to content

Commit 32ef438

Browse files
Dave Hansentorvalds
authored andcommitted
teach /proc/$pid/numa_maps about transparent hugepages
This is modeled after the smaps code. It detects transparent hugepages and then does a single gather_stats() for the page as a whole. This has two benifits: 1. It is more efficient since it does many pages in a single shot. 2. It does not have to break down the huge page. Signed-off-by: Dave Hansen <[email protected]> Acked-by: Hugh Dickins <[email protected]> Acked-by: David Rientjes <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 3200a8a commit 32ef438

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

fs/proc/task_mmu.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,26 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
936936
pte_t *pte;
937937

938938
md = walk->private;
939+
spin_lock(&walk->mm->page_table_lock);
940+
if (pmd_trans_huge(*pmd)) {
941+
if (pmd_trans_splitting(*pmd)) {
942+
spin_unlock(&walk->mm->page_table_lock);
943+
wait_split_huge_page(md->vma->anon_vma, pmd);
944+
} else {
945+
pte_t huge_pte = *(pte_t *)pmd;
946+
struct page *page;
947+
948+
page = can_gather_numa_stats(huge_pte, md->vma, addr);
949+
if (page)
950+
gather_stats(page, md, pte_dirty(huge_pte),
951+
HPAGE_PMD_SIZE/PAGE_SIZE);
952+
spin_unlock(&walk->mm->page_table_lock);
953+
return 0;
954+
}
955+
} else {
956+
spin_unlock(&walk->mm->page_table_lock);
957+
}
958+
939959
orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
940960
do {
941961
struct page *page = can_gather_numa_stats(*pte, md->vma, addr);

0 commit comments

Comments
 (0)