Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

scripts/misc-check: check missing #include <linux/export.h> when W=1

The problem was described in commit 5b20755b7780 ("init: move THIS_MODULE
from <linux/export.h> to <linux/init.h>").

To summarize it again here: <linux/export.h> is included by most C files,
even though only some of them actually export symbols. This is because
some headers, such as include/linux/{module.h,linkage}, needlessly
include <linux/export.h>.

I have added a more detailed explanation in the comments of
scripts/misc-check.

This problem will be fixed in two steps:

1. Add #include <linux/export.h> directly to C files that use
EXPORT_SYMBOL()
2. Remove #include <linux/export.h> from header files that do not use
EXPORT_SYMBOL()

This commit addresses step 1; scripts/misc-check will warn about *.[ch]
files that use EXPORT_SYMBOL() but do not include <linux/export.h>.
This check is only triggered when the kernel is built with W=1.

We need to fix 4000+ files. I hope others will help with this effort.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

+43
+43
scripts/misc-check
··· 9 9 sed 's/$/: warning: ignored by one of the .gitignore files/' >&2 10 10 } 11 11 12 + # Check for missing #include <linux/export.h> 13 + # 14 + # The rule for including <linux/export.h> is very simple: 15 + # Include <linux/export.h> only when you use EXPORT_SYMBOL(). That's it. 16 + # 17 + # However, some headers include <linux/export.h> even though they are completely 18 + # unrelated to EXPORT_SYMBOL(). 19 + # 20 + # One example is include/linux/module.h. Please note <linux/module.h> and 21 + # <linux/export.h> are orthogonal. <linux/module.h> should be included by files 22 + # that can be compiled as modules. In other words, <linux/module.h> should be 23 + # included by EXPORT_SYMBOL consumers. In contrast, <linux/export.h> should be 24 + # included from EXPORT_SYMBOL providers, which may or may not be modular. 25 + # Hence, include/linux/module.h should *not* include <linux/export.h>. 26 + # 27 + # Another example is include/linux/linkage.h, which is completely unrelated to 28 + # EXPORT_SYMBOL(). Worse, it is included by most C files, which means, most C 29 + # files end up including <linux/export.h>, even though only some of them 30 + # actually export symbols. Hence, include/linux/linkage.h should *not* include 31 + # <linux/export.h>. 32 + # 33 + # Before fixing such headers, we must ensure that C files using EXPORT_SYMBOL() 34 + # include <linux/export.h> directly, since many C files currently rely on 35 + # <linux/export.h> being included indirectly (likely, via <linux/linkage> etc.). 36 + # 37 + # Therefore, this check. 38 + # 39 + # The problem is simple - the warned files use EXPORT_SYMBOL(), but do not 40 + # include <linux/export.h>. Please add #include <linux/export.h> to them. 41 + # 42 + # If the included headers are sorted alphabetically, please insert 43 + # <linux/export.h> in the appropriate position to maintain the sort order. 44 + # For this reason, this script only checks missing <linux/export.h>, but 45 + # does not automatically fix it. 46 + check_missing_include_linux_export_h () { 47 + 48 + git -C "${srctree:-.}" grep --files-with-matches -E 'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' \ 49 + -- '*.[ch]' :^tools/ :^include/linux/export.h | 50 + xargs -r git -C "${srctree:-.}" grep --files-without-match '#include[[:space:]]*<linux/export\.h>' | 51 + xargs -r printf "%s: warning: EXPORT_SYMBOL() is used, but #include <linux/export.h> is missing\n" >&2 52 + } 53 + 12 54 check_tracked_ignored_files 55 + check_missing_include_linux_export_h