All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Marchand <jmarchan@redhat.com>
To: Vlastimil Babka <vbabka@suse.cz>, linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-doc@vger.kernel.org, Hugh Dickins <hughd@google.com>,
	Michal Hocko <mhocko@suse.cz>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	Cyrill Gorcunov <gorcunov@openvz.org>,
	Randy Dunlap <rdunlap@infradead.org>,
	linux-s390@vger.kernel.org,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Paul Mackerras <paulus@samba.org>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Oleg Nesterov <oleg@redhat.com>
Subject: Re: [PATCH 2/4] mm, procfs: account for shmem swap in /proc/pid/smaps
Date: Thu, 26 Feb 2015 15:39:41 +0100	[thread overview]
Message-ID: <54EF302D.3020607@redhat.com> (raw)
In-Reply-To: <1424958666-18241-3-git-send-email-vbabka@suse.cz>

[-- Attachment #1: Type: text/plain, Size: 3563 bytes --]

On 02/26/2015 02:51 PM, Vlastimil Babka wrote:
> Currently, /proc/pid/smaps will always show "Swap: 0 kB" for shmem-backed
> mappings, even if the mapped portion does contain pages that were swapped out.
> This is because unlike private anonymous mappings, shmem does not change pte
> to swap entry, but pte_none when swapping the page out. In the smaps page
> walk, such page thus looks like it was never faulted in.
> 
> This patch changes smaps_pte_entry() to determine the swap status for such
> pte_none entries for shmem mappings, similarly to how mincore_page() does it.
> Swapped out pages are thus accounted for.
> 
> The accounting is arguably still not as precise as for private anonymous
> mappings, since now we will count also pages that the process in question never
> accessed, but only another process populated them and then let them become
> swapped out. I believe it is still less confusing and subtle than not showing
> any swap usage by shmem mappings at all. Also, swapped out pages only becomee a
> performance issue for future accesses, and we cannot predict those for neither
> kind of mapping.
> 
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
> ---
>  Documentation/filesystems/proc.txt |  3 ++-
>  fs/proc/task_mmu.c                 | 20 ++++++++++++++++++++
>  2 files changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
> index d4f56ec..8b30543 100644
> --- a/Documentation/filesystems/proc.txt
> +++ b/Documentation/filesystems/proc.txt
> @@ -437,7 +437,8 @@ indicates the amount of memory currently marked as referenced or accessed.
>  a mapping associated with a file may contain anonymous pages: when MAP_PRIVATE
>  and a page is modified, the file page is replaced by a private anonymous copy.
>  "Swap" shows how much would-be-anonymous memory is also used, but out on
> -swap.
> +swap. For shmem mappings, "Swap" shows how much of the mapped portion of the
> +underlying shmem object is on swap.
>  
>  "VmFlags" field deserves a separate description. This member represents the kernel
>  flags associated with the particular virtual memory area in two letter encoded
> diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
> index 956b75d..0410309 100644
> --- a/fs/proc/task_mmu.c
> +++ b/fs/proc/task_mmu.c
> @@ -13,6 +13,7 @@
>  #include <linux/swap.h>
>  #include <linux/swapops.h>
>  #include <linux/mmu_notifier.h>
> +#include <linux/shmem_fs.h>
>  
>  #include <asm/elf.h>
>  #include <asm/uaccess.h>
> @@ -496,6 +497,25 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr,
>  			mss->swap += PAGE_SIZE;
>  		else if (is_migration_entry(swpent))
>  			page = migration_entry_to_page(swpent);
> +	} else if (IS_ENABLED(CONFIG_SHMEM) && IS_ENABLED(CONFIG_SWAP) &&
> +					pte_none(*pte) && vma->vm_file) {
> +		struct address_space *mapping =
> +			file_inode(vma->vm_file)->i_mapping;
> +
> +		/*
> +		 * shmem does not use swap pte's so we have to consult
> +		 * the radix tree to account for swap
> +		 */
> +		if (shmem_mapping(mapping)) {
> +			page = find_get_entry(mapping, pgoff);
> +			if (page) {
> +				if (radix_tree_exceptional_entry(page))
> +					mss->swap += PAGE_SIZE;
> +				else
> +					page_cache_release(page);
> +			}
> +			page = NULL;
> +		}

Hi Vlastimil,

I'm afraid that isn't enough. Without walking the pte holes too, big
chunks of swapped out shmem pages may be missed.

Jerome

>  	}
>  
>  	if (!page)
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

  reply	other threads:[~2015-02-26 14:39 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-26 13:51 [PATCH 0/4] enhance shmem process and swap accounting Vlastimil Babka
2015-02-26 13:51 ` Vlastimil Babka
2015-02-26 13:51 ` [PATCH 1/4] mm, documentation: clarify /proc/pid/status VmSwap limitations Vlastimil Babka
2015-02-26 13:51   ` Vlastimil Babka
2015-02-27 10:37   ` Michael Kerrisk
2015-02-27 10:37     ` Michael Kerrisk
2015-02-26 13:51 ` [PATCH 2/4] mm, procfs: account for shmem swap in /proc/pid/smaps Vlastimil Babka
2015-02-26 13:51   ` Vlastimil Babka
2015-02-26 14:39   ` Jerome Marchand [this message]
2015-02-27 10:38   ` Michael Kerrisk
2015-02-27 10:38     ` Michael Kerrisk
2015-03-11 12:30   ` Konstantin Khlebnikov
2015-03-11 12:30     ` Konstantin Khlebnikov
2015-03-11 15:03     ` Konstantin Khlebnikov
2015-03-11 15:26       ` Jerome Marchand
2015-03-11 16:31         ` Konstantin Khlebnikov
2015-03-11 16:31           ` Konstantin Khlebnikov
2015-03-11 19:10     ` Vlastimil Babka
2015-03-11 19:10       ` Vlastimil Babka
2015-03-11 20:03       ` Konstantin Khlebnikov
2015-03-11 20:03         ` Konstantin Khlebnikov
2015-02-26 13:51 ` [PATCH 3/4] mm, shmem: Add shmem resident memory accounting Vlastimil Babka
2015-02-26 13:51   ` Vlastimil Babka
2015-02-26 14:59   ` Jerome Marchand
2015-03-27 16:39     ` Vlastimil Babka
2015-03-27 16:39       ` Vlastimil Babka
2015-02-27 10:38   ` Michael Kerrisk
2015-02-27 10:38     ` Michael Kerrisk
2015-02-26 13:51 ` [PATCH 4/4] mm, procfs: Display VmAnon, VmFile and VmShm in /proc/pid/status Vlastimil Babka
2015-02-26 13:51   ` Vlastimil Babka
2015-02-27 10:38   ` Michael Kerrisk
2015-02-27 10:38     ` Michael Kerrisk
2015-02-27 10:36 ` [PATCH 0/4] enhance shmem process and swap accounting Michael Kerrisk
2015-02-27 10:36   ` Michael Kerrisk
     [not found]   ` <CAHO5Pa0xmquUbzkZvow_PxRGZpA7MVEPFcRL2LPXv7hU41uxDw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-02-27 10:52     ` Vlastimil Babka
2015-02-27 10:52       ` Vlastimil Babka
2015-02-27 10:52       ` Vlastimil Babka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54EF302D.3020607@redhat.com \
    --to=jmarchan@redhat.com \
    --cc=acme@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=gorcunov@openvz.org \
    --cc=heiko.carstens@de.ibm.com \
    --cc=hughd@google.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mhocko@suse.cz \
    --cc=oleg@redhat.com \
    --cc=paulus@samba.org \
    --cc=peterz@infradead.org \
    --cc=rdunlap@infradead.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.