public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC v4 0/9] coccicheck: private review for modernization
@ 2016-06-29 22:10 Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 1/9] coccicheck: move spatch binary check up Luis R. Rodriguez
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

Here's a v4 RFC, sending it privately to avoid bikeshedding in public.
These are rebased on top of linux-next tag next-20160623.

Luis R. Rodriguez (9):
  coccicheck: move spatch binary check up
  coccicheck: make SPFLAGS more useful
  coccicheck: enable parmap support
  coccicheck: add support for DEBUG_FILE
  coccicheck: replace --very-quiet with --quit when debugging
  scripts: add Linux .cocciconfig for coccinelle
  coccicheck: add support for requring a coccinelle version
  coccicheck: refer to Documentation/coccinelle.txt and wiki
  scripts/coccinelle: require coccinelle >= 1.0.4 on
    device_node_continue.cocci

 .cocciconfig                                       |   3 +
 .gitignore                                         |   1 +
 Documentation/coccinelle.txt                       | 125 ++++++++++++++++++++-
 scripts/coccicheck                                 |  96 ++++++++++++++--
 .../iterators/device_node_continue.cocci           |   3 +
 5 files changed, 218 insertions(+), 10 deletions(-)
 create mode 100644 .cocciconfig

-- 
2.8.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC v4 1/9] coccicheck: move spatch binary check up
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 2/9] coccicheck: make SPFLAGS more useful Luis R. Rodriguez
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

This has no functional changes. This is being done
to enable us to later use spatch binary for some
flag checking for certain features early on.

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
Acked-by: Nicolas Palix <nicolas.palix@imag.fr>
---
 scripts/coccicheck | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/scripts/coccicheck b/scripts/coccicheck
index f6627863fdc3..f137b04dfdd3 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -7,6 +7,11 @@
 
 SPATCH="`which ${SPATCH:=spatch}`"
 
+if [ ! -x "$SPATCH" ]; then
+    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
+    exit 1
+fi
+
 trap kill_running SIGTERM SIGINT
 declare -a SPATCH_PID
 
@@ -51,11 +56,6 @@ if [ "$KBUILD_EXTMOD" != "" ] ; then
     OPTIONS="--patch $srctree $OPTIONS"
 fi
 
-if [ ! -x "$SPATCH" ]; then
-    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
-    exit 1
-fi
-
 if [ "$MODE" = "" ] ; then
     if [ "$ONLINE" = "0" ] ; then
 	echo 'You have not explicitly specified the mode to use. Using default "report" mode.'
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 2/9] coccicheck: make SPFLAGS more useful
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 1/9] coccicheck: move spatch binary check up Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 3/9] coccicheck: enable parmap support Luis R. Rodriguez
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

SPFLAGS is set early, it means that any heuristics done on
coccicheck cannot be overridden currently. Move SPFLAGS
after OPTIONS and set this at the end. This lets you override
any heuristics as coccinelle treats conflicts by only listening
to the last option that makes sense.

v3: this patch was added in the v3 series
v4: Update Documentation/coccinelle.txt explaining how
    SPFLAGS works as well.

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
Acked-by: Nicolas Palix <nicolas.palix@imag.fr>
---
 Documentation/coccinelle.txt | 3 ++-
 scripts/coccicheck           | 5 ++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index 7f773d51fdd9..bb9632c20cfb 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -146,7 +146,8 @@ MODE variable explained above.
 ~~~~~~~~~~~~~~~~~~
 
 Additional flags can be passed to spatch through the SPFLAGS
-variable.
+variable. This works as Coccinelle respects the last flags
+given to it when options are in conflict.
 
     make SPFLAGS=--use-glimpse coccicheck
     make SPFLAGS=--use-idutils coccicheck
diff --git a/scripts/coccicheck b/scripts/coccicheck
index f137b04dfdd3..5319fae910b4 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -30,7 +30,7 @@ else
 	NPROC="$J"
 fi
 
-FLAGS="--very-quiet $SPFLAGS"
+FLAGS="--very-quiet"
 
 # spatch only allows include directories with the syntax "-I include"
 # while gcc also allows "-Iinclude" and "-include include"
@@ -106,6 +106,9 @@ kill_running() {
 	done
 }
 
+# You can override heuristics with SPFLAGS, these must always go last
+OPTIONS="$OPTIONS $SPFLAGS"
+
 coccinelle () {
     COCCI="$1"
 
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 3/9] coccicheck: enable parmap support
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 1/9] coccicheck: move spatch binary check up Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 2/9] coccicheck: make SPFLAGS more useful Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 4/9] coccicheck: add support for DEBUG_FILE Luis R. Rodriguez
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

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>
---
 Documentation/coccinelle.txt | 15 +++++++++++++++
 scripts/coccicheck           | 35 ++++++++++++++++++++++++++++++++---
 2 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index bb9632c20cfb..64daaf18874b 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -94,11 +94,26 @@ To enable verbose messages set the V= variable, for example:
 
    make coccicheck MODE=report V=1
 
+ Coccinelle parallelization
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 By default, coccicheck tries to run as parallel as possible. To change
 the parallelism, set the J= variable. For example, to run across 4 CPUs:
 
    make coccicheck MODE=report J=4
 
+As of Coccinelle 1.0.2 Coccinelle uses Ocaml parmap for parallelization,
+if support for this is detected you will benefit from parmap parallelization.
+
+When parmap is enabled coccicheck will enable dynamic load balancing by using
+'--chunksize 1' argument, this ensures we keep feeding threads with work
+one by one, so that we avoid the situation where most work gets done by only
+a few threads. With dynamic load balancing, if a thread finishes early we keep
+feeding it more work.
+
+When parmap is enabled, if an error occurs in Coccinelle, this error
+value is propagated back, the return value of the 'make coccicheck'
+captures this return value.
 
  Using Coccinelle with a single semantic patch
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
     exit 1
 fi
 
-trap kill_running SIGTERM SIGINT
-declare -a SPATCH_PID
+USE_JOBS="no"
+$SPATCH --help | grep "\-\-jobs" > /dev/null && USE_JOBS="yes"
 
 # The verbosity may be set by the environmental parameter V=
 # as for example with 'make V=1 coccicheck'
@@ -56,6 +56,16 @@ if [ "$KBUILD_EXTMOD" != "" ] ; then
     OPTIONS="--patch $srctree $OPTIONS"
 fi
 
+# You can override by using SPFLAGS
+if [ "$USE_JOBS" = "no" ]; then
+	trap kill_running SIGTERM SIGINT
+	declare -a SPATCH_PID
+elif [ "$NPROC" != "1" ]; then
+	# Using 0 should work as well, refer to _SC_NPROCESSORS_ONLN use on
+	# https://github.com/rdicosmo/parmap/blob/master/setcore_stubs.c
+	OPTIONS="$OPTIONS --jobs $NPROC --chunksize 1"
+fi
+
 if [ "$MODE" = "" ] ; then
     if [ "$ONLINE" = "0" ] ; then
 	echo 'You have not explicitly specified the mode to use. Using default "report" mode.'
@@ -82,7 +92,18 @@ if [ "$ONLINE" = "0" ] ; then
     echo ''
 fi
 
-run_cmd() {
+run_cmd_parmap() {
+	if [ $VERBOSE -ne 0 ] ; then
+		echo "Running ($NPROC in parallel): $@"
+	fi
+	$@ 2>/dev/null
+	if [[ $? -ne 0 ]]; then
+		echo "coccicheck failed"
+		exit $?
+	fi
+}
+
+run_cmd_old() {
 	local i
 	if [ $VERBOSE -ne 0 ] ; then
 		echo "Running ($NPROC in parallel): $@"
@@ -97,6 +118,14 @@ run_cmd() {
 	wait
 }
 
+run_cmd() {
+	if [ "$USE_JOBS" = "yes" ]; then
+		run_cmd_parmap $@
+	else
+		run_cmd_old $@
+	fi
+}
+
 kill_running() {
 	for i in $(seq 0 $(( NPROC - 1 )) ); do
 		if [ $VERBOSE -eq 2 ] ; then
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 4/9] coccicheck: add support for DEBUG_FILE
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (2 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 3/9] coccicheck: enable parmap support Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 5/9] coccicheck: replace --very-quiet with --quit when debugging Luis R. Rodriguez
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

Enable to capture stderr via a DEBUG_FILE variable passed to
coccicheck. You can now do:

$ rm -f cocci.err
$ export COCCI=scripts/coccinelle/free/kfree.cocci
$ make coccicheck MODE=report DEBUG_FILE=cocci.err
...
$ cat cocci.err

This will be come more useful once we add support to
use more things which would go into stderr, such as
profiling. That will be done separately in another
commit.

Expand Documentation/coccinelle.txt with details.

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---
 Documentation/coccinelle.txt | 20 ++++++++++++++++++++
 scripts/coccicheck           | 10 +++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index 64daaf18874b..2516c5ef1691 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -157,6 +157,26 @@ semantic patch as shown in the previous section.
 The "report" mode is the default. You can select another one with the
 MODE variable explained above.
 
+ Debugging Coccinelle SmPL patches
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Using coccicheck is best as it provides in the spatch command line
+include options matching the options used when we compile the kernel.
+You can learn what these options are by using V=1, you could then
+manually run Coccinelle with debug options added.
+
+Alternatively you can debug running Coccinelle against SmPL patches
+by asking for stderr to be redirected to stderr, by default stderr
+is redirected to /dev/null, if you'd like to capture stderr you
+can specify the DEBUG_FILE="file.txt" option to coccicheck. For
+instance:
+
+    rm -f cocci.err
+    make coccicheck COCCI=scripts/coccinelle/free/kfree.cocci MODE=report DEBUG_FILE=cocci.err
+    cat cocci.err
+
+DEBUG_FILE support is only supported when using coccinelle >= 1.2.
+
  Additional flags
 ~~~~~~~~~~~~~~~~~~
 
diff --git a/scripts/coccicheck b/scripts/coccicheck
index 4b65a0fd50a1..3f0bb3f0fddc 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -96,7 +96,15 @@ run_cmd_parmap() {
 	if [ $VERBOSE -ne 0 ] ; then
 		echo "Running ($NPROC in parallel): $@"
 	fi
-	$@ 2>/dev/null
+	if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then
+		if [ -f $DEBUG_FILE ]; then
+			echo "Debug file $DEBUG_FILE exists, bailing"
+			exit
+		fi
+	else
+		DEBUG_FILE="/dev/null"
+	fi
+	$@ 2>$DEBUG_FILE
 	if [[ $? -ne 0 ]]; then
 		echo "coccicheck failed"
 		exit $?
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 5/9] coccicheck: replace --very-quiet with --quit when debugging
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (3 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 4/9] coccicheck: add support for DEBUG_FILE Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 6/9] scripts: add Linux .cocciconfig for coccinelle Luis R. Rodriguez
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

When debugging (using --profile or --show-trying) you want to
avoid supressing output,  use --quiet instead. While at it, extend
documentation for SPFLAGS use.

For instance one can use:

$ export COCCI=scripts/coccinelle/misc/irqf_oneshot.cocci
$ make coccicheck DEBUG_FILE="poo.err" MODE=report SPFLAGS="--profile --show-trying" M=./drivers/mfd/arizona-irq.c

Expand Documentation/coccinelle.txt as well.

v4: expand Documentation/coccinelle.txt
v3: rebased, resolve conflicts, expand Documentation/coccinelle.txt
v2: use egrep instead of the *"=--option"* check, this doesn't work for
    disjunctions.

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---
 Documentation/coccinelle.txt | 12 ++++++++++++
 scripts/coccicheck           | 23 +++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index 2516c5ef1691..4f5b2287a2b1 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -175,6 +175,18 @@ instance:
     make coccicheck COCCI=scripts/coccinelle/free/kfree.cocci MODE=report DEBUG_FILE=cocci.err
     cat cocci.err
 
+You can use SPFLAGS to add debugging flags, for instance you may want to
+add both --profile --show-trying to SPFLAGS when debugging. For instance
+you may want to use:
+
+    rm -f err.log
+    export COCCI=scripts/coccinelle/misc/irqf_oneshot.cocci
+    make coccicheck DEBUG_FILE="err.log" MODE=report SPFLAGS="--profile --show-trying" M=./drivers/mfd/arizona-irq.c
+
+err.log will now have the profiling information, while stdout will
+provide with some progress information as Coccinelle move forward with
+work.
+
 DEBUG_FILE support is only supported when using coccinelle >= 1.2.
 
  Additional flags
diff --git a/scripts/coccicheck b/scripts/coccicheck
index 3f0bb3f0fddc..1454a44d90a2 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -32,6 +32,29 @@ fi
 
 FLAGS="--very-quiet"
 
+# You can use SPFLAGS to append extra arguments to coccicheck or override any
+# heuristics done in this file as Coccinelle accepts the last options when
+# options conflict.
+#
+# A good example for use of SPFLAGS is if you want to debug your cocci script,
+# you can for instance use the following:
+#
+# $ export COCCI=scripts/coccinelle/misc/irqf_oneshot.cocci
+# $ make coccicheck MODE=report DEBUG_FILE="all.err" SPFLAGS="--profile --show-trying" M=./drivers/mfd/arizona-irq.c
+#
+# "--show-trying" should show you what rule is being processed as it goes to
+# stdout, you do not need a debug file for that. The profile output will be
+# be sent to stdout, if you provide a DEBUG_FILE the profiling data can be
+# inspected there.
+#
+# --profile will not output if --very-quiet is used, so avoid it.
+echo $SPFLAGS | egrep -e "--profile|--show-trying" 2>&1 > /dev/null
+if [ $? -eq 0 ]; then
+	FLAGS="--quiet"
+else
+	FLAGS="--very-quiet"
+fi
+
 # spatch only allows include directories with the syntax "-I include"
 # while gcc also allows "-Iinclude" and "-include include"
 COCCIINCLUDE=${LINUXINCLUDE//-I/-I }
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 6/9] scripts: add Linux .cocciconfig for coccinelle
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (4 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 5/9] coccicheck: replace --very-quiet with --quit when debugging Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 7/9] coccicheck: add support for requring a coccinelle version Luis R. Rodriguez
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

Coccinelle supports reading .cocciconfig, the order of precedence for
variables for .coccoconfig is as follows:

 o Your current user's home directory is processed first
 o Your directory from which spatch is called is processed next
 o The directory provided with the --dir option is processed last, if used

Since coccicheck runs through make, it naturally runs from the kernel
proper dir, as such the second rule above would be implied for picking up a
.cocciconfig when using 'make coccicheck'.

'make coccicheck' also supports using M= targets, and you can also avoid
supplying any target, in the later case its assumed you want to target
the entire kernel. coccicheck has:

    if [ "$KBUILD_EXTMOD" = "" ] ; then
        OPTIONS="--dir $srctree $COCCIINCLUDE"
    else
        OPTIONS="--dir $KBUILD_EXTMOD $COCCIINCLUDE"
    fi

For both cases --dir is used, as such following the third rule the target
also can have its own .cocciconfig file, since make is used for it, its the
same file when no M=path is passed.

If using spatch manually just keep the above order logic in mind when
making changes, if you need to override any settings use SPFLAGS.

We help Coccinelle when used against Linux with a set of sensible defaults
options for Linux with our own Linux .cocciconfig. This hints to coccinelle
git can be used for 'git grep' queries over coccigrep. A timeout of 200
seconds should suffice for now.

To confirm what options will be used by Coccinelle run:

  spatch --print-options-only

The options picked up by .cocciconfig can ony be verified with the
above, by default Coccinelle does not paste these the spawned command
line run for an spatch instance.

Coccinelle also has support for idutils and this helps, if you use it,
however its use is obviously optional. Upstream coccinelle has a
script scripts/idutils_index.sh in its repository, it assumes you
do:

  mkid -i C --output .id-utils.index

Coccinelle searches for the index in the directory on which it is working
...

If you use idutils you can override for 'make coccicheck' by using the
SPFLAGS option as follows:

First build the index, for example:
mkid -s

Pick the cocci file you wnat to work with:
export COCCI=scripts/coccinelle/misc/irqf_oneshot.cocci

Then run coccicheck:
$ make coccicheck V=1 MODE=report SPFLAGS="--use-idutils ID"

Coccinelle supports reading .cocciconfig from different directories,
the later one overriding the previous reads in the following order:

 o Your current user's home directory is processed first
 o Your directory from which spatch is called is processed next
 o The directory provided with the --dir option is processed last, if used

v4:

o Refer to using --print-options-only for testing what options are
  picked up by .cocciconfig reading.

o Expand commit log considerably explaining *why* .cocconfig from
  two precedence rules are used when using coccicheck, and how to
  properly override these if needed.

o Expand Documentation/coccinelle.txt

v3: Expand commit log a bit more

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---
 .cocciconfig                 |  3 +++
 .gitignore                   |  1 +
 Documentation/coccinelle.txt | 47 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+)
 create mode 100644 .cocciconfig

diff --git a/.cocciconfig b/.cocciconfig
new file mode 100644
index 000000000000..43967c6b2015
--- /dev/null
+++ b/.cocciconfig
@@ -0,0 +1,3 @@
+[spatch]
+	options = --timeout 200
+	options = --use-gitgrep
diff --git a/.gitignore b/.gitignore
index 2be25f771bd8..c2ed4ecb0acd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,6 +67,7 @@ Module.symvers
 #
 !.gitignore
 !.mailmap
+!.cocciconfig
 
 #
 # Generated include files
diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index 4f5b2287a2b1..a425b1f1df99 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -189,6 +189,53 @@ work.
 
 DEBUG_FILE support is only supported when using coccinelle >= 1.2.
 
+ .cocciconfig support
+~~~~~~~~~~~~~~~~~~~~~~
+
+Coccinelle supports reading .cocciconfig for default Coccinelle options that
+should be used every time spatch is spawned, the order of precedence for
+variables for .coccoconfig is as follows:
+
+  o Your current user's home directory is processed first
+  o Your directory from which spatch is called is processed next
+  o The directory provided with the --dir option is processed last, if used
+
+Since coccicheck runs through make, it naturally runs from the kernel
+proper dir, as such the second rule above would be implied for picking up a
+.cocciconfig when using 'make coccicheck'.
+
+'make coccicheck' also supports using M= targets, and you can also avoid
+supplying any target, in the later case its assumed you want to target
+the entire kernel. coccicheck has:
+
+    if [ "$KBUILD_EXTMOD" = "" ] ; then
+        OPTIONS="--dir $srctree $COCCIINCLUDE"
+    else
+        OPTIONS="--dir $KBUILD_EXTMOD $COCCIINCLUDE"
+    fi
+
+For both cases --dir is used, as such following the third rule the target
+also can have its own .cocciconfig file, since make is used for it, its the
+same file when no M=path is passed.
+
+If using spatch manually just keep the above order logic in mind when
+making changes, if you need to override any settings use SPFLAGS.
+
+To verify what options are taking effect run:
+
+  spatch --print-options-only
+
+The options picked up by .cocciconfig can only be verified with the
+above, by default Coccinelle does not paste these the spawned command
+line run for an spatch instance.
+
+Take note that when there are conflicting options Coccinelle takes
+precedence for the last options passed. Linux supplies its own .cocciconfig
+with a suitable set of defaults, this includes using its internal
+'--use-gitgrep' for using 'git grep' when identifying what code to
+look for, for processing. Refer to the "Additional flags" section below
+to learn how to override default .cocciconfig supplied by Linux.
+
  Additional flags
 ~~~~~~~~~~~~~~~~~~
 
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 7/9] coccicheck: add support for requring a coccinelle version
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (5 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 6/9] scripts: add Linux .cocciconfig for coccinelle Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 8/9] coccicheck: refer to Documentation/coccinelle.txt and wiki Luis R. Rodriguez
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

Enable Coccinelle SmPL patches to require a specific version of
Coccinelle. In the event that the version does not match we just
inform the user, if the user asked to go through all SmPL patches
we just inform them of the need for a new version of coccinelle for
the SmPL patch and continue on with the rest.

This uses the simple kernel scripts/ld-version.sh to create a weight
on the version provided by spatch. The -dirty attribute is ignored if
supplied, the benefit of scripts/ld-version.sh is it has a long history
and well tested.

While at it, document the // Options stuff as well.

v4: Document // Options and // Requires as well on
    Documentation/coccinelle.txt.

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
Acked-by: Nicolas Palix <nicolas.palix@imag.fr>
---
 Documentation/coccinelle.txt | 19 +++++++++++++++++++
 scripts/coccicheck           | 14 ++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index a425b1f1df99..b90aa0bc8d6c 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -254,6 +254,25 @@ thus active by default. However, by indexing the code with
 one of these tools, and according to the cocci file used,
 spatch could proceed the entire code base more quickly.
 
+ SmPL patch specific options
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+SmPL patches can have their own requirements for options passed
+to Coccinelle. SmPL patch specific options can be provided by
+providing them at the top of the SmPL patch, for instance:
+
+// Options: --no-includes --include-headers
+
+ SmPL patch Coccinelle requirements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+As Coccinelle features get added some more advanced SmPL patches
+may require newer versions of Coccinelle. If an SmPL patch requires
+at least a version of Coccinelle, this can be specified as follows,
+as an example if requiring at least Coccinelle >= 1.0.5:
+
+// Requires: 1.0.5
+
  Proposing new semantic patches
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/scripts/coccicheck b/scripts/coccicheck
index 1454a44d90a2..0552e6152692 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -5,6 +5,7 @@
 # version 1.0.0-rc11.
 #
 
+DIR="$(dirname $(readlink -f $0))/.."
 SPATCH="`which ${SPATCH:=spatch}`"
 
 if [ ! -x "$SPATCH" ]; then
@@ -12,6 +13,9 @@ if [ ! -x "$SPATCH" ]; then
     exit 1
 fi
 
+SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}')
+SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh)
+
 USE_JOBS="no"
 $SPATCH --help | grep "\-\-jobs" > /dev/null && USE_JOBS="yes"
 
@@ -173,6 +177,16 @@ coccinelle () {
     COCCI="$1"
 
     OPT=`grep "Option" $COCCI | cut -d':' -f2`
+    REQ=`grep "Requires" $COCCI | cut -d':' -f2 | sed "s| ||"`
+    REQ_NUM=$(echo $REQ | ${DIR}/scripts/ld-version.sh)
+    if [ "$REQ_NUM" != "0" ] ; then
+	    if [ "$SPATCH_VERSION_NUM" -lt "$REQ_NUM" ] ; then
+		    echo "Skipping coccinele SmPL patch: $COCCI"
+		    echo "You have coccinelle:           $SPATCH_VERSION"
+		    echo "This SmPL patch requires:      $REQ"
+		    return
+	    fi
+    fi
 
 #   The option '--parse-cocci' can be used to syntactically check the SmPL files.
 #
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 8/9] coccicheck: refer to Documentation/coccinelle.txt and wiki
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (6 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 7/9] coccicheck: add support for requring a coccinelle version Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:10 ` [RFC v4 9/9] scripts/coccinelle: require coccinelle >= 1.0.4 on device_node_continue.cocci Luis R. Rodriguez
  2016-06-29 22:14 ` [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

Refer to the Documentation/coccinelle.txt and supplemental documentation
on the wiki:

https://bottest.wiki.kernel.org/coccicheck

This page shall always refer to the linux-next iteration of scripts/coccicheck.

v4: only refer to the wiki as supplemental documentation, and also
    update Documentation/coccinelle.txt.

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---
 Documentation/coccinelle.txt | 9 +++++++++
 scripts/coccicheck           | 5 +++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/Documentation/coccinelle.txt b/Documentation/coccinelle.txt
index b90aa0bc8d6c..e35c0fdf1fef 100644
--- a/Documentation/coccinelle.txt
+++ b/Documentation/coccinelle.txt
@@ -38,6 +38,15 @@ as a regular user, and install it with
 
         sudo make install
 
+ Supplemental documentation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For supplemental documentation refer to the wiki:
+
+https://bottest.wiki.kernel.org/coccicheck
+
+The wiki documentation always refers to the linux-next version of the script.
+
  Using Coccinelle on the Linux kernel
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/scripts/coccicheck b/scripts/coccicheck
index 0552e6152692..6676b528cfad 100755
--- a/scripts/coccicheck
+++ b/scripts/coccicheck
@@ -1,9 +1,10 @@
 #!/bin/bash
-
+# Linux kernel coccicheck
+#
+# Read Documentation/coccinelle.txt
 #
 # This script requires at least spatch
 # version 1.0.0-rc11.
-#
 
 DIR="$(dirname $(readlink -f $0))/.."
 SPATCH="`which ${SPATCH:=spatch}`"
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC v4 9/9] scripts/coccinelle: require coccinelle >= 1.0.4 on device_node_continue.cocci
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (7 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 8/9] coccicheck: refer to Documentation/coccinelle.txt and wiki Luis R. Rodriguez
@ 2016-06-29 22:10 ` Luis R. Rodriguez
  2016-06-29 22:14 ` [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:10 UTC (permalink / raw)
  To: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek
  Cc: akpm, gregkh, markivx, stephen.boyd, zohar, broonie, ming.lei,
	tiwai, johannes, chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2,
	jslaby, torvalds, deepa.kernel, keescook, cocci, linux-kernel,
	Luis R. Rodriguez

Make use of the new Requires: tag to be able to specify coccinelle binary
version requirements. The cocci file device_node_continue.cocci requires at
least coccinelle 1.0.4.

Acked-by: Julia Lawall <julia.lawall@lip6.fr>
Acked-by: Nicolas Palix <nicolas.palix@imag.fr>
Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---
 scripts/coccinelle/iterators/device_node_continue.cocci | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/scripts/coccinelle/iterators/device_node_continue.cocci b/scripts/coccinelle/iterators/device_node_continue.cocci
index 38ab744a4037..a36c16db171b 100644
--- a/scripts/coccinelle/iterators/device_node_continue.cocci
+++ b/scripts/coccinelle/iterators/device_node_continue.cocci
@@ -5,8 +5,11 @@
 // Copyright: (C) 2015 Julia Lawall, Inria. GPLv2.
 // URL: http://coccinelle.lip6.fr/
 // Options: --no-includes --include-headers
+// Requires: 1.0.4
 // Keywords: for_each_child_of_node, etc.
 
+// This uses a conjunction, which requires at least coccinelle >= 1.0.4
+
 virtual patch
 virtual context
 virtual org
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [RFC v4 0/9] coccicheck: private review for modernization
  2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
                   ` (8 preceding siblings ...)
  2016-06-29 22:10 ` [RFC v4 9/9] scripts/coccinelle: require coccinelle >= 1.0.4 on device_node_continue.cocci Luis R. Rodriguez
@ 2016-06-29 22:14 ` Luis R. Rodriguez
  9 siblings, 0 replies; 11+ messages in thread
From: Luis R. Rodriguez @ 2016-06-29 22:14 UTC (permalink / raw)
  To: Luis R. Rodriguez
  Cc: Julia.Lawall, nicolas.palix, Gilles.Muller, mmarek, akpm, gregkh,
	markivx, stephen.boyd, zohar, broonie, ming.lei, tiwai, johannes,
	chunkeey, hauke, jwboyer, dmitry.torokhov, dwmw2, jslaby,
	torvalds, deepa.kernel, keescook, cocci, linux-kernel

On Wed, Jun 29, 2016 at 03:10:17PM -0700, Luis R. Rodriguez wrote:
> Here's a v4 RFC, sending it privately to avoid bikeshedding in public.
> These are rebased on top of linux-next tag next-20160623.

Whoops.. so much for that. Ignore please. Will send the fixed set next...

  Luis

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-06-29 22:28 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-29 22:10 [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 1/9] coccicheck: move spatch binary check up Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 2/9] coccicheck: make SPFLAGS more useful Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 3/9] coccicheck: enable parmap support Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 4/9] coccicheck: add support for DEBUG_FILE Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 5/9] coccicheck: replace --very-quiet with --quit when debugging Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 6/9] scripts: add Linux .cocciconfig for coccinelle Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 7/9] coccicheck: add support for requring a coccinelle version Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 8/9] coccicheck: refer to Documentation/coccinelle.txt and wiki Luis R. Rodriguez
2016-06-29 22:10 ` [RFC v4 9/9] scripts/coccinelle: require coccinelle >= 1.0.4 on device_node_continue.cocci Luis R. Rodriguez
2016-06-29 22:14 ` [RFC v4 0/9] coccicheck: private review for modernization Luis R. Rodriguez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox