Skip to content

Commit a934a57

Browse files
committed
scripts/misc-check: check missing #include <linux/export.h> when W=1
The problem was described in commit 5b20755 ("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 <[email protected]>
1 parent 3a44052 commit a934a57

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

scripts/misc-check

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,47 @@ check_tracked_ignored_files () {
99
sed 's/$/: warning: ignored by one of the .gitignore files/' >&2
1010
}
1111

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+
1254
check_tracked_ignored_files
55+
check_missing_include_linux_export_h

0 commit comments

Comments
 (0)