rcu: Add RCU_CPU_STALL_VERBOSE to dump detailed per-task information
When RCU detects a grace-period stall, it currently just prints out the PID of any tasks doing the stalling. This patch adds RCU_CPU_STALL_VERBOSE, which enables the more-verbose reporting from sched_show_task(). Suggested-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: laijs@cn.fujitsu.com Cc: dipankar@in.ibm.com Cc: mathieu.desnoyers@polymtl.ca Cc: josh@joshtriplett.org Cc: dvhltc@us.ibm.com Cc: niv@us.ibm.com Cc: peterz@infradead.org Cc: rostedt@goodmis.org Cc: Valdis.Kletnieks@vt.edu Cc: dhowells@redhat.com LKML-Reference: <1266887105-1528-21-git-send-email-paulmck@linux.vnet.ibm.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									6155fec92e
								
							
						
					
					
						commit
						1ed509a225
					
				| @ -489,6 +489,10 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | ||||
| 	       smp_processor_id(), (long)(jiffies - rsp->gp_start)); | ||||
| 	trigger_all_cpu_backtrace(); | ||||
| 
 | ||||
| 	/* If so configured, complain about tasks blocking the grace period. */ | ||||
| 
 | ||||
| 	rcu_print_detail_task_stall(rsp); | ||||
| 
 | ||||
| 	force_quiescent_state(rsp, 0);  /* Kick them all. */ | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -352,6 +352,7 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, | ||||
| 				      unsigned long flags); | ||||
| #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||||
| #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||||
| static void rcu_print_detail_task_stall(struct rcu_state *rsp); | ||||
| static void rcu_print_task_stall(struct rcu_node *rnp); | ||||
| #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | ||||
| static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); | ||||
|  | ||||
| @ -312,6 +312,50 @@ EXPORT_SYMBOL_GPL(__rcu_read_unlock); | ||||
| 
 | ||||
| #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||||
| 
 | ||||
| #ifdef CONFIG_RCU_CPU_STALL_VERBOSE | ||||
| 
 | ||||
| /*
 | ||||
|  * Dump detailed information for all tasks blocking the current RCU | ||||
|  * grace period on the specified rcu_node structure. | ||||
|  */ | ||||
| static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp) | ||||
| { | ||||
| 	unsigned long flags; | ||||
| 	struct list_head *lp; | ||||
| 	int phase; | ||||
| 	struct task_struct *t; | ||||
| 
 | ||||
| 	if (rcu_preempted_readers(rnp)) { | ||||
| 		raw_spin_lock_irqsave(&rnp->lock, flags); | ||||
| 		phase = rnp->gpnum & 0x1; | ||||
| 		lp = &rnp->blocked_tasks[phase]; | ||||
| 		list_for_each_entry(t, lp, rcu_node_entry) | ||||
| 			sched_show_task(t); | ||||
| 		raw_spin_unlock_irqrestore(&rnp->lock, flags); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Dump detailed information for all tasks blocking the current RCU | ||||
|  * grace period. | ||||
|  */ | ||||
| static void rcu_print_detail_task_stall(struct rcu_state *rsp) | ||||
| { | ||||
| 	struct rcu_node *rnp = rcu_get_root(rsp); | ||||
| 
 | ||||
| 	rcu_print_detail_task_stall_rnp(rnp); | ||||
| 	rcu_for_each_leaf_node(rsp, rnp) | ||||
| 		rcu_print_detail_task_stall_rnp(rnp); | ||||
| } | ||||
| 
 | ||||
| #else /* #ifdef CONFIG_RCU_CPU_STALL_VERBOSE */ | ||||
| 
 | ||||
| static void rcu_print_detail_task_stall(struct rcu_state *rsp) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| #endif /* #else #ifdef CONFIG_RCU_CPU_STALL_VERBOSE */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Scan the current list of tasks blocked within RCU read-side critical | ||||
|  * sections, printing out the tid of each. | ||||
| @ -760,6 +804,14 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | ||||
| 
 | ||||
| #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||||
| 
 | ||||
| /*
 | ||||
|  * Because preemptable RCU does not exist, we never have to check for | ||||
|  * tasks blocked within RCU read-side critical sections. | ||||
|  */ | ||||
| static void rcu_print_detail_task_stall(struct rcu_state *rsp) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Because preemptable RCU does not exist, we never have to check for | ||||
|  * tasks blocked within RCU read-side critical sections. | ||||
|  | ||||
| @ -781,6 +781,18 @@ config RCU_CPU_STALL_DETECTOR | ||||
| 
 | ||||
| 	  Say Y if you are unsure. | ||||
| 
 | ||||
| config RCU_CPU_STALL_VERBOSE | ||||
| 	bool "Print additional per-task information for RCU_CPU_STALL_DETECTOR" | ||||
| 	depends on RCU_CPU_STALL_DETECTOR && TREE_PREEMPT_RCU | ||||
| 	default n | ||||
| 	help | ||||
| 	  This option causes RCU to printk detailed per-task information | ||||
| 	  for any tasks that are stalling the current RCU grace period. | ||||
| 
 | ||||
| 	  Say N if you are unsure. | ||||
| 
 | ||||
| 	  Say Y if you want to enable such checks. | ||||
| 
 | ||||
| config KPROBES_SANITY_TEST | ||||
| 	bool "Kprobes sanity tests" | ||||
| 	depends on DEBUG_KERNEL | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user