From patchwork Mon Feb 29 03:48:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Pitre X-Patchwork-Id: 63168 Delivered-To: patch@linaro.org Received: by 10.112.199.169 with SMTP id jl9csp1022374lbc; Sun, 28 Feb 2016 19:49:03 -0800 (PST) X-Received: by 10.66.221.10 with SMTP id qa10mr18850656pac.4.1456717743327; Sun, 28 Feb 2016 19:49:03 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id vz3si1817096pab.93.2016.02.28.19.49.03; Sun, 28 Feb 2016 19:49:03 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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 linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757264AbcB2Ds4 (ORCPT + 30 others); Sun, 28 Feb 2016 22:48:56 -0500 Received: from relais.videotron.ca ([24.201.245.36]:26877 "EHLO relais.videotron.ca" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753918AbcB2DsZ (ORCPT ); Sun, 28 Feb 2016 22:48:25 -0500 Content-transfer-encoding: 7BIT Received: from yoda.home ([96.23.157.65]) by VL-VM-MR002.ip.videotron.ca (Oracle Communications Messaging Exchange Server 7u4-22.01 64bit (built Apr 21 2011)) with ESMTP id <0O3A000QSIKLMG90@VL-VM-MR002.ip.videotron.ca>; Sun, 28 Feb 2016 22:48:21 -0500 (EST) Received: from xanadu.home (xanadu.home [192.168.2.2]) by yoda.home (Postfix) with ESMTP id 195502DA01FC; Sun, 28 Feb 2016 22:48:21 -0500 (EST) From: Nicolas Pitre To: Michal Marek Cc: linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 5/8] kbuild: add fine grained build dependencies for exported symbols Date: Sun, 28 Feb 2016 22:48:08 -0500 Message-id: <1456717691-28298-6-git-send-email-nicolas.pitre@linaro.org> X-Mailer: git-send-email 2.5.0 In-reply-to: <1456717691-28298-1-git-send-email-nicolas.pitre@linaro.org> References: <1456717691-28298-1-git-send-email-nicolas.pitre@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Like with kconfig options, we now have the ability to compile in and out individual EXPORT_SYMBOL() declarations based on the content of include/generated/autoksyms.h. However we don't want the entire world to be rebuilt whenever that file is touched. Let's apply the same build dependency trick used for CONFIG_* symbols where the time stamp of empty files whose paths matching those symbols is used to trigger fine grained rebuilds. In our case the key is the symbol name passed to EXPORT_SYMBOL(). However, unlike config options, we cannot just use fixdep to parse the source code for EXPORT_SYMBOL(ksym) because several variants exist and parsing them all in a separate tool, and keeping it in synch, is not trivially maintainable. Furthermore, there are variants such as EXPORT_SYMBOL_GPL(pci_user_read_config_##size); that are instanciated via a macro for which we can't easily determine the actual exported symbol name(s) short of actually running the preprocessor on them. Storing the symbol name string in a special ELF section doesn't work for targets that output assembly or preprocessed source. So the best way is really to leverage the preprocessor by having it emit a warning for each EXPORT_SYMBOL() instance and filtering those apart from stderr by the build system. Then the list of symbols is simply fed to fixdep to be merged with the other dependencies. Because of the lowercasing performed by fixdep, there might be name collisions triggering spurious rebuilds for similar symbols. But this shouldn't be a big issue in practice. (This is the case for CONFIG_* symbols and I didn't want to be different here, whatever the original reason for doing so.) To avoid needless build overhead, the exported symbol name gathering is performed only when CONFIG_TRIM_UNUSED_KSYMS is selected. Signed-off-by: Nicolas Pitre Acked-by: Rusty Russell --- include/linux/export.h | 16 ++++++++++++++-- scripts/Kbuild.include | 28 ++++++++++++++++++++++++++++ scripts/basic/fixdep.c | 1 + 3 files changed, 43 insertions(+), 2 deletions(-) -- 2.5.0 diff --git a/include/linux/export.h b/include/linux/export.h index 77afdb2a25..794392102d 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -76,8 +76,20 @@ extern struct module __this_module; ___cond_export_sym(sym, sec, conf) #define ___cond_export_sym(sym, sec, enabled) \ __cond_export_sym_##enabled(sym, sec) -#define __cond_export_sym_1(sym, sec) ___EXPORT_SYMBOL(sym, sec) -#define __cond_export_sym_0(sym, sec) /* nothing */ +#define __cond_export_sym_1(sym, sec) \ + __KSYM_DEP(sym) ___EXPORT_SYMBOL(sym, sec) +#define __cond_export_sym_0(sym, sec) \ + __KSYM_DEP(sym) /* nothing */ + +/* + * For fine grained build dependencies, we want to tell the build system + * about each possible exported symbol even if they're not actually exported. + * This is accomplished with a preprocessor warning that gets captured by + * the make rule (see ksym_dep_filter in scripts/Kbuild.include). + */ +#define __KSYM_DEP(sym) __pragma_string( KBUILD_AUTOKSYM_DEP: sym ) +#define __pragma_string(x) __emit_pragma( GCC warning #x ) +#define __emit_pragma(x) _Pragma(#x) #else #define __EXPORT_SYMBOL ___EXPORT_SYMBOL diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 8a257fa663..0b69479310 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -258,12 +258,40 @@ if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ), \ @set -e; \ $(cmd_and_fixdep)) +ifndef CONFIG_TRIM_UNUSED_KSYMS + cmd_and_fixdep = \ $(echo-cmd) $(cmd_$(1)); \ scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\ rm -f $(depfile); \ mv -f $(dot-target).tmp $(dot-target).cmd; +else + +# Filter out exported kernel symbol names advertised as warning pragmas +# by the preprocessor and write them to $(1). We must consider continuation +# lines as well: they start with a blank, or the preceeding line ends with +# a ':'. Anything else is passed through as is. +# See also __KSYM_DEP() in include/linux/export.h. +ksym_dep_filter = sed -n \ + -e '1 {x; $$!d}' \ + -e '/^ / {H; $$!d}' \ + -e 'x; /:$$/ {x; H; $$!d; s/^/ /; x}' \ + -e ':filter; /^.*KBUILD_AUTOKSYM_DEP: /! {p; b next}' \ + -e 's//KSYM_/; s/\n.*//; w $(1)' \ + -e ':next; $$!d' \ + -e '1 q; s/^/ /; x; /^ /! b filter' + +cmd_and_fixdep = \ + $(echo-cmd) \ + $(cmd_$(1)) 2>&1 | $(call ksym_dep_filter,$(dot-target).ksym.tmp) >&2;\ + scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)' \ + < $(dot-target).ksym.tmp > $(dot-target).tmp; \ + rm -f $(dot-target).ksym.tmp $(depfile); \ + mv -f $(dot-target).tmp $(dot-target).cmd; + +endif + # Usage: $(call if_changed_rule,foo) # Will check if $(cmd_foo) or any of the prerequisites changed, # and if so will execute $(rule_foo). diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c index d984deb120..2dc6bf754a 100644 --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c @@ -354,6 +354,7 @@ static void parse_dep_file(void *map, size_t len) /* Ignore certain dependencies */ if (strrcmp(s, "include/generated/autoconf.h") && + strrcmp(s, "include/generated/autoksyms.h") && strrcmp(s, "arch/um/include/uml-config.h") && strrcmp(s, "include/linux/kconfig.h") && strrcmp(s, ".ver")) {