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 <dave@linux.vnet.ibm.com> Acked-by: Hugh Dickins <hughd@google.com> Acked-by: David Rientjes <rientjes@google.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3200a8aaab
commit
32ef43848f
1 changed files with 20 additions and 0 deletions
|
@ -936,6 +936,26 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
|
|||
pte_t *pte;
|
||||
|
||||
md = walk->private;
|
||||
spin_lock(&walk->mm->page_table_lock);
|
||||
if (pmd_trans_huge(*pmd)) {
|
||||
if (pmd_trans_splitting(*pmd)) {
|
||||
spin_unlock(&walk->mm->page_table_lock);
|
||||
wait_split_huge_page(md->vma->anon_vma, pmd);
|
||||
} else {
|
||||
pte_t huge_pte = *(pte_t *)pmd;
|
||||
struct page *page;
|
||||
|
||||
page = can_gather_numa_stats(huge_pte, md->vma, addr);
|
||||
if (page)
|
||||
gather_stats(page, md, pte_dirty(huge_pte),
|
||||
HPAGE_PMD_SIZE/PAGE_SIZE);
|
||||
spin_unlock(&walk->mm->page_table_lock);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
spin_unlock(&walk->mm->page_table_lock);
|
||||
}
|
||||
|
||||
orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
|
||||
do {
|
||||
struct page *page = can_gather_numa_stats(*pte, md->vma, addr);
|
||||
|
|
Loading…
Reference in a new issue