rcutorture: Make object_debug also double call_rcu() heap object
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 3 Dec 2020 01:52:07 +0000 (17:52 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 7 Jan 2021 01:17:21 +0000 (17:17 -0800)
This commit provides a test for call_rcu() printing the allocation address
of a double-freed callback by double-freeing a callback allocated via
kmalloc().  However, this commit does not depend on any other commit.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index 007595d..76c8386 100644 (file)
@@ -2782,6 +2782,7 @@ static void rcu_test_debug_objects(void)
 #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD
        struct rcu_head rh1;
        struct rcu_head rh2;
+       struct rcu_head *rhp = kmalloc(sizeof(*rhp), GFP_KERNEL);
 
        init_rcu_head_on_stack(&rh1);
        init_rcu_head_on_stack(&rh2);
@@ -2794,6 +2795,10 @@ static void rcu_test_debug_objects(void)
        local_irq_disable(); /* Make it harder to start a new grace period. */
        call_rcu(&rh2, rcu_torture_leak_cb);
        call_rcu(&rh2, rcu_torture_err_cb); /* Duplicate callback. */
+       if (rhp) {
+               call_rcu(rhp, rcu_torture_leak_cb);
+               call_rcu(rhp, rcu_torture_err_cb); /* Another duplicate callback. */
+       }
        local_irq_enable();
        rcu_read_unlock();
        preempt_enable();