]> git.itanic.dy.fi Git - scan-pagemap/commitdiff
Analyzer: Print better per pid stats
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 6 Jul 2010 13:34:25 +0000 (16:34 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 6 Jul 2010 13:34:25 +0000 (16:34 +0300)
Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
analyze.c

index bb88129dd2ff6d68a803d676d8bd38a9ddb4a44b..806752bccd54834f6028614e2750432c1b5df30b 100644 (file)
--- a/analyze.c
+++ b/analyze.c
@@ -29,6 +29,7 @@ struct analyze_frames {
        long int pages_present;
        long int pages_swapped;
        long int pages_unused;
+       int pid;
 };
 
 #define bintree_ops_to_af(bintree_ops)                         \
@@ -38,13 +39,23 @@ static void count_pages(struct bintree *b, struct bintree_ops *ops)
 {
        struct pageframe *pf = tree_to_pageframe(b);
        struct analyze_frames *af = bintree_ops_to_af(ops);
+       struct maps_list *ml;
+
+       if (af->pid) {
+               list_for_each_entry(ml, &pf->ml->list, list) {
+                       if (ml->map->pid == af->pid)
+                               goto get_stats;
+               }
+               return;
+       }
 
+get_stats:
        if (pf->page_present) {
-               af->pages_present += pf->refcount;
+               af->pages_present++;
        } else if (pf->page_swapped) {
-               af->pages_swapped += pf->refcount;
+               af->pages_swapped++;
        } else {
-               af->pages_unused += pf->refcount;
+               af->pages_unused++;
        }
 }
 
@@ -80,15 +91,24 @@ void print_page_stats(struct pageframe *pf)
 
 void print_pid_stats(struct pageframe *pf, struct process *process_list)
 {
+       struct analyze_frames af;
        struct process *ps;
        long int swapped, present;
        long int biggest = 0, second_biggest;
        int count;
 
-       list_for_each_entry(ps, &process_list->list, list)
+       list_for_each_entry(ps, &process_list->list, list) {
+               memset(&af, 0, sizeof(af));
+               af.ops.callback = count_pages;
+               af.pid = ps->pid;
+
+               bintree_walk(&pf->tree, &af.ops);
+               ps->pages_present = af.pages_present;
+               ps->pages_swapped = af.pages_swapped;
                biggest = MAX(biggest, ps->pages_present);
+       }
 
-       printf("   in ram   swapped    pid name\n");
+       printf("   in ram   swapped   pid name\n");
 
 restart:
        second_biggest = 0;
@@ -108,7 +128,7 @@ restart:
                if ((swapped + present) == 0)
                        continue;
 
-               printf("% 6lld %sB % 6lld %sB % 5d %s\n",
+               printf("%6lld %sB %6lld %sB %5d %s\n",
                        PAGE_TO_NICE(present), PAGE_TO_NICE_UNIT(present),
                        PAGE_TO_NICE(swapped), PAGE_TO_NICE_UNIT(swapped),
                        ps->pid, ps->name);