Commit 1ed509a225008c9e8c0644fbd22168e09a7383a0
Committed by
Ingo Molnar
1 parent
6155fec92e
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>
Showing 4 changed files with 69 additions and 0 deletions Side-by-side Diff
kernel/rcutree.c
... | ... | @@ -489,6 +489,10 @@ |
489 | 489 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); |
490 | 490 | trigger_all_cpu_backtrace(); |
491 | 491 | |
492 | + /* If so configured, complain about tasks blocking the grace period. */ | |
493 | + | |
494 | + rcu_print_detail_task_stall(rsp); | |
495 | + | |
492 | 496 | force_quiescent_state(rsp, 0); /* Kick them all. */ |
493 | 497 | } |
494 | 498 |
kernel/rcutree.h
... | ... | @@ -352,6 +352,7 @@ |
352 | 352 | unsigned long flags); |
353 | 353 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ |
354 | 354 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
355 | +static void rcu_print_detail_task_stall(struct rcu_state *rsp); | |
355 | 356 | static void rcu_print_task_stall(struct rcu_node *rnp); |
356 | 357 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ |
357 | 358 | static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); |
kernel/rcutree_plugin.h
... | ... | @@ -312,7 +312,51 @@ |
312 | 312 | |
313 | 313 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
314 | 314 | |
315 | +#ifdef CONFIG_RCU_CPU_STALL_VERBOSE | |
316 | + | |
315 | 317 | /* |
318 | + * Dump detailed information for all tasks blocking the current RCU | |
319 | + * grace period on the specified rcu_node structure. | |
320 | + */ | |
321 | +static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp) | |
322 | +{ | |
323 | + unsigned long flags; | |
324 | + struct list_head *lp; | |
325 | + int phase; | |
326 | + struct task_struct *t; | |
327 | + | |
328 | + if (rcu_preempted_readers(rnp)) { | |
329 | + raw_spin_lock_irqsave(&rnp->lock, flags); | |
330 | + phase = rnp->gpnum & 0x1; | |
331 | + lp = &rnp->blocked_tasks[phase]; | |
332 | + list_for_each_entry(t, lp, rcu_node_entry) | |
333 | + sched_show_task(t); | |
334 | + raw_spin_unlock_irqrestore(&rnp->lock, flags); | |
335 | + } | |
336 | +} | |
337 | + | |
338 | +/* | |
339 | + * Dump detailed information for all tasks blocking the current RCU | |
340 | + * grace period. | |
341 | + */ | |
342 | +static void rcu_print_detail_task_stall(struct rcu_state *rsp) | |
343 | +{ | |
344 | + struct rcu_node *rnp = rcu_get_root(rsp); | |
345 | + | |
346 | + rcu_print_detail_task_stall_rnp(rnp); | |
347 | + rcu_for_each_leaf_node(rsp, rnp) | |
348 | + rcu_print_detail_task_stall_rnp(rnp); | |
349 | +} | |
350 | + | |
351 | +#else /* #ifdef CONFIG_RCU_CPU_STALL_VERBOSE */ | |
352 | + | |
353 | +static void rcu_print_detail_task_stall(struct rcu_state *rsp) | |
354 | +{ | |
355 | +} | |
356 | + | |
357 | +#endif /* #else #ifdef CONFIG_RCU_CPU_STALL_VERBOSE */ | |
358 | + | |
359 | +/* | |
316 | 360 | * Scan the current list of tasks blocked within RCU read-side critical |
317 | 361 | * sections, printing out the tid of each. |
318 | 362 | */ |
... | ... | @@ -759,6 +803,14 @@ |
759 | 803 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ |
760 | 804 | |
761 | 805 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
806 | + | |
807 | +/* | |
808 | + * Because preemptable RCU does not exist, we never have to check for | |
809 | + * tasks blocked within RCU read-side critical sections. | |
810 | + */ | |
811 | +static void rcu_print_detail_task_stall(struct rcu_state *rsp) | |
812 | +{ | |
813 | +} | |
762 | 814 | |
763 | 815 | /* |
764 | 816 | * Because preemptable RCU does not exist, we never have to check for |
lib/Kconfig.debug
... | ... | @@ -781,6 +781,18 @@ |
781 | 781 | |
782 | 782 | Say Y if you are unsure. |
783 | 783 | |
784 | +config RCU_CPU_STALL_VERBOSE | |
785 | + bool "Print additional per-task information for RCU_CPU_STALL_DETECTOR" | |
786 | + depends on RCU_CPU_STALL_DETECTOR && TREE_PREEMPT_RCU | |
787 | + default n | |
788 | + help | |
789 | + This option causes RCU to printk detailed per-task information | |
790 | + for any tasks that are stalling the current RCU grace period. | |
791 | + | |
792 | + Say N if you are unsure. | |
793 | + | |
794 | + Say Y if you want to enable such checks. | |
795 | + | |
784 | 796 | config KPROBES_SANITY_TEST |
785 | 797 | bool "Kprobes sanity tests" |
786 | 798 | depends on DEBUG_KERNEL |