long int pages_present;
long int pages_swapped;
long int pages_unused;
+ int pid;
};
#define bintree_ops_to_af(bintree_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++;
}
}
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;
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);