diff options
author | Selim Gurun <sgurun@google.com> | 2012-01-20 19:44:54 -0800 |
---|---|---|
committer | Selim Gurun <sgurun@google.com> | 2012-01-20 20:10:22 -0800 |
commit | 76e6cb55fed01824e44306aa0485a3f8f122b228 (patch) | |
tree | c5abbce40e8fde59895ff7e7a484fc44758fc681 /libpagemap | |
parent | da63f160c29892a1f4a418e42dbaab57bb038d7c (diff) | |
download | extras-76e6cb55fed01824e44306aa0485a3f8f122b228.tar.gz |
Fix various issues in procrank.
Fixed these problems:
1. Page swapped bit was not extracted correctly.
2. Pages were ignored when page present bit is not set.
3. Bit operations were not correct.
4. There was a compiler warning about unsigned/signed comparision.
5. Line limit was too short for the map file. This was causing procrank
to generate a warning and remove the related process from results.
Change-Id: Ifed3913a49b15f59010cfa842090a13228074df9
Diffstat (limited to 'libpagemap')
-rw-r--r-- | libpagemap/include/pagemap/pagemap.h | 4 | ||||
-rw-r--r-- | libpagemap/pm_map.c | 5 | ||||
-rw-r--r-- | libpagemap/pm_process.c | 4 |
3 files changed, 5 insertions, 8 deletions
diff --git a/libpagemap/include/pagemap/pagemap.h b/libpagemap/include/pagemap/pagemap.h index 09ff29d8..25c6161f 100644 --- a/libpagemap/include/pagemap/pagemap.h +++ b/libpagemap/include/pagemap/pagemap.h @@ -129,10 +129,10 @@ int pm_process_pagemap_range(pm_process_t *proc, unsigned long low, unsigned long hi, uint64_t **range_out, size_t *len); -#define _BITS(x, offset, bits) (((x) >> offset) & ((1LL << ((bits) + 1)) - 1)) +#define _BITS(x, offset, bits) (((x) >> offset) & ((1LL << (bits)) - 1)) #define PM_PAGEMAP_PRESENT(x) (_BITS(x, 63, 1)) -#define PM_PAGEMAP_SWAPPED(x) (!_BITS(x, 62, 1)) +#define PM_PAGEMAP_SWAPPED(x) (_BITS(x, 62, 1)) #define PM_PAGEMAP_SHIFT(x) (_BITS(x, 55, 6)) #define PM_PAGEMAP_PFN(x) (_BITS(x, 0, 55)) #define PM_PAGEMAP_SWAP_OFFSET(x) (_BITS(x, 5, 50)) diff --git a/libpagemap/pm_map.c b/libpagemap/pm_map.c index f683ba6c..2d5c2f90 100644 --- a/libpagemap/pm_map.c +++ b/libpagemap/pm_map.c @@ -83,10 +83,6 @@ int pm_map_workingset(pm_map_t *map, pm_memusage_t *ws_out) { pm_memusage_zero(&ws); for (i = 0; i < len; i++) { - if (!PM_PAGEMAP_PRESENT(pagemap[i]) || - PM_PAGEMAP_SWAPPED(pagemap[i])) - continue; - error = pm_kernel_flags(map->proc->ker, PM_PAGEMAP_PFN(pagemap[i]), &flags); if (error) goto out; @@ -99,6 +95,7 @@ int pm_map_workingset(pm_map_t *map, pm_memusage_t *ws_out) { if (error) goto out; ws.vss += map->proc->ker->pagesize; + if( PM_PAGEMAP_SWAPPED(pagemap[i]) ) continue; ws.rss += (count >= 1) ? (map->proc->ker->pagesize) : (0); ws.pss += (count >= 1) ? (map->proc->ker->pagesize / count) : (0); ws.uss += (count == 1) ? (map->proc->ker->pagesize) : (0); diff --git a/libpagemap/pm_process.c b/libpagemap/pm_process.c index b3c077ee..dddff011 100644 --- a/libpagemap/pm_process.c +++ b/libpagemap/pm_process.c @@ -122,7 +122,7 @@ int pm_process_pagemap_range(pm_process_t *proc, free(range); *range_out = NULL; return 0; - } else if (error < 0 || (error > 0 && error < numpages * sizeof(uint64_t))) { + } else if (error < 0 || (error > 0 && error < (int)(numpages * sizeof(uint64_t)))) { error = (error < 0) ? errno : -1; free(range); return error; @@ -210,7 +210,7 @@ int pm_process_destroy(pm_process_t *proc) { } #define INITIAL_MAPS 10 -#define MAX_LINE 256 +#define MAX_LINE 1024 #define MAX_PERMS 5 /* |