Re: [PATCH v4 2/4] mm, proc: account for shmem swap in /proc/pid/smaps
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2015-10-02 22:37:07
Also in:
linux-mm, linux-s390, lkml
On Fri, 2 Oct 2015 15:35:49 +0200 Vlastimil Babka [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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. ...--- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h@@ -60,6 +60,12 @@ extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); extern int shmem_unuse(swp_entry_t entry, struct page *page); +#ifdef CONFIG_SWAP +extern unsigned long shmem_swap_usage(struct inode *inode); +extern unsigned long shmem_partial_swap_usage(struct address_space *mapping, + pgoff_t start, pgoff_t end); +#endif
CONFIG_SWAP is wrong, isn't it? It should be CONFIG_SHMEM if anything. I'd just do
--- a/include/linux/shmem_fs.h~mm-proc-account-for-shmem-swap-in-proc-pid-smaps-fix
+++ a/include/linux/shmem_fs.h@@ -60,11 +60,9 @@ extern struct page *shmem_read_mapping_p extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); extern int shmem_unuse(swp_entry_t entry, struct page *page); -#ifdef CONFIG_SWAP extern unsigned long shmem_swap_usage(struct inode *inode); extern unsigned long shmem_partial_swap_usage(struct address_space *mapping, pgoff_t start, pgoff_t end); -#endif static inline struct page *shmem_read_mapping_page( struct address_space *mapping, pgoff_t index)
We don't need the ifdefs around declarations and they're a pain to maintain and they'd add a *ton* of clutter if we even tried to do this for real. -- 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>