]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rcutorture: Dump writer stack if stalled
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 30 Aug 2017 17:40:17 +0000 (10:40 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 9 Oct 2017 21:26:09 +0000 (14:26 -0700)
Right now, rcutorture warns if an rcu_torture_writer() kthread stalls,
but this warning is not always all that helpful.  This commit therefore
makes the first such warning include a stack dump.

This in turn requires that sched_show_task() be exported to GPL modules,
so this commit makes that change as well.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/rcutorture.c
kernel/sched/core.c

index 0273bc0a8586452f3562c20c2c8968ef0e2edf90..362eb2f78b3cd1c8f0ec8115f8aba3cf1c39960d 100644 (file)
@@ -51,6 +51,7 @@
 #include <asm/byteorder.h>
 #include <linux/torture.h>
 #include <linux/vmalloc.h>
+#include <linux/sched/debug.h>
 
 #include "rcu.h"
 
@@ -1240,6 +1241,7 @@ rcu_torture_stats_print(void)
        long pipesummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 };
        long batchsummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 };
        static unsigned long rtcv_snap = ULONG_MAX;
+       static bool splatted;
        struct task_struct *wtp;
 
        for_each_possible_cpu(cpu) {
@@ -1325,6 +1327,10 @@ rcu_torture_stats_print(void)
                         gpnum, completed, flags,
                         wtp == NULL ? ~0UL : wtp->state,
                         wtp == NULL ? -1 : (int)task_cpu(wtp));
+               if (!splatted && wtp) {
+                       sched_show_task(wtp);
+                       splatted = true;
+               }
                show_rcu_gp_kthreads();
                rcu_ftrace_dump(DUMP_ALL);
        }
index d17c5da523a0bc817a6b32413ee7e0ba3e7a6b2e..7ae0151dcc1dd600e0cd0085f390a0dfe8fbe45c 100644 (file)
@@ -5165,6 +5165,7 @@ void sched_show_task(struct task_struct *p)
        show_stack(p, NULL);
        put_task_stack(p);
 }
+EXPORT_SYMBOL_GPL(sched_show_task);
 
 static inline bool
 state_filter_match(unsigned long state_filter, struct task_struct *p)