diff options
author | Colin Cross <ccross@android.com> | 2013-05-23 12:53:14 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2013-06-24 14:56:58 -0700 |
commit | fdcb71454499bb31143beb903be00bd88105dc33 (patch) | |
tree | 0972bbd812ac06d2abb3e4d334385bf9ce93743a /libpagemap | |
parent | 4ed62f58bc02eca9b6470112f17d2f82c46d6676 (diff) | |
download | extras-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.h | 5 | ||||
-rw-r--r-- | libpagemap/pm_map.c | 17 |
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; |