Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32ef4384 authored by Dave Hansen's avatar Dave Hansen Committed by Linus Torvalds
Browse files

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: default avatarDave Hansen <dave@linux.vnet.ibm.com>
Acked-by: default avatarHugh Dickins <hughd@google.com>
Acked-by: default avatarDavid Rientjes <rientjes@google.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3200a8aa
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -936,6 +936,26 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
	pte_t *pte;
	pte_t *pte;


	md = walk->private;
	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);
	orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
	do {
	do {
		struct page *page = can_gather_numa_stats(*pte, md->vma, addr);
		struct page *page = can_gather_numa_stats(*pte, md->vma, addr);