mm, shmem: add internal shmem resident memory accounting
Currently looking at /proc/<pid>/status or statm, there is no way to distinguish shmem pages from pages mapped to a regular file (shmem pages are mapped to /dev/zero), even though their implication in actual memory use is quite different. The internal accounting currently counts shmem pages together with regular files. As a preparation to extend the userspace interfaces, this patch adds MM_SHMEMPAGES counter to mm_rss_stat to account for shmem pages separately from MM_FILEPAGES. The next patch will expose it to userspace - this patch doesn't change the exported values yet, by adding up MM_SHMEMPAGES to MM_FILEPAGES at places where MM_FILEPAGES was used before. The only user-visible change after this patch is the OOM killer message that separates the reported "shmem-rss" from "file-rss". [vbabka@suse.cz: forward-porting, tweak changelog] Signed-off-by: Jerome Marchand <jmarchan@redhat.com> Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Acked-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Acked-by: Michal Hocko <mhocko@suse.com> Acked-by: Hugh Dickins <hughd@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
48131e03ca
commit
eca56ff906
@@ -1361,10 +1361,26 @@ static inline void dec_mm_counter(struct mm_struct *mm, int member)
|
||||
atomic_long_dec(&mm->rss_stat.count[member]);
|
||||
}
|
||||
|
||||
/* Optimized variant when page is already known not to be PageAnon */
|
||||
static inline int mm_counter_file(struct page *page)
|
||||
{
|
||||
if (PageSwapBacked(page))
|
||||
return MM_SHMEMPAGES;
|
||||
return MM_FILEPAGES;
|
||||
}
|
||||
|
||||
static inline int mm_counter(struct page *page)
|
||||
{
|
||||
if (PageAnon(page))
|
||||
return MM_ANONPAGES;
|
||||
return mm_counter_file(page);
|
||||
}
|
||||
|
||||
static inline unsigned long get_mm_rss(struct mm_struct *mm)
|
||||
{
|
||||
return get_mm_counter(mm, MM_FILEPAGES) +
|
||||
get_mm_counter(mm, MM_ANONPAGES);
|
||||
get_mm_counter(mm, MM_ANONPAGES) +
|
||||
get_mm_counter(mm, MM_SHMEMPAGES);
|
||||
}
|
||||
|
||||
static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm)
|
||||
|
Reference in New Issue
Block a user