tools/vm/page-types.c: avoid memset() in walk_pfn() when count == 1
authorNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Thu, 17 Mar 2016 21:20:22 +0000 (14:20 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 17 Mar 2016 22:09:34 +0000 (15:09 -0700)
I found that page-types is very slow and my testing shows many timeout
errors.  Here's an example with a simple program allocating 1000 thps.

  $ time ./page-types -p $(pgrep -f test_alloc)
  ...
  real    0m17.201s
  user    0m16.889s
  sys     0m0.312s

Most of time is spent in memset().  Currently memset() clears over whole
buffer for every walk_pfn() call, which is inefficient when walk_pfn()
is called from walk_vma(), because in that case walk_pfn() is called for
each pfn.  So this patch limits the zero initialization only for the
first element.

  $ time ./page-types.patched -p $(pgrep -f test_alloc)
  ...
  real    0m0.182s
  user    0m0.046s
  sys     0m0.135s

Fixes: 954e95584579 ("tools/vm/page-types.c: add memory cgroup dumping and filtering")
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Suggested-by: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Vladimir Davydov <vdavydov@virtuozzo.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
tools/vm/page-types.c

index dab61c3..e92903f 100644 (file)
@@ -633,7 +633,15 @@ static void walk_pfn(unsigned long voffset,
        unsigned long pages;
        unsigned long i;
 
-       memset(cgi, 0, sizeof cgi);
+       /*
+        * kpagecgroup_read() reads only if kpagecgroup were opened, but
+        * /proc/kpagecgroup might even not exist, so it's better to fill
+        * them with zeros here.
+        */
+       if (count == 1)
+               cgi[0] = 0;
+       else
+               memset(cgi, 0, sizeof cgi);
 
        while (count) {
                batch = min_t(unsigned long, count, KPAGEFLAGS_BATCH);