Messages in this thread | | | Date | Mon, 22 Jun 2015 13:02:45 +0300 | From | "Kirill A. Shutemov" <> | Subject | Re: [PATCHv6 01/36] mm, proc: adjust PSS calculation |
| |
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@linux.intel.com> > >Tested-by: Sasha Levin <sasha.levin@oracle.com> > >Acked-by: Jerome Marchand <jmarchan@redhat.com> > >Acked-by: Vlastimil Babka <vbabka@suse.cz> > >--- > > 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 from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
| |