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
diff --git a/libpagemap/include/pagemap/pagemap.h b/libpagemap/include/pagemap/pagemap.h
index 09ff29d..25c6161 100644
--- a/libpagemap/include/pagemap/pagemap.h
+++ b/libpagemap/include/pagemap/pagemap.h
@@ -129,10 +129,10 @@
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 f683ba6..2d5c2f9 100644
--- a/libpagemap/pm_map.c
+++ b/libpagemap/pm_map.c
@@ -83,10 +83,6 @@
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 @@
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 b3c077e..dddff01 100644
--- a/libpagemap/pm_process.c
+++ b/libpagemap/pm_process.c
@@ -122,7 +122,7 @@
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 @@
}
#define INITIAL_MAPS 10
-#define MAX_LINE 256
+#define MAX_LINE 1024
#define MAX_PERMS 5
/*