Re: [PATCH v4 2/4] mm, proc: account for shmem swap in /proc/pid/smaps
From: Michal Hocko <mhocko@kernel.org>
Date: 2015-10-02 15:20:34
Also in:
linux-mm, linux-s390, lkml
On Fri 02-10-15 15:35:49, 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 <redacted> Acked-by: Konstantin Khlebnikov <redacted>
Acked-by: Michal Hocko <mhocko@suse.com> But I think comments explaining why i_mutex is not needed are confusing and incomplete. [...]
+ /* + * Here we have to inspect individual pages in our mapped range to + * determine how much of them are swapped out. Thanks to RCU, we don't + * need i_mutex to protect against truncating or hole punching. + */ + start = linear_page_index(vma, vma->vm_start); + end = linear_page_index(vma, vma->vm_end); + + return shmem_partial_swap_usage(inode->i_mapping, start, end);
[...]
+/* + * Determine (in bytes) how many pages within the given range are swapped out. + * + * Can be called without i_mutex or mapping->tree_lock thanks to RCU. + */ +unsigned long shmem_partial_swap_usage(struct address_space *mapping, + pgoff_t start, pgoff_t end)
AFAIU RCU only helps to prevent from accessing nodes which were freed from the radix tree. The reason why we do not need to hold i_mutex is that the radix tree iterator would break out of the loop if we entered node which backed truncated range. At least this is my understanding, I might be wrong here of course. -- Michal Hocko SUSE Labs -- 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>