From patchwork Tue Jun 20 21:10:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 106027 Delivered-To: patch@linaro.org Received: by 10.140.91.2 with SMTP id y2csp1601842qgd; Tue, 20 Jun 2017 14:12:42 -0700 (PDT) X-Received: by 10.98.208.1 with SMTP id p1mr32248201pfg.219.1497993162482; Tue, 20 Jun 2017 14:12:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1497993162; cv=none; d=google.com; s=arc-20160816; b=Ef0BxYlBSmD90wozK9y+hdKWkg8Dt+Hv+kLW/4fPDmgv7Aa9A0p4LF8RQE8iPVOCak qNQvfNXPUzWYg+c+jxa8vjzy9PlfzRpSx8VMQeF2fJxYPpGq9ejG7YbfPigRA+NmY9UV aLpiafRqhw/Dpas8gTNnG+bKe7JjAOpcXD4bDjPUfFb+bJRojOMeAHw+bisLD6htVma7 t5xsI58M8RHwOJzJ1GHEg5jUBwVhvGeQiK7jdyHyJXgStaL51Su+XpTqIfRDV6dE0lN2 9dlb1bBTihF7HixI6rAFW5TyQq3hMgMf0VsZEUZ+yQ3HSrDMpvdoCTAdN8Mr+2KNnwHM mBYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=Xk42T5FDXgrglLphvrDgF8pBbi1mKnrkg/Etxf5CNPs=; b=Odt9jWzDdqguSTgvs36UON1ixHBSzqQO7j3vEOWwle1a8ZVx2e08lrtPILW8iJXwrq KS+3xm/lHJJ443ZTgK5IhGgBRrC5/v4I55S3CG4Di2f2FCdu+gqJtLy2tKvOVhXiFyav ehWrky5zF0b1x+eTtnpaeJISX8vysE+ITFNh3Z5U4VLsWYalJIn9Kr1vB/TUUwItIzzP ttw7cFzJ5Df+vHavIEcBAyQErnI/1QvTOEgOSSFFBmRoYLKeMkE1103/VMQi97w2nM8v sqVFlSbYXLqKjLMrMXMh7WjpmN3iHpfgVcvPPxg6ai/0bmOwykJi1YYTaXQAdlxwuXDf m9XQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 22si1094010pfx.268.2017.06.20.14.12.42; Tue, 20 Jun 2017 14:12:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751920AbdFTVMk (ORCPT + 6 others); Tue, 20 Jun 2017 17:12:40 -0400 Received: from mout.kundenserver.de ([212.227.126.131]:54480 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751773AbdFTVMj (ORCPT ); Tue, 20 Jun 2017 17:12:39 -0400 Received: from wuerfel.lan ([5.56.224.194]) by mrelayeu.kundenserver.de (mreue001 [212.227.15.129]) with ESMTPA (Nemesis) id 0LmC02-1dx2A90erC-00Zu5g; Tue, 20 Jun 2017 23:11:19 +0200 From: Arnd Bergmann To: Greg Kroah-Hartman , Jiri Slaby Cc: Dmitry Torokhov , kasan-dev@googlegroups.com, Dmitry Vyukov , Alexander Potapenko , Andrey Ryabinin , linux-kernel@vger.kernel.org, Samuel Thibault , linux-serial@vger.kernel.org, linux-input@vger.kernel.org, Peter Hurley , Arnd Bergmann , stable@vger.kernel.org, Rob Herring , Andy Shevchenko Subject: [PATCH 1/2] tty: improve tty_insert_flip_char() fast path Date: Tue, 20 Jun 2017 23:10:41 +0200 Message-Id: <20170620211112.1490310-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:l/xlSCNn74ZGASxHKWAL7npAPJfTIKIqg4z9nrW0PczXCvhz+8J jfjtusQVIB/J344MFURt6HZ/SyunLwd0ZFmKyKzqvpN7o/XwiLscRjSBbHoiN6x/1ntSby4 97bvQUGxYbAMNWuQToCLCI7SUtBxrtEsB9WpzXFwlBcjSejXsxHe6aMwQfSy1OUQa9cYLoy 9Kt9NAgdDDMYtH+ls20oQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:KijWmP49yGs=:1Hc16vVi5dQxacn+d+Pjs+ OmKjY3PgQYxSyezkCRTb+qA7yDdaNV6U6LfuYnnW7qIVcb4JOhJsZizZQJGjP1XJ6ZnPvcsSj T+w71cwU8X0vrJ4dKRyWzP12eaactLkTHnMG3jWj0lzaLUI4yQfKd8C2c5nsfjHhmkVE6+wUX nN5tpCLfaJUBb6/V3yIr6EB63aSFuL6XK2HSfiyaJqTf+oIke7offq/NSNpz86TuOLcOuNA70 prO4dcP2YngDhwFcEyV9x/WjMcd6Vf1ku7t6V0uriQMFaoyIbS26u8zcNw51j26fYyp6F9rkM YCdqCIKc/Z6U6mjOPyfgePbsTuLZZcCNY5wpM+FTX9mBkPmVye9UVnfmfT3DW8X/39JBWkLla DCjIn8k9r3keugxhBolT2DefkDBK9oRnkbxIIt/35z81j54rY+2JlZXqseB2+Dsyu4UxC2q3N wMl40sK/gpWLnQ9Zl8NI0zhTnkVtdO3Q1ZvmuDgaHNESANKVoxWlQNJe7Hzd6Xp0dHsaGa37U 4+SFRHMeVfs+RU051oupt2ahdYXbEH+PGmFyF1HT1G4FT2UAa2XbicRyzRv7JS+S6hFo9tNyC 2QcfC+jeAs7shlg+VgWOozPPGVCg9Y0MgxFuIwFDObvtqCc0WCH9EEyNGB8mzM5WMRwsi9tzL iEmb9WDZFW+N+VkRgqUCS18nH5CieVnc+9PDP7B4X03oRcmTnvRw7kil+fQCGJqiOIWk= Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org kernelci.org reports a crazy stack usage for the VT code when CONFIG_KASAN is enabled: drivers/tty/vt/keyboard.c: In function 'kbd_keycode': drivers/tty/vt/keyboard.c:1452:1: error: the frame size of 2240 bytes is larger than 2048 bytes [-Werror=frame-larger-than=] The problem is that tty_insert_flip_char() gets inlined many times into kbd_keycode(), and also into other functions, and each copy requires 128 bytes for stack redzone to check for a possible out-of-bounds access on the 'ch' and 'flags' arguments that are passed into tty_insert_flip_string_flags as a variable-length string. This introduces a new __tty_insert_flip_char() function for the slow path, which receives the two arguments by value. This completely avoids the problem and the stack usage goes back down to around 100 bytes. Without KASAN, this is also slightly better, as we don't have to spill the arguments to the stack but can simply pass 'ch' and 'flag' in registers, saving a few bytes in .text for each call site. This should be backported to linux-4.0 or later, which first introduced the stack sanitizer in the kernel. Cc: stable@vger.kernel.org Fixes: c420f167db8c ("kasan: enable stack instrumentation") Signed-off-by: Arnd Bergmann --- drivers/tty/tty_buffer.c | 24 ++++++++++++++++++++++++ include/linux/tty_flip.h | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) -- 2.9.0 diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 4e7a4e9dcf4d..2da05fa37aec 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -362,6 +362,30 @@ int tty_insert_flip_string_flags(struct tty_port *port, EXPORT_SYMBOL(tty_insert_flip_string_flags); /** + * __tty_insert_flip_char - Add one character to the tty buffer + * @port: tty port + * @ch: character + * @flag: flag byte + * + * Queue a single byte to the tty buffering, with an optional flag. + * This is the slow path of tty_insert_flip_char. + */ +int __tty_insert_flip_char(struct tty_port *port, unsigned char ch, char flag) +{ + struct tty_buffer *tb = port->buf.tail; + int flags = (flag == TTY_NORMAL) ? TTYB_NORMAL : 0; + + if (!tty_buffer_request_room(port, 1)) + return 0; + + *flag_buf_ptr(tb, tb->used) = flag; + *char_buf_ptr(tb, tb->used++) = ch; + + return 1; +} +EXPORT_SYMBOL(__tty_insert_flip_char); + +/** * tty_schedule_flip - push characters to ldisc * @port: tty port to push from * diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h index c28dd523f96e..d43837f2ce3a 100644 --- a/include/linux/tty_flip.h +++ b/include/linux/tty_flip.h @@ -12,6 +12,7 @@ extern int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars, size_t size); extern void tty_flip_buffer_push(struct tty_port *port); void tty_schedule_flip(struct tty_port *port); +int __tty_insert_flip_char(struct tty_port *port, unsigned char ch, char flag); static inline int tty_insert_flip_char(struct tty_port *port, unsigned char ch, char flag) @@ -26,7 +27,7 @@ static inline int tty_insert_flip_char(struct tty_port *port, *char_buf_ptr(tb, tb->used++) = ch; return 1; } - return tty_insert_flip_string_flags(port, &ch, &flag, 1); + return __tty_insert_flip_char(port, ch, flag); } static inline int tty_insert_flip_string(struct tty_port *port,