On Fri 24-02-17 13:31:49, Shaohua Li wrote: > show MADV_FREE pages info of each vma in smaps. The interface is for > diganose or monitoring purpose, userspace could use it to understand > what happens in the application. Since userspace could dirty MADV_FREE > pages without notice from kernel, this interface is the only place we > can get accurate accounting info about MADV_FREE pages. > > Cc: Michal Hocko <mhocko@xxxxxxxx> > Cc: Hugh Dickins <hughd@xxxxxxxxxx> > Cc: Rik van Riel <riel@xxxxxxxxxx> > Cc: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Acked-by: Johannes Weiner <hannes@xxxxxxxxxxx> > Acked-by: Minchan Kim <minchan@xxxxxxxxxx> > Signed-off-by: Shaohua Li <shli@xxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> > --- > Documentation/filesystems/proc.txt | 4 ++++ > fs/proc/task_mmu.c | 8 +++++++- > 2 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt > index c94b467..45853e1 100644 > --- a/Documentation/filesystems/proc.txt > +++ b/Documentation/filesystems/proc.txt > @@ -412,6 +412,7 @@ Private_Clean: 0 kB > Private_Dirty: 0 kB > Referenced: 892 kB > Anonymous: 0 kB > +LazyFree: 0 kB > AnonHugePages: 0 kB > ShmemPmdMapped: 0 kB > Shared_Hugetlb: 0 kB > @@ -441,6 +442,9 @@ accessed. > "Anonymous" shows the amount of memory that does not belong to any file. Even > 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. > +"LazyFree" shows the amount of memory which is marked by madvise(MADV_FREE). > +The memory isn't freed immediately with madvise(). It's freed in memory > +pressure if the memory is clean. > "AnonHugePages" shows the ammount of memory backed by transparent hugepage. > "ShmemPmdMapped" shows the ammount of shared (shmem/tmpfs) memory backed by > huge pages. > diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c > index ee3efb2..8a5ec00 100644 > --- a/fs/proc/task_mmu.c > +++ b/fs/proc/task_mmu.c > @@ -440,6 +440,7 @@ struct mem_size_stats { > unsigned long private_dirty; > unsigned long referenced; > unsigned long anonymous; > + unsigned long lazyfree; > unsigned long anonymous_thp; > unsigned long shmem_thp; > unsigned long swap; > @@ -456,8 +457,11 @@ static void smaps_account(struct mem_size_stats *mss, struct page *page, > int i, nr = compound ? 1 << compound_order(page) : 1; > unsigned long size = nr * PAGE_SIZE; > > - if (PageAnon(page)) > + if (PageAnon(page)) { > mss->anonymous += size; > + if (!PageSwapBacked(page) && !dirty && !PageDirty(page)) > + mss->lazyfree += size; > + } > > mss->resident += size; > /* Accumulate the size in pages that have been accessed. */ > @@ -770,6 +774,7 @@ static int show_smap(struct seq_file *m, void *v, int is_pid) > "Private_Dirty: %8lu kB\n" > "Referenced: %8lu kB\n" > "Anonymous: %8lu kB\n" > + "LazyFree: %8lu kB\n" > "AnonHugePages: %8lu kB\n" > "ShmemPmdMapped: %8lu kB\n" > "Shared_Hugetlb: %8lu kB\n" > @@ -788,6 +793,7 @@ static int show_smap(struct seq_file *m, void *v, int is_pid) > mss.private_dirty >> 10, > mss.referenced >> 10, > mss.anonymous >> 10, > + mss.lazyfree >> 10, > mss.anonymous_thp >> 10, > mss.shmem_thp >> 10, > mss.shared_hugetlb >> 10, > -- > 2.9.3 > -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>