On Tue, May 5, 2020 at 3:58 PM Pavel Machek <pavel@xxxxxxx> wrote: > On Tue 2020-05-05 15:51:16, Andy Shevchenko wrote: > > On Tue, May 5, 2020 at 3:37 PM Pavel Machek <pavel@xxxxxxx> wrote: > > > > So, to the point, the conditional of checking the thread to be stopped being > > > > first part of conjunction logic prevents to check iterations. Thus, we have to > > > > always check both conditions to be able to stop after given > > > > iterations. > > > > > > I ... don't understand. AFAICT the code is equivalent. Both && and || > > > operators permit "short" execution... but second part of expression > > > has no sideeffects, so... > > > > .. > > > > > You are changing !a & !b into !(a | b). But that's equivalent > > > expression. I hate to admit, but I had to draw truth table to prove > > > that. > ... > > > What am I missing? > > > > Basic stuff. Compiler doesn't consider second part of conjunction when > > first one (see operator precedence) is already false, so, it means: > > > > a & b > > 0 x -> false > > 1 0 -> false > > 1 1 -> true > > > > x is not being considered at all. So, logically it's equivalent, > > run-time it's not. > > Yeah, I pointed that out above. Both && and || permit short > execution. But that does not matter, as neither "params->iterations" > nor "total_tests >= params->iterations" have side effects. > > Where is the runtime difference? We have to check *both* conditions. If we don't check iterations, we just wait indefinitely until somebody tells us to stop. Everything in the commit message and mentioned there commit IDs which you may check. > - while (!kthread_should_stop() > - && !(params->iterations && total_tests >= > - params->iterations)) { > + while (!(kthread_should_stop() || > + (params->iterations && total_tests >= params->iterations))) { -- With Best Regards, Andy Shevchenko