From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg0-f66.google.com ([74.125.83.66]:39440 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965047AbeALS6Q (ORCPT ); Fri, 12 Jan 2018 13:58:16 -0500 Received: by mail-pg0-f66.google.com with SMTP id z20so5120767pgv.6 for ; Fri, 12 Jan 2018 10:58:16 -0800 (PST) From: Andrei Vagin To: linux-fsdevel@vger.kernel.org Cc: Andrew Morton , Andrei Vagin , Alexey Dobriyan , KAMEZAWA Hiroyuki Subject: [PATCH 2/2] procfs: optimize seq_pad() to speed up /proc/pid/maps Date: Fri, 12 Jan 2018 10:58:12 -0800 Message-Id: <20180112185812.7710-2-avagin@openvz.org> In-Reply-To: <20180112185812.7710-1-avagin@openvz.org> References: <20180112185812.7710-1-avagin@openvz.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: seq_printf() is slow and it can be replaced by memset() in this case. == test.py num = 0 with open("/proc/1/maps") as f: while num < 10000 : data = f.read() f.seek(0, 0) num = num + 1 == == Before patch == $ time python test.py real 0m0.986s user 0m0.279s sys 0m0.707s == After patch == $ time python test.py real 0m0.932s user 0m0.261s sys 0m0.669s $ perf record -g python test.py == Before patch == - 47.35% 3.38% python [kernel.kallsyms] [k] show_map_vma.isra.23 - 43.97% show_map_vma.isra.23 + 20.84% seq_path - 15.73% show_vma_header_prefix + 6.96% seq_pad + 2.94% __GI___libc_read == After patch == - 44.01% 0.34% python [kernel.kallsyms] [k] show_pid_map - 43.67% show_pid_map - 42.91% show_map_vma.isra.23 + 21.55% seq_path - 15.68% show_vma_header_prefix + 2.08% seq_pad 0.55% seq_putc Cc: Alexey Dobriyan Cc: KAMEZAWA Hiroyuki Signed-off-by: Andrei Vagin --- fs/seq_file.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/seq_file.c b/fs/seq_file.c index fb37ec42fae2..0ee52a372b66 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -829,8 +829,14 @@ EXPORT_SYMBOL(seq_write); void seq_pad(struct seq_file *m, char c) { int size = m->pad_until - m->count; - if (size > 0) - seq_printf(m, "%*s", size, ""); + if (size > 0) { + if (size + m->count > m->size) { + seq_set_overflow(m); + return; + } + memset(m->buf + m->count, ' ', size); + m->count += size; + } if (c) seq_putc(m, c); } -- 2.13.6