Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild

Pull non-critical part of kbuild from Michal Marek:
 - New semantic patches, make coccicheck M= fix
 - make gtags speedup
 - make tags/TAGS always removes struct forward declarations
 - make deb-pkg fixes (some patches are still pending, I know)
 - scripts/patch-kernel fix from the last user of this script ;)

* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  scripts/patch-kernel: digest kernel.org hosted .xz patches
  scripts/coccinelle/api/ptr_ret.cocci: semantic patch for ptr_err
  scripts: refactor remove structure forward declarations
  kbuild: incremental tags update for GNU Global
  coccinelle: semantic patch for bool issues
  coccinelle: semantic patch to check for PTR_ERR after reassignment
  coccinelle: semantic patch converting 0 test to null test
  coccinelle: semantic patch for missing iounmap
  coccinelle: semantic patch for missing clk_put
  kbuild: Fix out-of-tree build for 'make deb-pkg'
  kbuild: Only build linux-image package for UML
  kbuild: Fix link to headers in 'make deb-pkg'
  coccicheck: change handling of C={1,2} when M= is set
This commit is contained in:
Linus Torvalds 2012-03-30 18:14:05 -07:00
commit a7697b945e
9 changed files with 687 additions and 10 deletions

View File

@ -0,0 +1,70 @@
///
/// Use PTR_RET rather than if(IS_ERR(...)) + PTR_ERR
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Options: -no_includes -include_headers
//
// Keywords: ERR_PTR, PTR_ERR, PTR_RET
// Version min: 2.6.39
//
virtual context
virtual patch
virtual org
virtual report
@depends on patch@
expression ptr;
@@
- if (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0;
+ return PTR_RET(ptr);
@depends on patch@
expression ptr;
@@
- if (IS_ERR(ptr)) return PTR_ERR(ptr); return 0;
+ return PTR_RET(ptr);
@r1 depends on !patch@
expression ptr;
position p1;
@@
* if@p1 (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0;
@r2 depends on !patch@
expression ptr;
position p2;
@@
* if@p2 (IS_ERR(ptr)) return PTR_ERR(ptr); return 0;
@script:python depends on org@
p << r1.p1;
@@
coccilib.org.print_todo(p[0], "WARNING: PTR_RET can be used")
@script:python depends on org@
p << r2.p2;
@@
coccilib.org.print_todo(p[0], "WARNING: PTR_RET can be used")
@script:python depends on report@
p << r1.p1;
@@
coccilib.report.print_report(p[0], "WARNING: PTR_RET can be used")
@script:python depends on report@
p << r2.p2;
@@
coccilib.report.print_report(p[0], "WARNING: PTR_RET can be used")

View File

@ -0,0 +1,67 @@
/// Find missing clk_puts.
///
//# This only signals a missing clk_put when there is a clk_put later
//# in the same function.
//# False positives can be due to loops.
//
// Confidence: Moderate
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options:
virtual context
virtual org
virtual report
@clk@
expression e;
statement S,S1;
int ret;
position p1,p2,p3;
@@
e = clk_get@p1(...)
... when != clk_put(e)
if (<+...e...+>) S
... when any
when != clk_put(e)
when != if (...) { ... clk_put(e); ... }
(
if (ret == 0) S1
|
if (...)
{ ...
return 0; }
|
if (...)
{ ...
return <+...e...+>; }
|
*if@p2 (...)
{ ... when != clk_put(e)
when forall
return@p3 ...; }
)
... when any
clk_put(e);
@script:python depends on org@
p1 << clk.p1;
p2 << clk.p2;
p3 << clk.p3;
@@
cocci.print_main("clk_get",p1)
cocci.print_secs("if",p2)
cocci.print_secs("needed clk_put",p3)
@script:python depends on report@
p1 << clk.p1;
p2 << clk.p2;
p3 << clk.p3;
@@
msg = "ERROR: missing clk_put; clk_get on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line)
coccilib.report.print_report(p3[0],msg)

View File

@ -0,0 +1,67 @@
/// Find missing iounmaps.
///
//# This only signals a missing iounmap when there is an iounmap later
//# in the same function.
//# False positives can be due to loops.
//
// Confidence: Moderate
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options:
virtual context
virtual org
virtual report
@iom@
expression e;
statement S,S1;
int ret;
position p1,p2,p3;
@@
e = \(ioremap@p1\|ioremap_nocache@p1\)(...)
... when != iounmap(e)
if (<+...e...+>) S
... when any
when != iounmap(e)
when != if (...) { ... iounmap(e); ... }
(
if (ret == 0) S1
|
if (...)
{ ...
return 0; }
|
if (...)
{ ...
return <+...e...+>; }
|
*if@p2 (...)
{ ... when != iounmap(e)
when forall
return@p3 ...; }
)
... when any
iounmap(e);
@script:python depends on org@
p1 << iom.p1;
p2 << iom.p2;
p3 << iom.p3;
@@
cocci.print_main("ioremap",p1)
cocci.print_secs("if",p2)
cocci.print_secs("needed iounmap",p3)
@script:python depends on report@
p1 << iom.p1;
p2 << iom.p2;
p3 << iom.p3;
@@
msg = "ERROR: missing iounmap; ioremap on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line)
coccilib.report.print_report(p3[0],msg)

View File

@ -0,0 +1,178 @@
/// Bool initializations should use true and false. Bool tests don't need
/// comparisons. Based on contributions from Joe Perches, Rusty Russell
/// and Bruce W Allan.
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Options: -include_headers
virtual patch
virtual context
virtual org
virtual report
@depends on patch@
bool t;
symbol true;
symbol false;
@@
(
- t == true
+ t
|
- true == t
+ t
|
- t != true
+ !t
|
- true != t
+ !t
|
- t == false
+ !t
|
- false == t
+ !t
|
- t != false
+ t
|
- false != t
+ t
)
@depends on patch disable is_zero, isnt_zero@
bool t;
@@
(
- t == 1
+ t
|
- t != 1
+ !t
|
- t == 0
+ !t
|
- t != 0
+ t
)
@depends on patch@
bool b;
@@
(
b =
- 0
+ false
|
b =
- 1
+ true
)
// ---------------------------------------------------------------------
@r1 depends on !patch@
bool t;
position p;
@@
(
* t@p == true
|
* true == t@p
|
* t@p != true
|
* true != t@p
|
* t@p == false
|
* false == t@p
|
* t@p != false
|
* false != t@p
)
@r2 depends on !patch disable is_zero, isnt_zero@
bool t;
position p;
@@
(
* t@p == 1
|
* t@p != 1
|
* t@p == 0
|
* t@p != 0
)
@r3 depends on !patch@
bool b;
position p1,p2;
constant c;
@@
(
*b@p1 = 0
|
*b@p1 = 1
|
*b@p2 = c
)
@script:python depends on org@
p << r1.p;
@@
cocci.print_main("WARNING: Comparison to bool",p)
@script:python depends on org@
p << r2.p;
@@
cocci.print_main("WARNING: Comparison of bool to 0/1",p)
@script:python depends on org@
p1 << r3.p1;
@@
cocci.print_main("WARNING: Assignment of bool to 0/1",p1)
@script:python depends on org@
p2 << r3.p2;
@@
cocci.print_main("ERROR: Assignment of bool to non-0/1 constant",p2)
@script:python depends on report@
p << r1.p;
@@
coccilib.report.print_report(p[0],"WARNING: Comparison to bool")
@script:python depends on report@
p << r2.p;
@@
coccilib.report.print_report(p[0],"WARNING: Comparison of bool to 0/1")
@script:python depends on report@
p1 << r3.p1;
@@
coccilib.report.print_report(p1[0],"WARNING: Assignment of bool to 0/1")
@script:python depends on report@
p2 << r3.p2;
@@
coccilib.report.print_report(p2[0],"ERROR: Assignment of bool to non-0/1 constant")

View File

@ -0,0 +1,41 @@
/// PTR_ERR should be applied before its argument is reassigned, typically
/// to NULL
///
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers
virtual org
virtual report
virtual context
@r exists@
expression e,e1;
constant c;
position p1,p2;
@@
*e@p1 = c
... when != e = e1
when != &e
when != true IS_ERR(e)
*PTR_ERR@p2(e)
@script:python depends on org@
p1 << r.p1;
p2 << r.p2;
@@
cocci.print_main("PTR_ERR",p2)
cocci.print_secs("assignment",p1)
@script:python depends on report@
p1 << r.p1;
p2 << r.p2;
@@
msg = "ERROR: PTR_ERR applied after initialization to constant on line %s" % (p1[0].line)
coccilib.report.print_report(p2[0],msg)

View File

@ -0,0 +1,237 @@
/// Compare pointer-typed values to NULL rather than 0
///
//# This makes an effort to choose between !x and x == NULL. !x is used
//# if it has previously been used with the function used to initialize x.
//# This relies on type information. More type information can be obtained
//# using the option -all_includes and the option -I to specify an
//# include path.
//
// Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options:
virtual patch
virtual context
virtual org
virtual report
@initialize:ocaml@
let negtable = Hashtbl.create 101
@depends on patch@
expression *E;
identifier f;
@@
(
(E = f(...)) ==
- 0
+ NULL
|
(E = f(...)) !=
- 0
+ NULL
|
- 0
+ NULL
== (E = f(...))
|
- 0
+ NULL
!= (E = f(...))
)
@t1 depends on !patch@
expression *E;
identifier f;
position p;
@@
(
(E = f(...)) ==
* 0@p
|
(E = f(...)) !=
* 0@p
|
* 0@p
== (E = f(...))
|
* 0@p
!= (E = f(...))
)
@script:python depends on org@
p << t1.p;
@@
coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
@script:python depends on report@
p << t1.p;
@@
coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
// Tests of returned values
@s@
identifier f;
expression E,E1;
@@
E = f(...)
... when != E = E1
!E
@script:ocaml depends on s@
f << s.f;
@@
try let _ = Hashtbl.find negtable f in ()
with Not_found -> Hashtbl.add negtable f ()
@ r disable is_zero,isnt_zero exists @
expression *E;
identifier f;
@@
E = f(...)
...
(E == 0
|E != 0
|0 == E
|0 != E
)
@script:ocaml@
f << r.f;
@@
try let _ = Hashtbl.find negtable f in ()
with Not_found -> include_match false
// This rule may lead to inconsistent path problems, if E is defined in two
// places
@ depends on patch disable is_zero,isnt_zero @
expression *E;
expression E1;
identifier r.f;
@@
E = f(...)
<...
(
- E == 0
+ !E
|
- E != 0
+ E
|
- 0 == E
+ !E
|
- 0 != E
+ E
)
...>
?E = E1
@t2 depends on !patch disable is_zero,isnt_zero @
expression *E;
expression E1;
identifier r.f;
position p1;
position p2;
@@
E = f(...)
<...
(
* E == 0@p1
|
* E != 0@p2
|
* 0@p1 == E
|
* 0@p1 != E
)
...>
?E = E1
@script:python depends on org@
p << t2.p1;
@@
coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
@script:python depends on org@
p << t2.p2;
@@
coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
@script:python depends on report@
p << t2.p1;
@@
coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
@script:python depends on report@
p << t2.p2;
@@
coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
@ depends on patch disable is_zero,isnt_zero @
expression *E;
@@
(
E ==
- 0
+ NULL
|
E !=
- 0
+ NULL
|
- 0
+ NULL
== E
|
- 0
+ NULL
!= E
)
@ t3 depends on !patch disable is_zero,isnt_zero @
expression *E;
position p;
@@
(
* E == 0@p
|
* E != 0@p
|
* 0@p == E
|
* 0@p != E
)
@script:python depends on org@
p << t3.p;
@@
coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
@script:python depends on report@
p << t3.p;
@@
coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")

View File

@ -97,6 +97,7 @@ mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
mkdir -m 755 -p "$kernel_headers_dir/DEBIAN" mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
mkdir -p "$kernel_headers_dir/lib/modules/$version/"
if [ "$ARCH" = "um" ] ; then if [ "$ARCH" = "um" ] ; then
mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
fi fi
@ -120,15 +121,19 @@ else
fi fi
if grep -q '^CONFIG_MODULES=y' .config ; then if grep -q '^CONFIG_MODULES=y' .config ; then
INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
rm -f "$tmpdir/lib/modules/$version/build"
rm -f "$tmpdir/lib/modules/$version/source"
if [ "$ARCH" = "um" ] ; then if [ "$ARCH" = "um" ] ; then
mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
rmdir "$tmpdir/lib/modules/$version" rmdir "$tmpdir/lib/modules/$version"
fi fi
fi fi
make headers_check if [ "$ARCH" != "um" ]; then
make headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" $MAKE headers_check KBUILD_SRC=
$MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
fi
# Install the maintainer scripts # Install the maintainer scripts
# Note: hook scripts under /etc/kernel are also executed by official Debian # Note: hook scripts under /etc/kernel are also executed by official Debian
@ -245,6 +250,7 @@ destdir=$kernel_headers_dir/usr/src/linux-headers-$version
mkdir -p "$destdir" mkdir -p "$destdir"
(cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -) (cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -)
(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
arch=$(dpkg --print-architecture) arch=$(dpkg --print-architecture)
@ -259,8 +265,6 @@ Description: Linux kernel headers for $KERNELRELEASE on $arch
This is useful for people who need to build external modules This is useful for people who need to build external modules
EOF EOF
create_package "$kernel_headers_packagename" "$kernel_headers_dir"
# Do we have firmware? Move it out of the way and build it into a package. # Do we have firmware? Move it out of the way and build it into a package.
if [ -e "$tmpdir/lib/firmware" ]; then if [ -e "$tmpdir/lib/firmware" ]; then
mv "$tmpdir/lib/firmware" "$fwdir/lib/" mv "$tmpdir/lib/firmware" "$fwdir/lib/"
@ -287,7 +291,11 @@ Description: Linux support headers for userspace development
are used by the installed headers for GNU glibc and other system libraries. are used by the installed headers for GNU glibc and other system libraries.
EOF EOF
create_package "$libc_headers_packagename" "$libc_headers_dir" if [ "$ARCH" != "um" ]; then
create_package "$kernel_headers_packagename" "$kernel_headers_dir"
create_package "$libc_headers_packagename" "$libc_headers_dir"
fi
create_package "$packagename" "$tmpdir" create_package "$packagename" "$tmpdir"
exit 0 exit 0

View File

@ -116,6 +116,10 @@ findFile () {
ext=".bz2" ext=".bz2"
name="bzip2" name="bzip2"
uncomp="bunzip2 -dc" uncomp="bunzip2 -dc"
elif [ -r ${filebase}.xz ]; then
ext=".xz"
name="xz"
uncomp="xz -dc"
elif [ -r ${filebase}.zip ]; then elif [ -r ${filebase}.zip ]; then
ext=".zip" ext=".zip"
name="zip" name="zip"

View File

@ -116,7 +116,7 @@ docscope()
dogtags() dogtags()
{ {
all_sources | gtags -f - all_sources | gtags -i -f -
} }
exuberant() exuberant()
@ -166,9 +166,6 @@ exuberant()
all_defconfigs | xargs -r $1 -a \ all_defconfigs | xargs -r $1 -a \
--langdef=dotconfig --language-force=dotconfig \ --langdef=dotconfig --language-force=dotconfig \
--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/' --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
# Remove structure forward declarations.
LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' tags
} }
emacs() emacs()
@ -233,6 +230,7 @@ if [ "${ARCH}" = "um" ]; then
fi fi
fi fi
remove_structs=
case "$1" in case "$1" in
"cscope") "cscope")
docscope docscope
@ -245,10 +243,17 @@ case "$1" in
"tags") "tags")
rm -f tags rm -f tags
xtags ctags xtags ctags
remove_structs=y
;; ;;
"TAGS") "TAGS")
rm -f TAGS rm -f TAGS
xtags etags xtags etags
remove_structs=y
;; ;;
esac esac
# Remove structure forward declarations.
if [ -n $remove_structs ]; then
LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1
fi