Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp3129192pxa; Tue, 25 Aug 2020 12:12:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwY15ALVx3DZQjlOKyPBv1q6KPB2K2/q5z/SvJUporzF+bWs+6J0cTa27Ef4mLBoSWZL30r X-Received: by 2002:a17:906:299b:: with SMTP id x27mr12536696eje.550.1598382756516; Tue, 25 Aug 2020 12:12:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598382756; cv=none; d=google.com; s=arc-20160816; b=GdyS3c0hPPGE3h8h2GCsLzfkCmVw6BRndOrpWY5OoHWqe+bcEjZmNTTl+EqFT5jJId /SJpCQmTRi6pBbXWn7I7V60qMDWP0hwlgR/MCImYQXGaDXg9TJ+8/loyn8HP6aukMhZu 63EDSn3amqwpnUf2NyCrz9u7IDUDDkua6wvqkT7oD2fxiBAUD48csUvpkfM6/08vtpqm 6A+XrgYft7qCuEQHMP1OWPr/TYe+ulWzVWYkyDIkYvrcz4WoqbFgFvsbYwEnl0UB5Dp0 Xt/MvUX3VgTWdwBB5/Wb0DFR/oAu4hKl6jC8/0vj/wkjyDc7p/OHga30Xu3q1h6u7CVt 0M0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=sqg/AVsJ1oT2dhhuL1pGToPQlBX2/1COi4hiuERTnjA=; b=Zho1XW5g53oh2EbILR0AQDysVcPyin+uJ8S+Qh/EZytdoo4mTlGL/xg25j0SqwbSj4 Lz1hD8eP+AaPB5/R6QOElvY/ut50ZbjwN5010/6/tg22eNEIaMYQ37md3pRV3w0RFa2u 9SqzX2ilB/QS2MWR3iUQ41JGUsDKOeIuWZzBYKXYFuEqcWWuyze8/6rMu/XQhHy+MzoP bx4xTF63B72tYHB14g6NmQaU6mhLsX02nhaf9lmpq0d6nCww0Fs/RR+h5JXh0K4NAGG4 uyZxJ8Iye5SQ3bqNSKfvPEWlYy+VDBKTQcBE+DkpO24pNipwL4h964hxvDCd56XosTNw FN6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=kVcobcRS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f1si9190290edq.182.2020.08.25.12.12.12; Tue, 25 Aug 2020 12:12:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=kVcobcRS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726627AbgHYTLd (ORCPT + 99 others); Tue, 25 Aug 2020 15:11:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726149AbgHYTLc (ORCPT ); Tue, 25 Aug 2020 15:11:32 -0400 Received: from mail-lj1-x244.google.com (mail-lj1-x244.google.com [IPv6:2a00:1450:4864:20::244]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E6A60C061574 for ; Tue, 25 Aug 2020 12:11:31 -0700 (PDT) Received: by mail-lj1-x244.google.com with SMTP id w25so15069670ljo.12 for ; Tue, 25 Aug 2020 12:11:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=sqg/AVsJ1oT2dhhuL1pGToPQlBX2/1COi4hiuERTnjA=; b=kVcobcRSSbSwtArpkequCFg/jJ8T8FsgtVMPimpf6wOhWqq2/Hr5kRE1Yg6BwYr0UA u7ysR2Efssagz6ZUOk0bL32r4e+n7hetOE99CvYwOGifEqDmV77B0i0ujKWezdmds8ec S+Vm+7O3HyyI0CFW88D2upgwbRZL92pXrqclUJMcxNhmXAzNBwQ05/dxoHRvgLicg1Xr PtYw651eXyLcjWYvXHNNqa+aw2OZzurp/+y4ddaFVKkn5Qda8IB4W/JBwPUZV7AYoVfe djrTzvHgMN0SDBrc3ft5i+Bumjr8XezO69qr5rk98ZjjCy3guO17BPMnhGyZS+zWBcl+ s0kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=sqg/AVsJ1oT2dhhuL1pGToPQlBX2/1COi4hiuERTnjA=; b=UCoDs+1K1FDm0flF9aezqeSPDNI0fEfLCwRpjW7kg5TIWOhJHIadSpUHTL5emlfTd5 mH24tw355uikQ586S1pvGWbrTD0xuTSLG83yEplg4TGg6hJaoyp+NvXwQ9wBGxZzkWoe bE4XbrtBcfzijDZogONy1rN754kl5GW0a785KXc+XJliMIDyOuzxtaKSBlqQw/HdthuQ 2IwtIiSxw2TcQcsNvuwwx0SlbNjMRFh0RhoYVVZq2SdoOOHpJNC1a0OMExCn7+5nfPZ1 fG9w3gcsehcOBHbQeY8OrVWxOqd9u9XHKz40gk+rOc75Zv1MmXWpb4Da6ZZAOz2LbcLE 6OLw== X-Gm-Message-State: AOAM53192BcDMa5IL+7p3uAU+DBXAr85gVzgD4SDhdRRGXOPyR1QlXrL vF2MLldwr/8CLmRXQh3jwEMgjoK1xFBPwg== X-Received: by 2002:a2e:9b95:: with SMTP id z21mr5742369lji.83.1598382690090; Tue, 25 Aug 2020 12:11:30 -0700 (PDT) Received: from nero.bb.dnainternet.fi (dyn9cmyyyyyyyyyyyyyft-3.rev.dnainternet.fi. [2001:14ba:2fa:2500::9]) by smtp.gmail.com with ESMTPSA id q20sm3016553ljj.42.2020.08.25.12.11.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2020 12:11:29 -0700 (PDT) From: Pekka Enberg To: linux-kernel@vger.kernel.org Cc: Pekka Enberg , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" Subject: [RFC PATCH] x86/mm/fault: Inline page fault paths to reduce kernel text size Date: Tue, 25 Aug 2020 22:11:26 +0300 Message-Id: <20200825191126.289713-1-penberg@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pekka Enberg The commit 92181f190b649f7ef2b79cbf5c00f26ccc66da2a ("x86: optimise x86's do_page_fault (C entry point for the page fault path)") from 2009 shows significant stack savings when infrequent page fault handling paths are moved out of line with the "noinline" annotation, with some increase in kernel text size. However, a decade of GCC improvements (and changes in the code) has eliminated such wins in stack usage: With "noinline": 0000000000000b30 : b30: 41 57 push %r15 b32: 41 56 push %r14 b34: 41 55 push %r13 b36: 49 89 d5 mov %rdx,%r13 b39: 41 54 push %r12 b3b: 49 89 fc mov %rdi,%r12 b3e: 55 push %rbp b3f: 48 89 f5 mov %rsi,%rbp b42: 53 push %rbx b43: 65 48 8b 04 25 00 00 mov %gs:0x0,%rax b4a: 00 00 b4c: 48 83 ec 18 sub $0x18,%rsp With "inline": 00000000000008a0 : 8a0: 41 57 push %r15 8a2: 41 56 push %r14 8a4: 41 55 push %r13 8a6: 49 89 d5 mov %rdx,%r13 8a9: 41 54 push %r12 8ab: 49 89 fc mov %rdi,%r12 8ae: 55 push %rbp 8af: 48 89 f5 mov %rsi,%rbp 8b2: 53 push %rbx 8b3: 65 48 8b 04 25 00 00 mov %gs:0x0,%rax 8ba: 00 00 8bc: 48 83 ec 18 sub $0x18,%rsp So all we're left with is the increase in kernel text: add/remove: 1/5 grow/shrink: 2/1 up/down: 1049/-1144 (-95) Function old new delta spurious_kernel_fault.part - 559 +559 do_user_addr_fault 988 1446 +458 do_kern_addr_fault 103 135 +32 bad_area_nosemaphore 13 - -13 bad_area 66 - -66 pgtable_bad 107 - -107 mm_fault_error 199 - -199 bad_area_access_error 226 - -226 spurious_kernel_fault 553 20 -533 Total: Before=7359, After=7264, chg -1.29% Therefore, let's inline the page fault handling paths to reduce kernel text size. Cc: Dave Hansen Cc: Andy Lutomirski Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Borislav Petkov Cc: "H. Peter Anvin" Signed-off-by: Pekka Enberg --- arch/x86/mm/fault.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 35f1498e9832..b8893684d80c 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -533,7 +533,7 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code, unsigned long ad dump_pagetable(address); } -static noinline void +static inline void pgtable_bad(struct pt_regs *regs, unsigned long error_code, unsigned long address) { @@ -577,7 +577,7 @@ static void set_signal_archinfo(unsigned long address, tsk->thread.cr2 = address; } -static noinline void +static inline void no_context(struct pt_regs *regs, unsigned long error_code, unsigned long address, int signal, int si_code) { @@ -788,7 +788,7 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, no_context(regs, error_code, address, SIGSEGV, si_code); } -static noinline void +static inline void bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, unsigned long address) { @@ -809,7 +809,7 @@ __bad_area(struct pt_regs *regs, unsigned long error_code, __bad_area_nosemaphore(regs, error_code, address, pkey, si_code); } -static noinline void +static inline void bad_area(struct pt_regs *regs, unsigned long error_code, unsigned long address) { __bad_area(regs, error_code, address, 0, SEGV_MAPERR); @@ -832,7 +832,7 @@ static inline bool bad_area_access_from_pkeys(unsigned long error_code, return false; } -static noinline void +static inline void bad_area_access_error(struct pt_regs *regs, unsigned long error_code, unsigned long address, struct vm_area_struct *vma) { @@ -905,7 +905,7 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address); } -static noinline void +static inline void mm_fault_error(struct pt_regs *regs, unsigned long error_code, unsigned long address, vm_fault_t fault) { @@ -971,7 +971,7 @@ static int spurious_kernel_fault_check(unsigned long error_code, pte_t *pte) * See Intel Developer's Manual Vol 3 Section 4.10.4.3, bullet 3 * (Optional Invalidation). */ -static noinline int +static inline int spurious_kernel_fault(unsigned long error_code, unsigned long address) { pgd_t *pgd; -- 2.26.2