From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754147AbcITW21 (ORCPT ); Tue, 20 Sep 2016 18:28:27 -0400 Received: from mail-wm0-f53.google.com ([74.125.82.53]:35265 "EHLO mail-wm0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752961AbcITW2X (ORCPT ); Tue, 20 Sep 2016 18:28:23 -0400 From: Rasmus Villemoes To: Andrew Morton , Kees Cook Cc: linux-kernel@vger.kernel.org, Rasmus Villemoes Subject: [PATCH] fs/proc/array.c: slightly improve render_sigset_t Date: Wed, 21 Sep 2016 00:28:04 +0200 Message-Id: <1474410485-1305-1-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org format_decode and vsnprintf occasionally show up in perf top, so I went looking for places that might not need the full printf power. With the help of kprobes, I gathered some statistics on which format strings we mostly pass to vsnprintf. On a trivial desktop workload, I hit "%x" 25% of the time, so something apparently reads /proc/pid/status (which does 5*16 printf("%x") calls) a lot. With this patch, reading /proc/pid/status is 30% faster according to this microbenchmark: char buf[4096]; int i, fd; for (i = 0; i < 10000; ++i) { fd = open("/proc/self/status", O_RDONLY); read(fd, buf, sizeof(buf)); close(fd); } Signed-off-by: Rasmus Villemoes --- fs/proc/array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/proc/array.c b/fs/proc/array.c index 88c7de12197b..7f73b689a15c 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -251,7 +251,7 @@ void render_sigset_t(struct seq_file *m, const char *header, if (sigismember(set, i+2)) x |= 2; if (sigismember(set, i+3)) x |= 4; if (sigismember(set, i+4)) x |= 8; - seq_printf(m, "%x", x); + seq_putc(m, hex_asc[x]); } while (i >= 4); seq_putc(m, '\n'); -- 2.1.4