summaryrefslogtreecommitdiff
path: root/libpagemap
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2013-05-23 12:53:14 -0700
committerColin Cross <ccross@android.com>2013-06-24 14:56:58 -0700
commitfdcb71454499bb31143beb903be00bd88105dc33 (patch)
tree0972bbd812ac06d2abb3e4d334385bf9ce93743a /libpagemap
parent4ed62f58bc02eca9b6470112f17d2f82c46d6676 (diff)
downloadextras-fdcb71454499bb31143beb903be00bd88105dc33.tar.gz
libpagemap: add pm_map_usage_flags
Add pm_map_usage_flags, which is the same as pm_map_usage but only counts pages with the specified flags set. This can be used to only count "swapbacked" pages, which are pages that cannot be flushed back to disk without using swap. Change-Id: I6367555d9385502c797935849bb4221a8354e251
Diffstat (limited to 'libpagemap')
-rw-r--r--libpagemap/include/pagemap/pagemap.h5
-rw-r--r--libpagemap/pm_map.c17
2 files changed, 21 insertions, 1 deletions
diff --git a/libpagemap/include/pagemap/pagemap.h b/libpagemap/include/pagemap/pagemap.h
index 2e3688f5..ee6c26dd 100644
--- a/libpagemap/include/pagemap/pagemap.h
+++ b/libpagemap/include/pagemap/pagemap.h
@@ -184,6 +184,11 @@ int pm_map_pagemap(pm_map_t *map, uint64_t **pagemap_out, size_t *len);
/* Get the memory usage of this map alone. */
int pm_map_usage(pm_map_t *map, pm_memusage_t *usage_out);
+/* Get the memory usage of this map alone, only counting pages with specified
+ * flags. */
+int pm_map_usage_flags(pm_map_t *map, pm_memusage_t *usage_out,
+ uint64_t flags_mask, uint64_t required_flags);
+
/* Get the working set of this map alone. */
int pm_map_workingset(pm_map_t *map, pm_memusage_t *ws_out);
diff --git a/libpagemap/pm_map.c b/libpagemap/pm_map.c
index ef9e2ce6..6e3fe7d5 100644
--- a/libpagemap/pm_map.c
+++ b/libpagemap/pm_map.c
@@ -27,7 +27,8 @@ int pm_map_pagemap(pm_map_t *map, uint64_t **pagemap_out, size_t *len) {
pagemap_out, len);
}
-int pm_map_usage(pm_map_t *map, pm_memusage_t *usage_out) {
+int pm_map_usage_flags(pm_map_t *map, pm_memusage_t *usage_out,
+ uint64_t flags_mask, uint64_t required_flags) {
uint64_t *pagemap;
size_t len, i;
uint64_t count;
@@ -49,6 +50,16 @@ int pm_map_usage(pm_map_t *map, pm_memusage_t *usage_out) {
PM_PAGEMAP_SWAPPED(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 ((flags & flags_mask) != required_flags)
+ continue;
+ }
+
error = pm_kernel_count(map->proc->ker, PM_PAGEMAP_PFN(pagemap[i]),
&count);
if (error) goto out;
@@ -68,6 +79,10 @@ out:
return error;
}
+int pm_map_usage(pm_map_t *map, pm_memusage_t *usage_out) {
+ return pm_map_usage_flags(map, usage_out, 0, 0);
+}
+
int pm_map_workingset(pm_map_t *map, pm_memusage_t *ws_out) {
uint64_t *pagemap;
size_t len, i;