/* Read data from the /proc/pid/pagemap file */
static int parse_pageframe(FILE *file, struct pageframe *pf_tree,
- struct maps *maps)
+ struct maps *maps, int add_to_tree)
{
struct maps *map;
struct maps_list *tmp;
- struct pageframe *match, *pageframe;
+ struct pageframe *match, *pageframe = NULL;
long start, len, i;
unsigned long long pf;
int ret, error;
continue;
return -1;
}
- pageframe = alloc_pageframe();
+ if (!pageframe)
+ pageframe = alloc_pageframe();
+
pageframe_to_struct(pf, pageframe);
- match = tree_to_pageframe(
- bintree_add(&pf_tree->tree,
- &pageframe->tree, &pageframe_ops));
- if (match != pageframe)
- free(pageframe);
+ if (add_to_tree) {
+ match = tree_to_pageframe(
+ bintree_add(&pf_tree->tree,
+ &pageframe->tree,
+ &pageframe_ops));
+ } else {
+ match = tree_to_pageframe(
+ bintree_find(&pf_tree->tree,
+ &pageframe->tree,
+ &pageframe_ops));
+ }
+
+ if (match == NULL)
+ continue;
+
+ if (match == pageframe)
+ pageframe = NULL;
+
match->refcount++;
/*
* Add a link from the physical page to this
return 0;
}
-void read_pageframe(int pid, struct pageframe *pageframe)
+void read_pageframe(int pid, struct pageframe *pageframe, int add_to_tree)
{
struct maps *maps;
FILE *file;
if (!file)
goto err_out;
- parse_pageframe(file, pageframe, maps);
+ parse_pageframe(file, pageframe, maps, add_to_tree);
return;
err_out:
return atoi(dirent->d_name);
}
-void scan_all_pids(struct pageframe *pf)
+void scan_all_pids(struct pageframe *pf, int interesting_pid)
{
int pid;
+
+ read_pageframe(interesting_pid, pf, 1);
+
while(1) {
pid = get_next_pid();
if (pid <= 0)
break;
- read_pageframe(pid, pf);
+ read_pageframe(pid, pf, 0);
}
}