Re: [cocci] [PATCH 1/3] coccinelle: mini_lock: improve performance when searching loops

Julia Lawall <[email protected]> Sun, 26 Jul 2026 18:42:25 +0200 (CEST)
Newsgroups fr.inria.cocci,org.kernel.vger.linux-kernel
Message-ID <[email protected]>

On Sat, 25 Jul 2026, Sang-Heon Jeon wrote:

> The 'looped' rule collects the returns inside a for loop to
> prevent 'err' from reporting them. It searches every for loop in
> the file, and on files with large loop bodies the search explodes.
>
> For example, kernel/bpf/verifier.c runs for over 200 seconds,
> almost entirely in 'looped' according to --profile. Since the
> kernel .cocciconfig sets a 200 second timeout, coccicheck silently
> skips the file.
>
> To avoid this, collect the candidate returns first, so that
> 'looped' checks only those positions. 'err' then excludes what
> 'looped' found.
>
> Every return that 'err' can report is also a candidate, so the
> same returns are excluded as before and the output does not change.
> A report-mode run over every .c file in the tree produces identical
> output.
>
> So verifier.c now finishes well within the timeout, in a few
> seconds.
>
> Signed-off-by: Sang-Heon Jeon <[email protected]>
> ---
>  scripts/coccinelle/locks/mini_lock.cocci | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/coccinelle/locks/mini_lock.cocci b/scripts/coccinelle/locks/mini_lock.cocci
> index 71065d8a5d54..54e06cced63b 100644
> --- a/scripts/coccinelle/locks/mini_lock.cocci
> +++ b/scripts/coccinelle/locks/mini_lock.cocci
> @@ -53,11 +53,31 @@ spin_lock_irq@p1
>  spin_lock_irqsave@p1
>  ) (E1@p,...);
>
> -@looped@
> +@err_candidate exists@
> +expression E1;
> +position prelocked.p;
> +position up != prelocked.p1;
> +position rc;
> +identifier lock,unlock;
> +@@
> +
> +lock(E1@p,...);
> +... when != E1
> +    when any
> +if (...) {
> +  ... when != E1
> +  return@rc ...;
> +}
> +... when != E1
> +    when any
> +unlock@up(E1,...);
> +
> +@looped depends on err_candidate@
> +position err_candidate.rc;

If the rule depends on a metavariable defined in err_candidate, then there
is no need for depends on err_candidate.

Also, I think this rule can be exists.

julia

>  position r;
>  @@
>
> -for(...;...;...) { <+... return@r ...; ...+> }
> +for(...;...;...) { <+... return@rc@r ...; ...+> }
>
>  @err exists@
>  expression E1;
> --
> 2.43.0
>
>