On 4/24/2025 11:17 AM, Joel Fernandes wrote:
> 
> 
> On 4/24/2025 10:44 AM, Paul E. McKenney wrote:
>> On Thu, Apr 24, 2025 at 09:54:14AM +0300, Dan Carpenter wrote:
>>> On Wed, Apr 23, 2025 at 05:41:37PM -0700, Paul E. McKenney wrote:
>>>> On Wed, Apr 23, 2025 at 10:19:56AM +0300, Dan Carpenter wrote:
>>>>> On Wed, Apr 23, 2025 at 10:17:16AM +0300, Dan Carpenter wrote:
>>>>>> Hello Joel Fernandes,
>>>>>>
>>>>>> Commit bd57ec707441 ("rcutorture: Perform more frequent testing of
>>>>>> ->gpwrap") from Feb 16, 2025 (linux-next), leads to the following
>>>>>> Smatch static checker warning:
>>>>>>
>>>>>>  kernel/rcu/rcutorture.c:4586 rcu_torture_init()
>>>>>>  warn: missing error code 'firsterr'
>>>>>>
>>>>>> kernel/rcu/rcutorture.c
>>>>>>     4576                 if (torture_init_error(firsterr))
>>>>>>     4577                         goto unwind;
>>>>>>     4578         }
>>>>>>     4579         if (object_debug)
>>>>>>     4580                 rcu_test_debug_objects();
>>>>>>     4581         torture_init_end();
>>>>>                    ^^^^^^^^^^^^^^^^^^^
>>>>> Also:
>>>>>
>>>>> kernel/rcu/rcutorture.c:4591 rcu_torture_init() warn: double unlock 
>>>>> 'global &fullstop_mutex' (orig line 4581)
>>>>
>>>> You lost me on this one.  This mutex is acquired by the earlier call to
>>>> torture_init_begin(), but only if that function returns true.  If that
>>>> function returns false, yes, it releases fullstop_mutex, but in that case
>>>> rcu_torture_init() returns immediately, thus avoiding this invocation
>>>> of torture_init_end().
>>>>
>>>> Or am I missing something subtle here?  Or missing something obvious,
>>>> for that matter!  ;-)
>>>>
>>>
>>> I explained it badly.  Joel's patch added a goto so now we call
>>> torture_init_end() twice in a row.
>>>
>>>>                                                    Thanx, Paul
>>>>
>>>>>>     4582         if (cur_ops->gp_slow_register && 
>>>>>> !WARN_ON_ONCE(!cur_ops->gp_slow_unregister))
>>>>>>     4583                 cur_ops->gp_slow_register(&rcu_fwd_cb_nodelay);
>>>>>>     4584 
>>>>>>     4585         if (cur_ops->set_gpwrap_lag && rcu_gpwrap_lag_init())
>>>>>> --> 4586                 goto unwind;
>>>>>>
>>>>>> set an error code?
>>>
>>> Here is the goto.
>>>
>>>>>>
>>>>>>     4587 
>>>>>>     4588         return 0;
>>>>>>     4589 
>>>>>>     4590 unwind:
>>>>>>     4591         torture_init_end();
>>>>>                    ^^^^^^^^^^^^^^^^^^^
>>>
>>> Here is the second torture_init_end().
>>
>> Ah!  Thank you for persisting.  Over to you, Joel!
> 
> Oops, thanks for finding both the issues. I will move the torture_init_end()
> further down and run some tests. At first look, that seems like the right 
> thing
> to do:
> 
> diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
> index 92e2686a4795..bb9a8e718533 100644
> --- a/kernel/rcu/rcutorture.c
> +++ b/kernel/rcu/rcutorture.c
> @@ -4582,13 +4582,17 @@ rcu_torture_init(void)
>         }
>         if (object_debug)
>                 rcu_test_debug_objects();
> -       torture_init_end();
> +
>         if (cur_ops->gp_slow_register &&
> !WARN_ON_ONCE(!cur_ops->gp_slow_unregister))
>                 cur_ops->gp_slow_register(&rcu_fwd_cb_nodelay);
> 
> -       if (gpwrap_lag && cur_ops->set_gpwrap_lag && rcu_gpwrap_lag_init())
> -               goto unwind;
> +       if (gpwrap_lag && cur_ops->set_gpwrap_lag) {
> +               firsterr = rcu_gpwrap_lag_init();
> +               if (torture_init_error(firsterr))
> +                       goto unwind;
> +       }
> 
> +       torture_init_end();
>         return 0;
Passes basic testing, fixed and pushed for more testing with attribution:

git://git.kernel.org/pub/scm/linux/kernel/git/jfern/linux.git (next.2025.04.24b)

Thanks!

 - Joel





Reply via email to