rcu: Add sysrq rcu_node-dump capability
Life is hard if RCU manages to get stuck without triggering RCU CPU stall warnings or triggering the rcu_check_gp_start_stall() checks for failing to start a grace period. This commit therefore adds a boot-time-selectable sysrq key (commandeering "y") that allows manually dumping Tree RCU state. The new rcutree.sysrq_rcu kernel boot parameter must be set for this sysrq to be available. Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
This commit is contained in:
parent
3b6505fd8e
commit
2ccaff10f7
@ -3721,6 +3721,11 @@
|
|||||||
This wake_up() will be accompanied by a
|
This wake_up() will be accompanied by a
|
||||||
WARN_ONCE() splat and an ftrace_dump().
|
WARN_ONCE() splat and an ftrace_dump().
|
||||||
|
|
||||||
|
rcutree.sysrq_rcu= [KNL]
|
||||||
|
Commandeer a sysrq key to dump out Tree RCU's
|
||||||
|
rcu_node tree with an eye towards determining
|
||||||
|
why a new grace period has not yet started.
|
||||||
|
|
||||||
rcuperf.gp_async= [KNL]
|
rcuperf.gp_async= [KNL]
|
||||||
Measure performance of asynchronous
|
Measure performance of asynchronous
|
||||||
grace-period primitives such as call_rcu().
|
grace-period primitives such as call_rcu().
|
||||||
|
@ -62,6 +62,7 @@
|
|||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
#include <linux/tick.h>
|
#include <linux/tick.h>
|
||||||
|
#include <linux/sysrq.h>
|
||||||
|
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "rcu.h"
|
#include "rcu.h"
|
||||||
@ -115,6 +116,9 @@ int num_rcu_lvl[] = NUM_RCU_LVL_INIT;
|
|||||||
int rcu_num_nodes __read_mostly = NUM_RCU_NODES; /* Total # rcu_nodes in use. */
|
int rcu_num_nodes __read_mostly = NUM_RCU_NODES; /* Total # rcu_nodes in use. */
|
||||||
/* panic() on RCU Stall sysctl. */
|
/* panic() on RCU Stall sysctl. */
|
||||||
int sysctl_panic_on_rcu_stall __read_mostly;
|
int sysctl_panic_on_rcu_stall __read_mostly;
|
||||||
|
/* Commandeer a sysrq key to dump RCU's tree. */
|
||||||
|
static bool sysrq_rcu;
|
||||||
|
module_param(sysrq_rcu, bool, 0444);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The rcu_scheduler_active variable is initialized to the value
|
* The rcu_scheduler_active variable is initialized to the value
|
||||||
@ -577,6 +581,27 @@ void show_rcu_gp_kthreads(void)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);
|
EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);
|
||||||
|
|
||||||
|
/* Dump grace-period-request information due to commandeered sysrq. */
|
||||||
|
static void sysrq_show_rcu(int key)
|
||||||
|
{
|
||||||
|
show_rcu_gp_kthreads();
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sysrq_key_op sysrq_rcudump_op = {
|
||||||
|
.handler = sysrq_show_rcu,
|
||||||
|
.help_msg = "show-rcu(y)",
|
||||||
|
.action_msg = "Show RCU tree",
|
||||||
|
.enable_mask = SYSRQ_ENABLE_DUMP,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init rcu_sysrq_init(void)
|
||||||
|
{
|
||||||
|
if (sysrq_rcu)
|
||||||
|
return register_sysrq_key('y', &sysrq_rcudump_op);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
early_initcall(rcu_sysrq_init);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send along grace-period-related data for rcutorture diagnostics.
|
* Send along grace-period-related data for rcutorture diagnostics.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user