On Tue, Jun 09, 2015 at 02:29:17PM +0200, Vlastimil Babka wrote: > On 06/03/2015 07:05 PM, Kirill A. Shutemov wrote: > >With new refcounting all subpages of the compound page are not nessessary > >have the same mapcount. We need to take into account mapcount of every > >sub-page. > > > >Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > >Tested-by: Sasha Levin <sasha.levin@xxxxxxxxxx> > >Acked-by: Jerome Marchand <jmarchan@xxxxxxxxxx> > >Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > >--- > > fs/proc/task_mmu.c | 48 +++++++++++++++++++++++++++++++----------------- > > 1 file changed, 31 insertions(+), 17 deletions(-) > > > >diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c > >index 58be92e11939..f9b285761bc0 100644 > >--- a/fs/proc/task_mmu.c > >+++ b/fs/proc/task_mmu.c > >@@ -449,9 +449,10 @@ struct mem_size_stats { > > }; > > > > static void smaps_account(struct mem_size_stats *mss, struct page *page, > >- unsigned long size, bool young, bool dirty) > >+ bool compound, bool young, bool dirty) > > { > >- int mapcount; > >+ int i, nr = compound ? HPAGE_PMD_NR : 1; > >+ unsigned long size = nr * PAGE_SIZE; > > > > if (PageAnon(page)) > > mss->anonymous += size; > >@@ -460,23 +461,36 @@ static void smaps_account(struct mem_size_stats *mss, struct page *page, > > /* Accumulate the size in pages that have been accessed. */ > > if (young || PageReferenced(page)) > > mss->referenced += size; > >- mapcount = page_mapcount(page); > >- if (mapcount >= 2) { > >- u64 pss_delta; > > > >- if (dirty || PageDirty(page)) > >- mss->shared_dirty += size; > >- else > >- mss->shared_clean += size; > >- pss_delta = (u64)size << PSS_SHIFT; > >- do_div(pss_delta, mapcount); > >- mss->pss += pss_delta; > >- } else { > >+ /* > >+ * page_count(page) == 1 guarantees the page is mapped exactly once. > >+ * If any subpage of the compound page mapped with PTE it would elevate > >+ * page_count(). > >+ */ > >+ if (page_count(page) == 1) { > > if (dirty || PageDirty(page)) > > mss->private_dirty += size; > > else > > mss->private_clean += size; > >- mss->pss += (u64)size << PSS_SHIFT; > > Deleting the line above was a mistake, right? Yep :-/ -- Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>