summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@kernel.org>2016-06-29 18:14:53 -0400
committerMichal Marek <mmarek@suse.com>2016-07-22 06:13:39 -0400
commitc930a1b23bb7a22439cf505db130a8db60e22688 (patch)
tree49e013ddc2c997ecb6f0cbe537fa667078411c23 /scripts
parent8e826ad52b751ca34d5153533f4f58ec38cf4799 (diff)
coccicheck: enable parmap support
Coccinelle has had parmap support since 1.0.2, this means it supports --jobs, enabling built-in multithreaded functionality, instead of needing one to script it out. Just look for --jobs in the help output to determine if this is supported and use it only if your number of processors detected is > 1. If parmap is enabled also enable the load balancing to be dynamic, so that if a thread finishes early we keep feeding it. stderr is currently sent to /dev/null, addressing a way to capture that will be addressed next. If --jobs is not supported we fallback to the old mechanism. We expect to deprecate the old mechanism as soon as we can get confirmation all users are ready. While at it propagate back into the shell script any coccinelle error code. When used in serialized mode where all cocci files are run this also stops processing if an error has occured. This lets us handle some errors in coccinelle cocci files and if they bail out we should inspect the errors. This will be more useful later to help annotate coccinelle version dependency requirements. This will let you run only SmPL files that your system supports. Extend Documentation/coccinelle.txt as well. As a small example, prior to this change, on an 8-core system: Before: $ export COCCI=scripts/coccinelle/free/kfree.cocci $ time make coccicheck MODE=report ... real 29m14.912s user 103m1.796s sys 0m4.464s After: real 16m22.435s user 128m30.060s sys 0m2.712s v4: o expand Documentation/coccinelle.txt to reflect parmap support info o update commit log to reflect what we actually do now with stderr o split out DEBUG_FILE use into another patch o detect number of CPUs and if its 1 then skip parmap support, note that if you still support parmap, but have 1 CPU you will also go through the new branches, so the old complex multithreaded process is skipped as well. v3: o move USE_JOBS to avoid being overriden v2: o redirect coccinelle stderr to /dev/null by default and only if DEBUG_FILE is used do we pass it to a file o fix typo of paramap/parmap Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org> Acked-by: Nicolas Palix <nicolas.palix@imag.fr> Signed-off-by: Michal Marek <mmarek@suse.com>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/coccicheck35
1 files changed, 32 insertions, 3 deletions
diff --git a/scripts/coccicheck b/scripts/coccicheck
index 5319fae910b4..4b65a0fd50a1 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -12,8 +12,8 @@ if [ ! -x "$SPATCH" ]; then
12 exit 1 12 exit 1
13fi 13fi
14 14
15trap kill_running SIGTERM SIGINT 15USE_JOBS="no"
16declare -a SPATCH_PID 16$SPATCH --help | grep "\-\-jobs" > /dev/null && USE_JOBS="yes"
17 17
18# The verbosity may be set by the environmental parameter V= 18# The verbosity may be set by the environmental parameter V=
19# as for example with 'make V=1 coccicheck' 19# as for example with 'make V=1 coccicheck'
@@ -56,6 +56,16 @@ if [ "$KBUILD_EXTMOD" != "" ] ; then
56 OPTIONS="--patch $srctree $OPTIONS" 56 OPTIONS="--patch $srctree $OPTIONS"
57fi 57fi
58 58
59# You can override by using SPFLAGS
60if [ "$USE_JOBS" = "no" ]; then
61 trap kill_running SIGTERM SIGINT
62 declare -a SPATCH_PID
63elif [ "$NPROC" != "1" ]; then
64 # Using 0 should work as well, refer to _SC_NPROCESSORS_ONLN use on
65 # https://github.com/rdicosmo/parmap/blob/master/setcore_stubs.c
66 OPTIONS="$OPTIONS --jobs $NPROC --chunksize 1"
67fi
68
59if [ "$MODE" = "" ] ; then 69if [ "$MODE" = "" ] ; then
60 if [ "$ONLINE" = "0" ] ; then 70 if [ "$ONLINE" = "0" ] ; then
61 echo 'You have not explicitly specified the mode to use. Using default "report" mode.' 71 echo 'You have not explicitly specified the mode to use. Using default "report" mode.'
@@ -82,7 +92,18 @@ if [ "$ONLINE" = "0" ] ; then
82 echo '' 92 echo ''
83fi 93fi
84 94
85run_cmd() { 95run_cmd_parmap() {
96 if [ $VERBOSE -ne 0 ] ; then
97 echo "Running ($NPROC in parallel): $@"
98 fi
99 $@ 2>/dev/null
100 if [[ $? -ne 0 ]]; then
101 echo "coccicheck failed"
102 exit $?
103 fi
104}
105
106run_cmd_old() {
86 local i 107 local i
87 if [ $VERBOSE -ne 0 ] ; then 108 if [ $VERBOSE -ne 0 ] ; then
88 echo "Running ($NPROC in parallel): $@" 109 echo "Running ($NPROC in parallel): $@"
@@ -97,6 +118,14 @@ run_cmd() {
97 wait 118 wait
98} 119}
99 120
121run_cmd() {
122 if [ "$USE_JOBS" = "yes" ]; then
123 run_cmd_parmap $@
124 else
125 run_cmd_old $@
126 fi
127}
128
100kill_running() { 129kill_running() {
101 for i in $(seq 0 $(( NPROC - 1 )) ); do 130 for i in $(seq 0 $(( NPROC - 1 )) ); do
102 if [ $VERBOSE -eq 2 ] ; then 131 if [ $VERBOSE -eq 2 ] ; then