On Wed, 8 Nov 2023, Ankur Arora wrote: > > Julia Lawall <julia.lawall@xxxxxxxx> writes: > > > On Tue, 7 Nov 2023, Ankur Arora wrote: > > > >> Rudimentary script to remove the straight-forward subset of > >> cond_resched() and allies: > >> > >> 1) if (need_resched()) > >> cond_resched() > >> > >> 2) expression*; > >> cond_resched(); /* or in the reverse order */ > >> > >> 3) if (expression) > >> statement > >> cond_resched(); /* or in the reverse order */ > >> > >> The last two patterns depend on the control flow level to ensure > >> that the complex cond_resched() patterns (ex. conditioned ones) > >> are left alone and we only pick up ones which are only minimally > >> related the neighbouring code. > >> > >> Cc: Julia Lawall <Julia.Lawall@xxxxxxxx> > >> Cc: Nicolas Palix <nicolas.palix@xxxxxxx> > >> Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx> > >> --- > >> scripts/coccinelle/api/cond_resched.cocci | 53 +++++++++++++++++++++++ > >> 1 file changed, 53 insertions(+) > >> create mode 100644 scripts/coccinelle/api/cond_resched.cocci > >> > >> diff --git a/scripts/coccinelle/api/cond_resched.cocci b/scripts/coccinelle/api/cond_resched.cocci > >> new file mode 100644 > >> index 000000000000..bf43768a8f8c > >> --- /dev/null > >> +++ b/scripts/coccinelle/api/cond_resched.cocci > >> @@ -0,0 +1,53 @@ > >> +// SPDX-License-Identifier: GPL-2.0-only > >> +/// Remove naked cond_resched() statements > >> +/// > >> +//# Remove cond_resched() statements when: > >> +//# - executing at the same control flow level as the previous or the > >> +//# next statement (this lets us avoid complicated conditionals in > >> +//# the neighbourhood.) > >> +//# - they are of the form "if (need_resched()) cond_resched()" which > >> +//# is always safe. > >> +//# > >> +//# Coccinelle generally takes care of comments in the immediate neighbourhood > >> +//# but might need to handle other comments alluding to rescheduling. > >> +//# > >> +virtual patch > >> +virtual context > >> + > >> +@ r1 @ > >> +identifier r; > >> +@@ > >> + > >> +( > >> + r = cond_resched(); > >> +| > >> +-if (need_resched()) > >> +- cond_resched(); > >> +) > > > > This rule doesn't make sense. The first branch of the disjunction will > > never match a a place where the second branch matches. Anyway, in the > > second branch there is no assignment, so I don't see what the first branch > > is protecting against. > > > > The disjunction is just useless. Whether it is there or or whether only > > the second brancha is there, doesn't have any impact on the result. > > > >> + > >> +@ r2 @ > >> +expression E; > >> +statement S,T; > >> +@@ > >> +( > >> + E; > >> +| > >> + if (E) S > > > > This case is not needed. It will be matched by the next case. > > > >> +| > >> + if (E) S else T > >> +| > >> +) > >> +-cond_resched(); > >> + > >> +@ r3 @ > >> +expression E; > >> +statement S,T; > >> +@@ > >> +-cond_resched(); > >> +( > >> + E; > >> +| > >> + if (E) S > > > > As above. > > > >> +| > >> + if (E) S else T > >> +) > > > > I have the impression that you are trying to retain some cond_rescheds. > > Could you send an example of one that you are trying to keep? Overall, > > the above rules seem a bit ad hoc. You may be keeping some cases you > > don't want to, or removing some cases that you want to keep. > > Right. I was trying to ensure that the script only handled the cases > that didn't have any "interesting" connections to the surrounding code. > > Just to give you an example of the kind of constructs that I wanted > to avoid: > > mm/memoy.c::zap_pmd_range(): > > if (addr != next) > pmd--; > } while (pmd++, cond_resched(), addr != end); > > mm/backing-dev.c::cleanup_offline_cgwbs_workfn() > > while (cleanup_offline_cgwb(wb)) > cond_resched(); > > > while (cleanup_offline_cgwb(wb)) > cond_resched(); > > But from a quick check the simplest coccinelle script does a much > better job than my overly complex (and incorrect) one: > > @r1@ > @@ > - cond_resched(); > > It avoids the first one. And transforms the second to: > > while (cleanup_offline_cgwb(wb)) > {} > > which is exactly what I wanted. Perfect! It could be good to run both scripts and compare the results. julia > > > Of course, if you are confident that the job is done with this semantic > > patch as it is, then that's fine too. > > Not at all. Thanks for pointing out the mistakes. > > > > -- > ankur >