summaryrefslogtreecommitdiff
path: root/libpagemap
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2013-06-21 12:53:51 -0700
committerColin Cross <ccross@android.com>2013-06-24 14:56:58 -0700
commit6af7cf28ec6ec7d0e32a77b2ba36db514120d561 (patch)
tree2156b11c163c6e26790ce8c039b9031c43d7447d /libpagemap
parent703868023a03e4665ad42248e3bbd9a42af52d92 (diff)
downloadextras-6af7cf28ec6ec7d0e32a77b2ba36db514120d561.tar.gz
libpagemap: count swapped pages
Add a new memusage field for swapped pages. Change-Id: I857143a5fdd294315dd89e834b1217a219f10479
Diffstat (limited to 'libpagemap')
-rw-r--r--libpagemap/include/pagemap/pagemap.h1
-rw-r--r--libpagemap/pm_map.c35
-rw-r--r--libpagemap/pm_memusage.c3
3 files changed, 22 insertions, 17 deletions
diff --git a/libpagemap/include/pagemap/pagemap.h b/libpagemap/include/pagemap/pagemap.h
index ee6c26dd..4727e9b9 100644
--- a/libpagemap/include/pagemap/pagemap.h
+++ b/libpagemap/include/pagemap/pagemap.h
@@ -29,6 +29,7 @@ struct pm_memusage {
size_t rss;
size_t pss;
size_t uss;
+ size_t swap;
};
/* Clears a memusage. */
diff --git a/libpagemap/pm_map.c b/libpagemap/pm_map.c
index 6e3fe7d5..a65d3154 100644
--- a/libpagemap/pm_map.c
+++ b/libpagemap/pm_map.c
@@ -46,27 +46,30 @@ int pm_map_usage_flags(pm_map_t *map, pm_memusage_t *usage_out,
for (i = 0; i < len; i++) {
usage.vss += map->proc->ker->pagesize;
- if (!PM_PAGEMAP_PRESENT(pagemap[i]) ||
- PM_PAGEMAP_SWAPPED(pagemap[i]))
+ if (!PM_PAGEMAP_PRESENT(pagemap[i]))
continue;
- if (flags_mask) {
- uint64_t flags;
- error = pm_kernel_flags(map->proc->ker, PM_PAGEMAP_PFN(pagemap[i]),
- &flags);
- if (error) goto out;
+ if (!PM_PAGEMAP_SWAPPED(pagemap[i])) {
+ if (flags_mask) {
+ uint64_t flags;
+ error = pm_kernel_flags(map->proc->ker, PM_PAGEMAP_PFN(pagemap[i]),
+ &flags);
+ if (error) goto out;
- if ((flags & flags_mask) != required_flags)
- continue;
- }
+ if ((flags & flags_mask) != required_flags)
+ continue;
+ }
- error = pm_kernel_count(map->proc->ker, PM_PAGEMAP_PFN(pagemap[i]),
- &count);
- if (error) goto out;
+ error = pm_kernel_count(map->proc->ker, PM_PAGEMAP_PFN(pagemap[i]),
+ &count);
+ if (error) goto out;
- usage.rss += (count >= 1) ? (map->proc->ker->pagesize) : (0);
- usage.pss += (count >= 1) ? (map->proc->ker->pagesize / count) : (0);
- usage.uss += (count == 1) ? (map->proc->ker->pagesize) : (0);
+ usage.rss += (count >= 1) ? map->proc->ker->pagesize : (0);
+ usage.pss += (count >= 1) ? (map->proc->ker->pagesize / count) : (0);
+ usage.uss += (count == 1) ? (map->proc->ker->pagesize) : (0);
+ } else {
+ usage.swap += map->proc->ker->pagesize;
+ }
}
memcpy(usage_out, &usage, sizeof(usage));
diff --git a/libpagemap/pm_memusage.c b/libpagemap/pm_memusage.c
index 9c5db92e..ea2a003c 100644
--- a/libpagemap/pm_memusage.c
+++ b/libpagemap/pm_memusage.c
@@ -17,7 +17,7 @@
#include <pagemap/pagemap.h>
void pm_memusage_zero(pm_memusage_t *mu) {
- mu->vss = mu->rss = mu->pss = mu->uss = 0;
+ mu->vss = mu->rss = mu->pss = mu->uss = mu->swap = 0;
}
void pm_memusage_add(pm_memusage_t *a, pm_memusage_t *b) {
@@ -25,4 +25,5 @@ void pm_memusage_add(pm_memusage_t *a, pm_memusage_t *b) {
a->rss += b->rss;
a->pss += b->pss;
a->uss += b->uss;
+ a->swap += b->swap;
}