proc/smaps: carefully handle migration entries
authorKonstantin Khlebnikov <khlebnikov@openvz.org>
Thu, 31 May 2012 23:26:20 +0000 (16:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 1 Jun 2012 00:49:29 +0000 (17:49 -0700)
Currently smaps reports migration entries as "swap", as result "swap" can
appears in shared mapping.

This patch converts migration entries into pages and handles them as usual.

Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/proc/task_mmu.c

index 02476f5..e2c1155 100644 (file)
@@ -402,18 +402,20 @@ static void smaps_pte_entry(pte_t ptent, unsigned long addr,
 {
        struct mem_size_stats *mss = walk->private;
        struct vm_area_struct *vma = mss->vma;
-       struct page *page;
+       struct page *page = NULL;
        int mapcount;
 
-       if (is_swap_pte(ptent)) {
-               mss->swap += ptent_size;
-               return;
-       }
+       if (pte_present(ptent)) {
+               page = vm_normal_page(vma, addr, ptent);
+       } else if (is_swap_pte(ptent)) {
+               swp_entry_t swpent = pte_to_swp_entry(ptent);
 
-       if (!pte_present(ptent))
-               return;
+               if (!non_swap_entry(swpent))
+                       mss->swap += ptent_size;
+               else if (is_migration_entry(swpent))
+                       page = migration_entry_to_page(swpent);
+       }
 
-       page = vm_normal_page(vma, addr, ptent);
        if (!page)
                return;