summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRom Lemarchand <romlem@google.com>2013-07-26 16:33:20 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-07-26 16:33:20 +0000
commit94767603d37e8af3159e23d830562952cb8cc99c (patch)
tree7f4024dbbc0990cf945ff9ed9604aeceef330b90
parentce8e9afa4ea3a6cfd27088a312c689f89b7b1765 (diff)
parente88d534f368319150253589bc00fbee20575ca0a (diff)
downloadextras-94767603d37e8af3159e23d830562952cb8cc99c.tar.gz
Merge "ksmutils: display page count"
-rw-r--r--ksmutils/ksminfo.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/ksmutils/ksminfo.c b/ksmutils/ksminfo.c
index ed311ac2..eb3c024c 100644
--- a/ksmutils/ksminfo.c
+++ b/ksmutils/ksminfo.c
@@ -43,6 +43,7 @@ struct vaddr {
};
struct ksm_page {
+ uint64_t count;
uint32_t hash;
struct vaddr *vaddr;
size_t vaddr_len, vaddr_size;
@@ -275,6 +276,12 @@ static int read_pages(struct ksm_pages *kp, pm_map_t **maps, size_t num_maps, ui
kp->pages = tmp;
kp->size += GROWTH_FACTOR;
}
+ rc = pm_kernel_count(ker, pagemap[j], &kp->pages[kp->len].count);
+ if (rc) {
+ fprintf(stderr, "error reading page count\n");
+ free(pagemap);
+ goto err_count;
+ }
kp->pages[kp->len].hash = hash;
kp->pages[kp->len].pattern =
is_pattern((uint8_t *)data, pm_kernel_pagesize(ker)) ?
@@ -318,6 +325,7 @@ static int read_pages(struct ksm_pages *kp, pm_map_t **maps, size_t num_maps, ui
goto no_err;
err_realloc:
+err_count:
if (pr_flags & PR_VERBOSE) {
for (i = 0; i < kp->len; i++) {
free(kp->pages[i].vaddr);
@@ -347,6 +355,13 @@ static void print_pages(struct ksm_pages *kp, uint8_t pr_flags) {
if (kp->pages[i].vaddr_count > 1) {
printf("s");
}
+ if (!(pr_flags & PR_ALL)) {
+ printf(" (%llu reference", kp->pages[i].count);
+ if (kp->pages[i].count > 1) {
+ printf("s");
+ }
+ printf(")");
+ }
printf("\n");
if (pr_flags & PR_VERBOSE) {
@@ -393,8 +408,9 @@ static void usage(char *myname) {
static int cmp_pages(const void *a, const void *b) {
const struct ksm_page *pg_a = a;
const struct ksm_page *pg_b = b;
+ int cmp = pg_b->vaddr_count - pg_a->vaddr_count;
- return pg_b->vaddr_count - pg_a->vaddr_count;
+ return cmp ? cmp : pg_b->count - pg_a->count;
}
static bool is_pattern(uint8_t *data, size_t len) {