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 > >