Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1650912

[PATCH tip/core/rcu 41/88] srcu: Add DEBUG_OBJECTS_RCU_HEAD functionality

From "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Newsgroups linux.kernel
Subject [PATCH tip/core/rcu 41/88] srcu: Add DEBUG_OBJECTS_RCU_HEAD functionality
Date 2017-05-26 00:20 +0200
Message-ID <tL9gU-5Hd-91@gated-at.bofh.it> (permalink)
References <tL8Xv-5iU-1@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


This commit adds DEBUG_OBJECTS_RCU_HEAD checking to detect call_srcu()
counterparts to double-free bugs.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
 kernel/rcu/srcutree.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
index a46142de5133..31203469b2d1 100644
--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -763,6 +763,13 @@ static bool srcu_might_be_idle(struct srcu_struct *sp)
 }
 
 /*
+ * SRCU callback function to leak a callback.
+ */
+static void srcu_leak_callback(struct rcu_head *rhp)
+{
+}
+
+/*
  * Enqueue an SRCU callback on the srcu_data structure associated with
  * the current CPU and the specified srcu_struct structure, initiating
  * grace-period processing if it is not already running.
@@ -800,6 +807,12 @@ void __call_srcu(struct srcu_struct *sp, struct rcu_head *rhp,
 	struct srcu_data *sdp;
 
 	check_init_srcu_struct(sp);
+	if (debug_rcu_head_queue(rhp)) {
+		/* Probable double call_srcu(), so leak the callback. */
+		WRITE_ONCE(rhp->func, srcu_leak_callback);
+		WARN_ONCE(1, "call_srcu(): Leaked duplicate callback\n");
+		return;
+	}
 	rhp->func = func;
 	local_irq_save(flags);
 	sdp = this_cpu_ptr(sp->sda);
@@ -974,9 +987,12 @@ void srcu_barrier(struct srcu_struct *sp)
 		spin_lock_irq(&sdp->lock);
 		atomic_inc(&sp->srcu_barrier_cpu_cnt);
 		sdp->srcu_barrier_head.func = srcu_barrier_cb;
+		debug_rcu_head_queue(&sdp->srcu_barrier_head);
 		if (!rcu_segcblist_entrain(&sdp->srcu_cblist,
-					   &sdp->srcu_barrier_head, 0))
+					   &sdp->srcu_barrier_head, 0)) {
+			debug_rcu_head_unqueue(&sdp->srcu_barrier_head);
 			atomic_dec(&sp->srcu_barrier_cpu_cnt);
+		}
 		spin_unlock_irq(&sdp->lock);
 	}
 
@@ -1101,6 +1117,7 @@ static void srcu_invoke_callbacks(struct work_struct *work)
 	spin_unlock_irq(&sdp->lock);
 	rhp = rcu_cblist_dequeue(&ready_cbs);
 	for (; rhp != NULL; rhp = rcu_cblist_dequeue(&ready_cbs)) {
+		debug_rcu_head_unqueue(rhp);
 		local_bh_disable();
 		rhp->func(rhp);
 		local_bh_enable();
-- 
2.5.2

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH tip/core/rcu 0/88] Commits for 4.13 "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:00 +0200
  [PATCH tip/core/rcu 55/88] rcu: Eliminate the unused __rcu_is_watching() function "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 30/88] srcu: Document auto-expediting requirement "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 49/88] rcu: Move docbook comments out of rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 60/88] rcu: Move rcu_ftrace_dump() from rcupdate.h to rcu.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 57/88] rcu: Remove linux/debugobjects.h from rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 34/88] rcu: Update rcu_bootup_announce_oddness() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 13/88] rcu: Remove obsolete reference to synchronize_kernel() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 08/88] rcutorture: Update test scenarios based on new Kconfig dependencies "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 54/88] rcu: Move rcupdate.h to new empty-function style "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 24/88] rcutorture: Reduce CPUs dedicated to testing Classic SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 77/88] rcu: Remove #ifdef moving rcu_end_inkernel_boot from rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 78/88] rcu: Remove typecheck() from RCU locking wrapper functions "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 70/88] rcu: Refactor #includes from include/linux/rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 36/88] srcu: Print non-default exp_holdoff values at boot time "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 01/88] rcutorture: Add lockdep to one of the SRCU scenarios "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 51/88] rcu: Move expediting-related access/control out of rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 61/88] rcu: move rcupdate.h to the new true/false-function style "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 66/88] srcu: Prevent sdp->srcu_gp_seq_needed counter wrap "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 71/88] rcu: Convert rnp->lock wrappers to macros for SRCU use "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 52/88] rcu: Move torture-related definitions from rcupdate.h to rcu.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 58/88] rcu: Improve __call_rcu() debug-objects error message "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 73/88] srcu: Use rnp->lock wrappers to replace explicit memory barriers "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 45/88] rcu: Add memory barriers for NOCB leader wakeup "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 62/88] rcu: Move torture-related functions out of rcutiny.h and rcutree.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:10 +0200
  [PATCH tip/core/rcu 23/88] srcu: Make Classic and Tree SRCU announce themselves at bootup "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 38/88] rcu: Add lockdep_assert_held() teeth to tree_plugin.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 43/88] sched: Rely on synchronize_rcu_mult() de-duplication "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 67/88] srcu: Shrink srcu.h by moving docbook and private function "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 56/88] rcu: Move the RCU_SCHEDULER_ definitions from rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 32/88] rcu: Add preemptibility checks in rcu_sched_qs() and rcu_bh_qs() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 16/88] rcu: Make sync_rcu_preempt_exp_done() return bool "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 39/88] srcu: Make SRCU be once again optional "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 26/88] rcuperf: Set more user-friendly defaults "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 10/88] rcu: Complain if blocking in preemptible RCU read-side critical section "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 84/88] rcu: Eliminate NOCBs CPU-state Kconfig options "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 04/88] rcutorture: Add a scenario for Tiny SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 80/88] rcu: Remove SPARSE_RCU_POINTER Kconfig option "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 12/88] rcuperf: Remove conflicting Kconfig options "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 47/88] rcu: Flag need for rcu_node_tree.h and rcu_segcblist.h visibility "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 79/88] rcu: Remove the now-obsolete PROVE_RCU_REPEATEDLY Kconfig option "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 25/88] srcu: Shrink Tiny SRCU a bit more "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 75/88] rcu: Remove the RCU_KTHREAD_PRIO Kconfig option "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 85/88] rcu: Move RCU non-debug Kconfig options to kernel/rcu "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 65/88] rcu: move rcutiny.h to the new true/false-function style "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 74/88] rcu: Remove *_SLOW_* Kconfig options "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 86/88] rcu: Move RCU debug Kconfig options to kernel/rcu "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 63/88] rcu: Move rcu_request_urgent_qs_task() out of rcutiny.h and rcutree.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 42/88] rcu: Make synchronize_rcu_mult() check for duplicates "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 48/88] rcutorture: Don't wait for kernel when all builds fail "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 82/88] srcu: Remove Classic SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 76/88] rcu: Remove nohz_full full-system-idle state machine "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
    Re: [PATCH tip/core/rcu 76/88] rcu: Remove nohz_full full-system-idle  state machine Linus Torvalds <torvalds@linux-foundation.org> - 2017-05-26 01:10 +0200
      Re: [PATCH tip/core/rcu 76/88] rcu: Remove nohz_full  full-system-idle state machine "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 01:50 +0200
  [PATCH tip/core/rcu 07/88] rcutorture: Correctly handle CONFIG_RCU_TORTURE_TEST_* options "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 40/88] srcu: Shrink Tiny SRCU a bit "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 50/88] rcu: Move rcu_expedited and rcu_normal externs from rcupdate.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 87/88] rcu: Remove event tracing from Tiny RCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 53/88] rcu: Remove UINT_CMP_GE() and UINT_CMP_LT() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 27/88] srcu-cbmc: Use /usr/bin/awk instead of /bin/awk "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 72/88] rcu: Move rnp->lock wrappers for SRCU use "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 44/88] rcu: Use RCU_NOCB_WAKE rather than RCU_NOGP_WAKE "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 68/88] srcu: Apply trivial callback lists to shrink Tiny SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 41/88] srcu: Add DEBUG_OBJECTS_RCU_HEAD functionality "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 28/88] rcuperf: Add writer_holdoff boot parameter "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 59/88] rcu: Move rcu_is_nocb_cpu() from rcupdate.h to rcu.h "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 69/88] lockdep: Use consistent printing primitives "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 31/88] doc: Take tail recursion into account in RCU requirements "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 46/88] torture: Add --kconfig argument to kvm.sh "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 18/88] rcuperf: Add test for dynamically initialized srcu_struct "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 22/88] rcuperf: Add the ability to test tiny RCU flavors "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 02/88] rcutorture: Add three-level tree test for Tree SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 88/88] rcu: Remove RCU CPU stall warnings from Tiny RCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 03/88] rcutorture: Fix bug in reporting Kconfig mis-settings "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 06/88] rcu: Prevent rcu_barrier() from starting needless grace periods "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 37/88] rcu: Add lockdep_assert_held() teeth to tree.c "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 64/88] rcu: Move rcutiny.h to new empty-function style "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 81/88] srcu: Fix rcutorture-statistics typo "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 20/88] atomics: Add header comment so spin_unlock_wait() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:20 +0200
  [PATCH tip/core/rcu 19/88] doc/atomic_ops: Clarify smp_mb__{before,after}_atomic() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 21/88] docs: Fix typo in Documentation/memory-barriers.txt "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 15/88] rcuperf: Add a Kconfig-fragment file for Classic SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 35/88] srcu: Make exp_holdoff module parameter be static "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 09/88] srcu: Eliminate possibility of destructive counter overflow "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 29/88] rcutorture: Add "git diff" output to testid.txt file "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 11/88] rcuperf: Defer expedited/normal check to end of test "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 17/88] checkpatch: Remove checks for expedited grace periods "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 05/88] rcutorture: Add a scenario for Classic SRCU "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 14/88] rcuperf: Add ability to performance-test call_rcu() and friends "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200
  [PATCH tip/core/rcu 33/88] rcu: Print out rcupdate.c non-default boot-time settings "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2017-05-26 00:30 +0200

csiph-web