Merge tag 'iomap-5.13-merge-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux-2.6-microblaze.git] / kernel / rcu / rcuscale.c
index 06491d5..dca51fe 100644 (file)
@@ -625,6 +625,8 @@ rcu_scale_shutdown(void *arg)
 torture_param(int, kfree_nthreads, -1, "Number of threads running loops of kfree_rcu().");
 torture_param(int, kfree_alloc_num, 8000, "Number of allocations and frees done in an iteration.");
 torture_param(int, kfree_loops, 10, "Number of loops doing kfree_alloc_num allocations and frees.");
+torture_param(bool, kfree_rcu_test_double, false, "Do we run a kfree_rcu() double-argument scale test?");
+torture_param(bool, kfree_rcu_test_single, false, "Do we run a kfree_rcu() single-argument scale test?");
 
 static struct task_struct **kfree_reader_tasks;
 static int kfree_nrealthreads;
@@ -644,10 +646,13 @@ kfree_scale_thread(void *arg)
        struct kfree_obj *alloc_ptr;
        u64 start_time, end_time;
        long long mem_begin, mem_during = 0;
+       bool kfree_rcu_test_both;
+       DEFINE_TORTURE_RANDOM(tr);
 
        VERBOSE_SCALEOUT_STRING("kfree_scale_thread task started");
        set_cpus_allowed_ptr(current, cpumask_of(me % nr_cpu_ids));
        set_user_nice(current, MAX_NICE);
+       kfree_rcu_test_both = (kfree_rcu_test_single == kfree_rcu_test_double);
 
        start_time = ktime_get_mono_fast_ns();
 
@@ -670,7 +675,15 @@ kfree_scale_thread(void *arg)
                        if (!alloc_ptr)
                                return -ENOMEM;
 
-                       kfree_rcu(alloc_ptr, rh);
+                       // By default kfree_rcu_test_single and kfree_rcu_test_double are
+                       // initialized to false. If both have the same value (false or true)
+                       // both are randomly tested, otherwise only the one with value true
+                       // is tested.
+                       if ((kfree_rcu_test_single && !kfree_rcu_test_double) ||
+                                       (kfree_rcu_test_both && torture_random(&tr) & 0x800))
+                               kfree_rcu(alloc_ptr);
+                       else
+                               kfree_rcu(alloc_ptr, rh);
                }
 
                cond_resched();