Thread (9 messages) 9 messages, 4 authors, 2016-11-29

Re: [PATCH] proc: mm: export PTE sizes directly in smaps (v2)

From: Vlastimil Babka <hidden>
Date: 2016-11-29 08:01:42
Also in: lkml

On 11/28/2016 10:39 PM, Dave Hansen wrote:
... cc'ing the arm64 maintainers

On 11/28/2016 01:07 PM, Vlastimil Babka wrote:
quoted
On 11/28/2016 05:52 PM, Dave Hansen wrote:
quoted
On 11/24/2016 06:22 AM, Vlastimil Babka wrote:
quoted
On 11/17/2016 01:28 AM, Dave Hansen wrote:
quoted
@@ -702,11 +707,13 @@ static int smaps_hugetlb_range(pte_t *pt
     }
     if (page) {
         int mapcount = page_mapcount(page);
+        unsigned long hpage_size = huge_page_size(hstate_vma(vma));

+        mss->rss_pud += hpage_size;
This hardcoded pud doesn't look right, doesn't the pmd/pud depend on
hpage_size?
Urg, nope.  Thanks for noticing that!  I think we'll need something
along the lines of:

                if (hpage_size == PUD_SIZE)
                        mss->rss_pud += PUD_SIZE;
                else if (hpage_size == PMD_SIZE)
                        mss->rss_pmd += PMD_SIZE;
Sounds better, although I wonder whether there are some weird arches
supporting hugepage sizes that don't match page table levels. I recall
that e.g. MIPS could do arbitrary size, but dunno if the kernel supports
that...
arm64 seems to have pretty arbitrary sizes, and seems to be able to
build them out of multiple hardware PTE sizes.  I think I can fix my
code to handle those:

                if (hpage_size >= PGD_SIZE)
                        mss->rss_pgd += PGD_SIZE;
                else if (hpage_size >= PUD_SIZE)
                        mss->rss_pud += PUD_SIZE;
                else if (hpage_size >= PMD_SIZE)
                        mss->rss_pmd += PMD_SIZE;
                else
                        mss->rss_pte += PAGE_SIZE;

But, I *think* that means that smaps_hugetlb_range() is *currently*
broken for these intermediate arm64 sizes.  The code does:

                if (mapcount >= 2)
                        mss->shared_hugetlb += hpage_size;
                else
                        mss->private_hugetlb += hpage_size;

So I *think* if we may count a hugetlbfs arm64 CONT_PTES page multiple
times, and account hpage_size for *each* of the CONT_PTES.  That would
artificially inflate the smaps output for those pages.
Hmm IIUC walk_hugetlb_range() will call the smaps_hugetlb_range()
callback once per hugepage, not once per "pte", no? See
hugetlb_entry_end(). In that case the current code should be OK and
yours would undercount?
Will / Catalin, is there something I'm missing?
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help