On Tue, Oct 22, 2024 at 12:07:01PM +0300, Dan Carpenter wrote:
> Hello Joel Fernandes (Google),
>
> Commit 084e04fff160 ("rcuscale: Add laziness and kfree tests") from
> Oct 16, 2022 (linux-next), leads to the following Smatch static
> checker warning:
>
> kernel/rcu/rcuscale.c:1215 rcu_scale_init()
> warn: inconsistent returns 'global &fullstop_mutex'.
>
> kernel/rcu/rcuscale.c
> 857 kfree_scale_init(void)
> 858 {
> 859 int firsterr = 0;
> 860 long i;
> 861 unsigned long jif_start;
> 862 unsigned long orig_jif;
> 863
> 864 pr_alert("%s" SCALE_FLAG
> 865 "--- kfree_rcu_test: kfree_mult=%d
> kfree_by_call_rcu=%d kfree_nthreads=%d kfree_alloc_num=%d kfree_loops=%d
> kfree_rcu_test_double=%d kfree_rcu_test_single=%d\n",
> 866 scale_type, kfree_mult, kfree_by_call_rcu,
> kfree_nthreads, kfree_alloc_num, kfree_loops, kfree_rcu_test_double,
> kfree_rcu_test_single);
> 867
> 868 // Also, do a quick self-test to ensure laziness is as much as
> 869 // expected.
> 870 if (kfree_by_call_rcu && !IS_ENABLED(CONFIG_RCU_LAZY)) {
> 871 pr_alert("CONFIG_RCU_LAZY is disabled, falling back
> to kfree_rcu() for delayed RCU kfree'ing\n");
> 872 kfree_by_call_rcu = 0;
> 873 }
> 874
> 875 if (kfree_by_call_rcu) {
> 876 /* do a test to check the timeout. */
> 877 orig_jif = rcu_get_jiffies_lazy_flush();
> 878
> 879 rcu_set_jiffies_lazy_flush(2 * HZ);
> 880 rcu_barrier();
> 881
> 882 jif_start = jiffies;
> 883 jiffies_at_lazy_cb = 0;
> 884 call_rcu(&lazy_test1_rh, call_rcu_lazy_test1);
> 885
> 886 smp_cond_load_relaxed(&rcu_lazy_test1_cb_called, VAL
> == 1);
> 887
> 888 rcu_set_jiffies_lazy_flush(orig_jif);
> 889
> 890 if (WARN_ON_ONCE(jiffies_at_lazy_cb - jif_start < 2 *
> HZ)) {
> 891 pr_alert("ERROR: call_rcu() CBs are not being
> lazy as expected!\n");
> 892 WARN_ON_ONCE(1);
> 893 return -1;
> ^^^^^^^^^^
> 894 }
> 895
> 896 if (WARN_ON_ONCE(jiffies_at_lazy_cb - jif_start > 3 *
> HZ)) {
> 897 pr_alert("ERROR: call_rcu() CBs are being too
> lazy!\n");
> 898 WARN_ON_ONCE(1);
> 899 return -1;
> ^^^^^^^^^^
> The checker is complaining that we don't call torture_init_end(). Should
> these
> do a goto unwind? Otherwise we're left holding the fullstop_mutex.
>
Not really. At least if we want to "goto unwind", the following patch
should be applied:
<snip>
diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
index 6d37596deb1f..4eb872f9acd9 100644
--- a/kernel/rcu/rcuscale.c
+++ b/kernel/rcu/rcuscale.c
@@ -818,7 +818,8 @@ kfree_scale_cleanup(void)
if (kfree_reader_tasks) {
for (i = 0; i < kfree_nrealthreads; i++)
- torture_stop_kthread(kfree_scale_thread,
+ if (kfree_reader_tasks[i])
+ torture_stop_kthread(kfree_scale_thread,
kfree_reader_tasks[i]);
kfree(kfree_reader_tasks);
kfree_reader_tasks = NULL;
@@ -890,13 +891,15 @@ kfree_scale_init(void)
if (WARN_ON_ONCE(jiffies_at_lazy_cb - jif_start < 2 * HZ)) {
pr_alert("ERROR: call_rcu() CBs are not being lazy as
expected!\n");
WARN_ON_ONCE(1);
- return -1;
+ firsterr = -1;
+ goto unwind;
}
if (WARN_ON_ONCE(jiffies_at_lazy_cb - jif_start > 3 * HZ)) {
pr_alert("ERROR: call_rcu() CBs are being too lazy!\n");
WARN_ON_ONCE(1);
- return -1;
+ firsterr = -1;
+ goto unwind;
}
}
<snip>
then it should address your "static checker warning" which looks correct
to me.
@Joel, @Paul, do you agree? If so i can prepare the patch.
--
Uladzislau Rezki