]> git.itanic.dy.fi Git - scan-pagemap/commitdiff
parse_pagemap: Optimize pagemap reads
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 6 Jul 2010 11:30:13 +0000 (14:30 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 6 Jul 2010 11:30:13 +0000 (14:30 +0300)
Do less read() syscalls in order to reduce overhead.

Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
parse.c

diff --git a/parse.c b/parse.c
index c93e3990b310a5d3fad6118d2a5bc1ab1c454671..a4adcac322228acb64731b74fc625f9e159d2e4f 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -130,7 +130,7 @@ static int parse_pageframe(FILE *file, struct pageframe *pf_tree,
        struct maps_list *tmp;
        struct pageframe *match, *pageframe = NULL;
        long start, len, i;
-       unsigned long long pf;
+       unsigned long long pf[10240];
        int ret, error;
 
        if (maps == NULL)
@@ -150,15 +150,17 @@ static int parse_pageframe(FILE *file, struct pageframe *pf_tree,
                }
 
                for (i = 0; i < len; i++) {
-                       ret = fread(&pf, 1, sizeof(pf), file);
-                       if (ret != sizeof(pf)) {
+                       if (!ret)
+                               ret = fread(&pf, 1,
+                                       MIN(sizeof(pf), len - i), file);
+                       if (ret < 0) {
                                error = errno;
                                continue;
                        }
                        if (!pageframe)
                                pageframe = alloc_pageframe();
-
-                       pageframe_to_struct(pf, pageframe);
+                       ret -= sizeof(pf[0]);
+                       pageframe_to_struct(pf[ret / sizeof(pf[0])], pageframe);
 
                        if (add_to_tree) {
                                match = tree_to_pageframe(