From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932510AbbFIM3a (ORCPT ); Tue, 9 Jun 2015 08:29:30 -0400 Received: from cantor2.suse.de ([195.135.220.15]:54450 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751228AbbFIM3W (ORCPT ); Tue, 9 Jun 2015 08:29:22 -0400 Message-ID: <5576DC1D.6010800@suse.cz> Date: Tue, 09 Jun 2015 14:29:17 +0200 From: Vlastimil Babka User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: "Kirill A. Shutemov" , Andrew Morton , Andrea Arcangeli , Hugh Dickins CC: Dave Hansen , Mel Gorman , Rik van Riel , Christoph Lameter , Naoya Horiguchi , Steve Capper , "Aneesh Kumar K.V" , Johannes Weiner , Michal Hocko , Jerome Marchand , Sasha Levin , linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [PATCHv6 01/36] mm, proc: adjust PSS calculation References: <1433351167-125878-1-git-send-email-kirill.shutemov@linux.intel.com> <1433351167-125878-2-git-send-email-kirill.shutemov@linux.intel.com> In-Reply-To: <1433351167-125878-2-git-send-email-kirill.shutemov@linux.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > Tested-by: Sasha Levin > Acked-by: Jerome Marchand > Acked-by: Vlastimil Babka > --- > 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? > + return; > + } > + > + for (i = 0; i < nr; i++, page++) { > + int mapcount = page_mapcount(page); > + > + if (mapcount >= 2) { > + if (dirty || PageDirty(page)) > + mss->shared_dirty += PAGE_SIZE; > + else > + mss->shared_clean += PAGE_SIZE; > + mss->pss += (PAGE_SIZE << PSS_SHIFT) / mapcount; > + } else { > + if (dirty || PageDirty(page)) > + mss->private_dirty += PAGE_SIZE; > + else > + mss->private_clean += PAGE_SIZE; > + mss->pss += PAGE_SIZE << PSS_SHIFT; > + } > } > } > > @@ -500,7 +514,8 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr, > > if (!page) > return; > - smaps_account(mss, page, PAGE_SIZE, pte_young(*pte), pte_dirty(*pte)); > + > + smaps_account(mss, page, false, pte_young(*pte), pte_dirty(*pte)); > } > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > @@ -516,8 +531,7 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr, > if (IS_ERR_OR_NULL(page)) > return; > mss->anonymous_thp += HPAGE_PMD_SIZE; > - smaps_account(mss, page, HPAGE_PMD_SIZE, > - pmd_young(*pmd), pmd_dirty(*pmd)); > + smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd)); > } > #else > static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr, >