Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1356852 > unrolled thread

[PATCH v6 0/8]/[PULL REQUEST] Trim unused exported kernel symbols

Started byNicolas Pitre <nicolas.pitre@linaro.org>
First post2016-03-14 03:50 +0100
Last post2016-03-16 16:10 +0100
Articles 7 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v6 0/8]/[PULL REQUEST] Trim unused exported kernel symbols Nicolas Pitre <nicolas.pitre@linaro.org> - 2016-03-14 03:50 +0100
    [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols Nicolas Pitre <nicolas.pitre@linaro.org> - 2016-03-14 03:50 +0100
      Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for  exported symbols Michal Marek <mmarek@suse.cz> - 2016-03-15 21:40 +0100
      Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for  exported symbols Michal Marek <mmarek@suse.com> - 2016-03-15 21:40 +0100
        Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for  exported symbols Nicolas Pitre <nicolas.pitre@linaro.org> - 2016-03-16 00:20 +0100
          Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for  exported symbols Michal Marek <mmarek@suse.com> - 2016-03-16 13:30 +0100
            Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for  exported symbols Nicolas Pitre <nicolas.pitre@linaro.org> - 2016-03-16 16:10 +0100

#1356852 — [PATCH v6 0/8]/[PULL REQUEST] Trim unused exported kernel symbols

FromNicolas Pitre <nicolas.pitre@linaro.org>
Date2016-03-14 03:50 +0100
Subject[PATCH v6 0/8]/[PULL REQUEST] Trim unused exported kernel symbols
Message-ID<rcqJX-5Z8-7@gated-at.bofh.it>
This patch series provides the option to omit exported symbols from
the kernel and modules that are never referenced by any of the selected
modules in the current kernel configuration. this allows for optimizing
the compiled code and reducing final binaries' size. When using LTO the
binary size reduction is even more effective. It could also be argued
that this could bring some security advantages.

The original cover letter with lots of test results can be found here:

	https://lkml.org/lkml/2016/2/8/813

Please consider for merging into your tree. Alternately, the following
branch can be pulled:

	http://git.linaro.org/people/nicolas.pitre/linux.git autoksyms

Thanks.

Changes from v5:

- Disable automatic dependency file generation during the preprocessor
  pass when gathering exported symbol names.  Not only it is redundant
  but in some conditions this crashes fixdep that might be reading the
  previous dependency file at the same time. Reported by Michal Marek.

- Redirect error messages to stderr rather than pass it as a symbol name
  dependency.

Changes from v4:

- Correctness changes plus small cleanup to adjust_autoksyms.sh as
  suggested by Michal Marek.

- Changed ksym build dependency generation by re-running the preprocessor
  rather than collecting those dependencies as warnings through stderr
  which was too fragile.

Changes from v3:

- Shell portability changes to adjust_autoksyms.sh, partly from
  suggestions by Zev Weiss.

- Fix sample modules by building them before adjust_autoksyms.sh is run.

Changes from v2:

- Generating the build dependencies by parsing the source with fixdep
  turned out to be unreliable due to all the EXPORT_SYMBOL() variants,
  and especially their use within macros where the actual symbol name
  is known only after running the preprocessor. This list of symbol names
  is now obtained from the preprocessor directly, fixing allmodconfig
  builds.

Changes from v1:

- Replaced "exp" that doesn't convey the right meaning as noted by
  Sam Ravnborg. The "ksym" identifier is actually what the kernel
  already uses for this. Therefore:
  - CONFIG_TRIM_UNUSED_EXPSYMS --> CONFIG_TRIM_UNUSED_KSYMS
  - include/generated/expsyms.h --> include/generated/autoksyms.h
  - #define __EXPSYM_* --> #define __KSYM_*

- Some sed regexp improvements as suggested by Al Viro.

- Renamed vmlinux_recursive target to autoksyms_recursive.

- Accept EXPORT_SYMBOL variants with a prefix, e.g. ACPI_EXPORT_SYMBOL.

- Minor commit log clarifications.

- Added Rusty's ACK.

diffstat:

 Makefile                    |  23 ++++++--
 include/linux/export.h      |  33 +++++++++++-
 init/Kconfig                |  16 ++++++
 scripts/Kbuild.include      |  32 +++++++++++-
 scripts/Makefile.build      |  22 ++++----
 scripts/adjust_autoksyms.sh | 101 ++++++++++++++++++++++++++++++++++++
 scripts/basic/fixdep.c      |  61 ++++++++++++++++------
 7 files changed, 258 insertions(+), 30 deletions(-)

[toc] | [next] | [standalone]


#1356853 — [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols

FromNicolas Pitre <nicolas.pitre@linaro.org>
Date2016-03-14 03:50 +0100
Subject[PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols
Message-ID<rcqJY-5Z8-23@gated-at.bofh.it>
In reply to#1356852
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
output actual symbol names anchored by a special sequence that can be
easily filtered out. Then the list of symbols is simply fed to fixdep
to be merged with the other dependencies.

That implies the preprocessor is executed twice for each source file.
A previous attempt relied on a warning pragma for each EXPORT_SYMBOL()
instance that was filtered apart from stderr by the build system with
a sed script during the actual compilation pass. Unfortunately the
preprocessor/compiler diagnostic output isn't stable between versions
and this solution, although more efficient, was deemed too fragile.

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 <nico@linaro.org>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
---
 include/linux/export.h | 13 ++++++++++++-
 scripts/Kbuild.include | 27 +++++++++++++++++++++++++++
 scripts/basic/fixdep.c |  1 +
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/include/linux/export.h b/include/linux/export.h
index 77afdb2a25..2f9ccbe6a6 100644
--- a/include/linux/export.h
+++ b/include/linux/export.h
@@ -65,7 +65,18 @@ extern struct module __this_module;
 	__attribute__((section("___ksymtab" sec "+" #sym), unused))	\
 	= { (unsigned long)&sym, __kstrtab_##sym }
 
-#ifdef CONFIG_TRIM_UNUSED_KSYMS
+#if defined(__KSYM_DEPS__)
+
+/*
+ * For fine grained build dependencies, we want to tell the build system
+ * about each possible exported symbol even if they're not actually exported.
+ * We use a string pattern that is unlikely to be valid code that the build
+ * system filters out from the preprocessor output (see ksym_dep_filter
+ * in scripts/Kbuild.include).
+ */
+#define __EXPORT_SYMBOL(sym, sec)	=== __KSYM_##sym ===
+
+#elif defined(CONFIG_TRIM_UNUSED_KSYMS)
 
 #include <linux/kconfig.h>
 #include <generated/autoksyms.h>
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 8a257fa663..2c14a27e39 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -258,12 +258,39 @@ 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 from the preprocessor output.
+# See also __KSYM_DEPS__ in include/linux/export.h.
+# We disable the depfile generation here, so as not to overwrite the existing
+# depfile while fixdep is parsing it
+flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
+ksym_dep_filter =                                                            \
+	case "$(1)" in                                                       \
+	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
+	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
+	cpp_lds_S) : ;;                                                      \
+	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
+	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
+
+cmd_and_fixdep =                                                             \
+	$(echo-cmd) $(cmd_$(1));                                             \
+	$(ksym_dep_filter) |                                                 \
+		scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)'          \
+			> $(dot-target).tmp;	                             \
+	rm -f $(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")) {
-- 
2.5.0

[toc] | [prev] | [next] | [standalone]


#1358228 — Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols

FromMichal Marek <mmarek@suse.cz>
Date2016-03-15 21:40 +0100
SubjectRe: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols
Message-ID<rd3UZ-7gd-1@gated-at.bofh.it>
In reply to#1356853
Dne 15.3.2016 v 21:33 Michal Marek napsal(a):
> Dne 14.3.2016 v 03:42 Nicolas Pitre napsal(a):
>> +# Filter out exported kernel symbol names from the preprocessor output.
>> +# See also __KSYM_DEPS__ in include/linux/export.h.
>> +# We disable the depfile generation here, so as not to overwrite the existing
>> +# depfile while fixdep is parsing it
>> +flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
>> +ksym_dep_filter =                                                            \
>> +	case "$(1)" in                                                       \
>> +	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
>> +	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
>> +	cpp_lds_S) : ;;                                                      \
>> +	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
>> +	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
>> +
>> +cmd_and_fixdep =                                                             \
>> +	$(echo-cmd) $(cmd_$(1));                                             \
>> +	$(ksym_dep_filter) |                                                 \
>> +		scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)'          \
>> +			> $(dot-target).tmp;	                             \
>> +	rm -f $(depfile);                                                    \
>> +	mv -f $(dot-target).tmp $(dot-target).cmd;
>> +
>> +endif
> 
> Not sure what happened this time, but I got
> 
> drivers/md/.dm-round-robin.mod.o.cmd:5: *** unterminated call to
> function 'wildcard': missing ')'.  Stop.

Forgot to add: This was an allmodconfig build without
CONFIG_TRIM_UNUSED_SYMS.

Michal

[toc] | [prev] | [next] | [standalone]


#1358229 — Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols

FromMichal Marek <mmarek@suse.com>
Date2016-03-15 21:40 +0100
SubjectRe: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols
Message-ID<rd3UZ-7gd-3@gated-at.bofh.it>
In reply to#1356853
Dne 14.3.2016 v 03:42 Nicolas Pitre napsal(a):
> +# Filter out exported kernel symbol names from the preprocessor output.
> +# See also __KSYM_DEPS__ in include/linux/export.h.
> +# We disable the depfile generation here, so as not to overwrite the existing
> +# depfile while fixdep is parsing it
> +flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
> +ksym_dep_filter =                                                            \
> +	case "$(1)" in                                                       \
> +	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
> +	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
> +	cpp_lds_S) : ;;                                                      \
> +	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
> +	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
> +
> +cmd_and_fixdep =                                                             \
> +	$(echo-cmd) $(cmd_$(1));                                             \
> +	$(ksym_dep_filter) |                                                 \
> +		scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)'          \
> +			> $(dot-target).tmp;	                             \
> +	rm -f $(depfile);                                                    \
> +	mv -f $(dot-target).tmp $(dot-target).cmd;
> +
> +endif

Not sure what happened this time, but I got

drivers/md/.dm-round-robin.mod.o.cmd:5: *** unterminated call to
function 'wildcard': missing ')'.  Stop.

The depfile is indeed corrupt (truncated):
tail drivers/md/.dm-round-robin.mod.o.cmd
  arch/x86/include/asm/disabled-features.h \
    $(wildcard include/config/x86/intel/mpx.h) \
  arch/x86/include/asm/rmwcc.h \
  arch/x86/include/asm/barrier.h \
    $(wildcard include/config/x86/ppro/fence.h) \
  arch/x86/include/asm/nops.h \
    $(wildcard include/config/mk7.h) \
  include/asm-generic/barrier.h \
  include/asm-generic/bitops/find.h \
    $(wildcard include/config/generic/

The file is exactly 8kB long:
$ ls -l drivers/md/.dm-round-robin.mod.o.cmd
-rw-r--r-- 1 mmarek users 8192 Mar  8 13:33
drivers/md/.dm-round-robin.mod.o.cmd

Michal

[toc] | [prev] | [next] | [standalone]


#1358327 — Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols

FromNicolas Pitre <nicolas.pitre@linaro.org>
Date2016-03-16 00:20 +0100
SubjectRe: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols
Message-ID<rd6pQ-vW-13@gated-at.bofh.it>
In reply to#1358229
On Tue, 15 Mar 2016, Michal Marek wrote:

> Dne 14.3.2016 v 03:42 Nicolas Pitre napsal(a):
> > +# Filter out exported kernel symbol names from the preprocessor output.
> > +# See also __KSYM_DEPS__ in include/linux/export.h.
> > +# We disable the depfile generation here, so as not to overwrite the existing
> > +# depfile while fixdep is parsing it
> > +flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
> > +ksym_dep_filter =                                                            \
> > +	case "$(1)" in                                                       \
> > +	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
> > +	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
> > +	cpp_lds_S) : ;;                                                      \
> > +	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
> > +	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
> > +
> > +cmd_and_fixdep =                                                             \
> > +	$(echo-cmd) $(cmd_$(1));                                             \
> > +	$(ksym_dep_filter) |                                                 \
> > +		scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)'          \
> > +			> $(dot-target).tmp;	                             \
> > +	rm -f $(depfile);                                                    \
> > +	mv -f $(dot-target).tmp $(dot-target).cmd;
> > +
> > +endif
> 
> Not sure what happened this time, but I got
> 
> drivers/md/.dm-round-robin.mod.o.cmd:5: *** unterminated call to
> function 'wildcard': missing ')'.  Stop.
> 
> The depfile is indeed corrupt (truncated):
> tail drivers/md/.dm-round-robin.mod.o.cmd
>   arch/x86/include/asm/disabled-features.h \
>     $(wildcard include/config/x86/intel/mpx.h) \
>   arch/x86/include/asm/rmwcc.h \
>   arch/x86/include/asm/barrier.h \
>     $(wildcard include/config/x86/ppro/fence.h) \
>   arch/x86/include/asm/nops.h \
>     $(wildcard include/config/mk7.h) \
>   include/asm-generic/barrier.h \
>   include/asm-generic/bitops/find.h \
>     $(wildcard include/config/generic/
> 
> The file is exactly 8kB long:
> $ ls -l drivers/md/.dm-round-robin.mod.o.cmd
> -rw-r--r-- 1 mmarek users 8192 Mar  8 13:33
> drivers/md/.dm-round-robin.mod.o.cmd

[...]

> Forgot to add: This was an allmodconfig build without
> CONFIG_TRIM_UNUSED_SYMS.

If CONFIG_TRIM_UNUSED_SYMS is actually not selected, then I really don't 
see how my changes can be involved in this failure.

And I cannot reproduce here so far. I didn't receive anything from 
kbuild test robot since February 15 either. Is this something that you 
are able to reproduce on your side?

If so, do you get suspicious output on stderr during the build?  Maybe 
fixdep exits prematurelywith "fixdep: bad data on stdin"?  However, that 
cannot happen if CONFIG_TRIM_UNUSED_SYMS=n.

Did you test my git branch, or did you apply the posted patches to your 
tree?  If the later, could you publish a branch for it so I could test 
the same tree as you do?


Nicolas

[toc] | [prev] | [next] | [standalone]


#1358948 — Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols

FromMichal Marek <mmarek@suse.com>
Date2016-03-16 13:30 +0100
SubjectRe: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols
Message-ID<rdiKm-rP-11@gated-at.bofh.it>
In reply to#1358327
On 2016-03-16 00:14, Nicolas Pitre wrote:
> On Tue, 15 Mar 2016, Michal Marek wrote:
> 
>> Dne 14.3.2016 v 03:42 Nicolas Pitre napsal(a):
>>> +# Filter out exported kernel symbol names from the preprocessor output.
>>> +# See also __KSYM_DEPS__ in include/linux/export.h.
>>> +# We disable the depfile generation here, so as not to overwrite the existing
>>> +# depfile while fixdep is parsing it
>>> +flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
>>> +ksym_dep_filter =                                                            \
>>> +	case "$(1)" in                                                       \
>>> +	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
>>> +	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
>>> +	cpp_lds_S) : ;;                                                      \
>>> +	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
>>> +	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
>>> +
>>> +cmd_and_fixdep =                                                             \
>>> +	$(echo-cmd) $(cmd_$(1));                                             \
>>> +	$(ksym_dep_filter) |                                                 \
>>> +		scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)'          \
>>> +			> $(dot-target).tmp;	                             \
>>> +	rm -f $(depfile);                                                    \
>>> +	mv -f $(dot-target).tmp $(dot-target).cmd;
>>> +
>>> +endif
>>
>> Not sure what happened this time, but I got
>>
>> drivers/md/.dm-round-robin.mod.o.cmd:5: *** unterminated call to
>> function 'wildcard': missing ')'.  Stop.
>>
>> The depfile is indeed corrupt (truncated):
>> tail drivers/md/.dm-round-robin.mod.o.cmd
>>   arch/x86/include/asm/disabled-features.h \
>>     $(wildcard include/config/x86/intel/mpx.h) \
>>   arch/x86/include/asm/rmwcc.h \
>>   arch/x86/include/asm/barrier.h \
>>     $(wildcard include/config/x86/ppro/fence.h) \
>>   arch/x86/include/asm/nops.h \
>>     $(wildcard include/config/mk7.h) \
>>   include/asm-generic/barrier.h \
>>   include/asm-generic/bitops/find.h \
>>     $(wildcard include/config/generic/
>>
>> The file is exactly 8kB long:
>> $ ls -l drivers/md/.dm-round-robin.mod.o.cmd
>> -rw-r--r-- 1 mmarek users 8192 Mar  8 13:33
>> drivers/md/.dm-round-robin.mod.o.cmd
> 
> [...]
> 
>> Forgot to add: This was an allmodconfig build without
>> CONFIG_TRIM_UNUSED_SYMS.
> 
> If CONFIG_TRIM_UNUSED_SYMS is actually not selected, then I really don't 
> see how my changes can be involved in this failure.

I have no idea either.


> And I cannot reproduce here so far. I didn't receive anything from 
> kbuild test robot since February 15 either. Is this something that you 
> are able to reproduce on your side?

I started a build loop now.


> If so, do you get suspicious output on stderr during the build?  Maybe 
> fixdep exits prematurelywith "fixdep: bad data on stdin"?  However, that 
> cannot happen if CONFIG_TRIM_UNUSED_SYMS=n.
> 
> Did you test my git branch, or did you apply the posted patches to your 
> tree?  If the later, could you publish a branch for it so I could test 
> the same tree as you do?

I applied the patches to my -rc1 based kbuild branch and yes, there was
a conflict with 2aedcd098a94 ("kbuild: suppress annoying "... is up to
date." message"). So it's possible that I screwed it up. I pushed the
branch to

git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git
tmp.autoksyms6

Michal

[toc] | [prev] | [next] | [standalone]


#1359071 — Re: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols

FromNicolas Pitre <nicolas.pitre@linaro.org>
Date2016-03-16 16:10 +0100
SubjectRe: [PATCH v6 5/8] kbuild: add fine grained build dependencies for exported symbols
Message-ID<rdlfc-2aF-23@gated-at.bofh.it>
In reply to#1358948
On Wed, 16 Mar 2016, Michal Marek wrote:

> On 2016-03-16 00:14, Nicolas Pitre wrote:
> > On Tue, 15 Mar 2016, Michal Marek wrote:
> > 
> >> Dne 14.3.2016 v 03:42 Nicolas Pitre napsal(a):
> >>> +# Filter out exported kernel symbol names from the preprocessor output.
> >>> +# See also __KSYM_DEPS__ in include/linux/export.h.
> >>> +# We disable the depfile generation here, so as not to overwrite the existing
> >>> +# depfile while fixdep is parsing it
> >>> +flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
> >>> +ksym_dep_filter =                                                            \
> >>> +	case "$(1)" in                                                       \
> >>> +	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
> >>> +	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
> >>> +	cpp_lds_S) : ;;                                                      \
> >>> +	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
> >>> +	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
> >>> +
> >>> +cmd_and_fixdep =                                                             \
> >>> +	$(echo-cmd) $(cmd_$(1));                                             \
> >>> +	$(ksym_dep_filter) |                                                 \
> >>> +		scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)'          \
> >>> +			> $(dot-target).tmp;	                             \
> >>> +	rm -f $(depfile);                                                    \
> >>> +	mv -f $(dot-target).tmp $(dot-target).cmd;
> >>> +
> >>> +endif
> >>
> >> Not sure what happened this time, but I got
> >>
> >> drivers/md/.dm-round-robin.mod.o.cmd:5: *** unterminated call to
> >> function 'wildcard': missing ')'.  Stop.
> >>
> >> The depfile is indeed corrupt (truncated):
> >> tail drivers/md/.dm-round-robin.mod.o.cmd
> >>   arch/x86/include/asm/disabled-features.h \
> >>     $(wildcard include/config/x86/intel/mpx.h) \
> >>   arch/x86/include/asm/rmwcc.h \
> >>   arch/x86/include/asm/barrier.h \
> >>     $(wildcard include/config/x86/ppro/fence.h) \
> >>   arch/x86/include/asm/nops.h \
> >>     $(wildcard include/config/mk7.h) \
> >>   include/asm-generic/barrier.h \
> >>   include/asm-generic/bitops/find.h \
> >>     $(wildcard include/config/generic/
> >>
> >> The file is exactly 8kB long:
> >> $ ls -l drivers/md/.dm-round-robin.mod.o.cmd
> >> -rw-r--r-- 1 mmarek users 8192 Mar  8 13:33
> >> drivers/md/.dm-round-robin.mod.o.cmd
> > 
> > [...]
> > 
> >> Forgot to add: This was an allmodconfig build without
> >> CONFIG_TRIM_UNUSED_SYMS.
> > 
> > If CONFIG_TRIM_UNUSED_SYMS is actually not selected, then I really don't 
> > see how my changes can be involved in this failure.
> 
> I have no idea either.
> 
> 
> > And I cannot reproduce here so far. I didn't receive anything from 
> > kbuild test robot since February 15 either. Is this something that you 
> > are able to reproduce on your side?
> 
> I started a build loop now.
> 
> 
> > If so, do you get suspicious output on stderr during the build?  Maybe 
> > fixdep exits prematurelywith "fixdep: bad data on stdin"?  However, that 
> > cannot happen if CONFIG_TRIM_UNUSED_SYMS=n.
> > 
> > Did you test my git branch, or did you apply the posted patches to your 
> > tree?  If the later, could you publish a branch for it so I could test 
> > the same tree as you do?
> 
> I applied the patches to my -rc1 based kbuild branch and yes, there was
> a conflict with 2aedcd098a94 ("kbuild: suppress annoying "... is up to
> date." message"). So it's possible that I screwed it up. I pushed the
> branch to
> 
> git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git
> tmp.autoksyms6

As far as I can see, the conflict resolution is correct.

Testing your branch now. No failure so far.

I did notice spurious error messages after cleaning my build tree.  
They're unrelated to your failure case though. Regardless, here's a 
patch to silence them.

----- >8
From: Nicolas Pitre <nicolas.pitre@linaro.org>
Subject: kbuild: don't complain about existing if_changed_dep targets

There are more if_changed_dep cases for which we know there is no
ksyms to parse. Add them to the list.

Also add a full stop to the comment.

Signed-off-by: Nicolas Pitre <nico@linaro.org>

diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index f8631a935e..a09927e027 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -271,13 +271,13 @@ else
 # Filter out exported kernel symbol names from the preprocessor output.
 # See also __KSYM_DEPS__ in include/linux/export.h.
 # We disable the depfile generation here, so as not to overwrite the existing
-# depfile while fixdep is parsing it
+# depfile while fixdep is parsing it.
 flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1)))
 ksym_dep_filter =                                                            \
 	case "$(1)" in                                                       \
 	cc_*_c) $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;    \
 	as_*_S) $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;    \
-	cpp_lds_S) : ;;                                                      \
+	boot*|build*|*cpp_lds_S|dtc|host*|vdso*) : ;;                        \
 	*) echo "Don't know how to preprocess $(1)" >&2; false ;;            \
 	esac | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p'
 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web