From patchwork Wed Dec 27 08:50:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 853097 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=sparclinux-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="KDew40i7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z665831KTz9sQm for ; Wed, 27 Dec 2017 19:50:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751002AbdL0Iuu (ORCPT ); Wed, 27 Dec 2017 03:50:50 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:39705 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750998AbdL0Iut (ORCPT ); Wed, 27 Dec 2017 03:50:49 -0500 Received: by mail-wr0-f194.google.com with SMTP id o101so7574770wrb.6 for ; Wed, 27 Dec 2017 00:50:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=C/fENCuzJ41XhCalpBvTTEQmKtaPPIMD4OAMdyqUJWE=; b=KDew40i7CoVs4VKwIBNOLlJis/YLuFuHpGuToGdxVpL8KkKoo4QQFRH+5TFf/xyAPL UhR7t4KCGVOsancRC/1uTYC1SJbSmOWf9HF6B9abHc7KVRrT9Oemj3yOY/ttue4thcO1 sY8SeIGJVt8BA9t9ibHb7MsAfD5yRj+8i28Uo= 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; bh=C/fENCuzJ41XhCalpBvTTEQmKtaPPIMD4OAMdyqUJWE=; b=aX1wZsYKvR/4KM/OAj3wzLEowEYRsFNaeh35PfrJacFeRtra71P6kg6f6wgjfCQuiZ an0OWXYNNv3sesOzB+xkfOzMw0/xm9Vdc0naceETCTXCJuyGLGLG0LprT34qOMa1YqiO tWfp3CEULLPeN+rIvKnjtMFpo+SIxunHGGcGZbPkDAA65n85qifctPN3wufx0J8ONARQ UQbAubEVQdbkveXIWQkSdt5+0g3FNLoPl/gk6QL8KxaRbsnLOfAlQfuYt5duKrxbQFjY SrKXAmujvY12TUJLRhsiJZ++DKMo1N2iwi8YLMldU1n9DUjWvouZ30hTbYN3c+Fwcpz1 7s4w== X-Gm-Message-State: AKGB3mJoEdSI2toCnAKgka5/u2+9xqtJ4pIBEqKhrLdzEiws4iRvQ1Zw Hnvw5l0LINC7GmXeSj4oWM9dxA== X-Google-Smtp-Source: ACJfBovBJ1KDyzVuSOLq4y9q96y5ILCxFgNVA/0hLenHe1NHbBzX0TcVxKgvhICPMoFlgZvGQLwnJg== X-Received: by 10.223.169.67 with SMTP id u61mr29161434wrc.30.1514364648183; Wed, 27 Dec 2017 00:50:48 -0800 (PST) Received: from localhost.localdomain ([105.137.110.132]) by smtp.gmail.com with ESMTPSA id q74sm32677226wmg.22.2017.12.27.00.50.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Dec 2017 00:50:46 -0800 (PST) From: Ard Biesheuvel To: linux-kernel@vger.kernel.org Cc: Ard Biesheuvel , "H. Peter Anvin" , Ralf Baechle , Arnd Bergmann , Heiko Carstens , Kees Cook , Will Deacon , Michael Ellerman , Thomas Garnier , Thomas Gleixner , "Serge E. Hallyn" , Bjorn Helgaas , Benjamin Herrenschmidt , Russell King , Paul Mackerras , Catalin Marinas , "David S. Miller" , Petr Mladek , Ingo Molnar , James Morris , Andrew Morton , Nicolas Pitre , Josh Poimboeuf , Steven Rostedt , Martin Schwidefsky , Sergey Senozhatsky , Linus Torvalds , Jessica Yu , linux-arm-kernel@lists.infradead.org, linux-mips@linux-mips.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, sparclinux@vger.kernel.org, x86@kernel.org Subject: [PATCH v6 0/8] add support for relative references in special sections Date: Wed, 27 Dec 2017 08:50:25 +0000 Message-Id: <20171227085033.22389-1-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 Sender: sparclinux-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: sparclinux@vger.kernel.org This adds support for emitting special sections such as initcall arrays, PCI fixups and tracepoints as relative references rather than absolute references. This reduces the size by 50% on 64-bit architectures, but more importantly, it removes the need for carrying relocation metadata for these sections in relocatables kernels (e.g., for KASLR) that need to fix up these absolute references at boot time. On arm64, this reduces the vmlinux footprint of such a reference by 8x (8 byte absolute reference + 24 byte RELA entry vs 4 byte relative reference) Patch #2 was sent out before as a single patch. This series supersedes the previous submission. This version makes relative ksymtab entries dependent on the new Kconfig symbol HAVE_ARCH_PREL32_RELOCATIONS rather than trying to infer from kbuild test robot replies for which architectures it should be blacklisted. Patch #1 introduces the new Kconfig symbol HAVE_ARCH_PREL32_RELOCATIONS, and sets it for the main architectures that are expected to benefit the most from this feature, i.e., 64-bit architectures or ones that use runtime relocations. Patches #3 - #5 implement relative references for initcalls, PCI fixups and tracepoints, respectively, all of which produce sections with order ~1000 entries on an arm64 defconfig kernel with tracing enabled. This means we save about 28 KB of vmlinux space for each of these patches. Patches #6 - #8 have been added in v5, and implement relative references in jump tables for arm64 and x86. On arm64, this results in significant space savings (650+ KB on a typical distro kernel). On x86, the savings are not as impressive, but still worthwhile. (Note that these patches do not rely on CONFIG_HAVE_ARCH_PREL32_RELOCATIONS, given that the inline asm that is emitted is already per-arch) For the arm64 kernel, all patches combined reduce the memory footprint of vmlinux by about 1.3 MB (using a config copied from Ubuntu that has KASLR enabled), of which ~1 MB is the size reduction of the RELA section in .init, and the remaining 300 KB is reduction of .text/.data. Branch: git://git.kernel.org/pub/scm/linux/kernel/git/ardb/linux.git relative-special-sections-v6 Changes since v5: - add missing jump_label prototypes to s390 jump_label.h (#6) - fix inverted condition in call to jump_entry_is_module_init() (#6) Changes since v4: - add patches to convert x86 and arm64 to use relative references for jump tables (#6 - #8) - rename PCI patch and add Bjorn's ack (#4) - rebase onto v4.15-rc5 Changes since v3: - fix module unload issue in patch #5 reported by Jessica, by reusing the updated routine for_each_tracepoint_range() for the quiescent check at module unload time; this requires this routine to be moved before tracepoint_module_going() in kernel/tracepoint.c - add Jessica's ack to #2 - rebase onto v4.14-rc1 Changes since v2: - Revert my slightly misguided attempt to appease checkpatch, which resulted in needless churn and worse code. This v3 is based on v1 with a few tweaks that were actually reasonable checkpatch warnings: unnecessary braces (as pointed out by Ingo) and other minor whitespace misdemeanors. Changes since v1: - Remove checkpatch errors to the extent feasible: in some cases, this involves moving extern declarations into C files, and switching to struct definitions rather than typedefs. Some errors are impossible to fix: please find the remaining ones after the diffstat. - Used 'int' instead if 'signed int' for the various offset fields: there is no ambiguity between architectures regarding its signedness (unlike 'char') - Refactor the different patches to be more uniform in the way they define the section entry type and accessors in the .h file, and avoid the need to add #ifdefs to the C code. Cc: "H. Peter Anvin" Cc: Ralf Baechle Cc: Arnd Bergmann Cc: Heiko Carstens Cc: Kees Cook Cc: Will Deacon Cc: Michael Ellerman Cc: Thomas Garnier Cc: Thomas Gleixner Cc: "Serge E. Hallyn" Cc: Bjorn Helgaas Cc: Benjamin Herrenschmidt Cc: Russell King Cc: Paul Mackerras Cc: Catalin Marinas Cc: "David S. Miller" Cc: Petr Mladek Cc: Ingo Molnar Cc: James Morris Cc: Andrew Morton Cc: Nicolas Pitre Cc: Josh Poimboeuf Cc: Steven Rostedt Cc: Martin Schwidefsky Cc: Sergey Senozhatsky Cc: Linus Torvalds Cc: Jessica Yu Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Cc: linux-mips@linux-mips.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-s390@vger.kernel.org Cc: sparclinux@vger.kernel.org Cc: x86@kernel.org Ard Biesheuvel (8): arch: enable relative relocations for arm64, power, x86, s390 and x86 module: use relative references for __ksymtab entries init: allow initcall tables to be emitted using relative references PCI: Add support for relative addressing in quirk tables kernel: tracepoints: add support for relative references kernel/jump_label: abstract jump_entry member accessors arm64/kernel: jump_label: use relative references x86/kernel: jump_table: use relative references arch/Kconfig | 10 ++++ arch/arm/include/asm/jump_label.h | 27 +++++++++ arch/arm64/Kconfig | 1 + arch/arm64/include/asm/jump_label.h | 48 +++++++++++++--- arch/arm64/kernel/jump_label.c | 22 +++++++- arch/arm64/kernel/vmlinux.lds.S | 2 +- arch/mips/include/asm/jump_label.h | 27 +++++++++ arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/jump_label.h | 27 +++++++++ arch/s390/Kconfig | 1 + arch/s390/include/asm/jump_label.h | 20 +++++++ arch/sparc/include/asm/jump_label.h | 27 +++++++++ arch/tile/include/asm/jump_label.h | 27 +++++++++ arch/x86/Kconfig | 1 + arch/x86/include/asm/Kbuild | 1 + arch/x86/include/asm/export.h | 5 -- arch/x86/include/asm/jump_label.h | 56 +++++++++++++++---- arch/x86/kernel/jump_label.c | 59 ++++++++++++++------ drivers/pci/quirks.c | 13 ++++- include/asm-generic/export.h | 12 +++- include/linux/compiler.h | 11 ++++ include/linux/export.h | 46 +++++++++++---- include/linux/init.h | 44 +++++++++++---- include/linux/pci.h | 20 +++++++ include/linux/tracepoint.h | 19 +++++-- init/main.c | 32 +++++------ kernel/jump_label.c | 38 ++++++------- kernel/module.c | 33 +++++++++-- kernel/printk/printk.c | 4 +- kernel/tracepoint.c | 50 +++++++++-------- security/security.c | 4 +- tools/objtool/special.c | 4 +- 32 files changed, 544 insertions(+), 148 deletions(-) delete mode 100644 arch/x86/include/asm/export.h