Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools/vm/page-types.c: avoid memset() in walk_pfn() when count == 1

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>

authored by

Naoya Horiguchi and committed by
Linus Torvalds
d9b2ddf8 7f2bd006

+9 -1
+9 -1
tools/vm/page-types.c
··· 633 633 unsigned long pages; 634 634 unsigned long i; 635 635 636 - memset(cgi, 0, sizeof cgi); 636 + /* 637 + * kpagecgroup_read() reads only if kpagecgroup were opened, but 638 + * /proc/kpagecgroup might even not exist, so it's better to fill 639 + * them with zeros here. 640 + */ 641 + if (count == 1) 642 + cgi[0] = 0; 643 + else 644 + memset(cgi, 0, sizeof cgi); 637 645 638 646 while (count) { 639 647 batch = min_t(unsigned long, count, KPAGEFLAGS_BATCH);