rcu: Remove conditional compilation for RCU CPU stall warnings

The RCU CPU stall warnings can now be controlled using the
rcu_cpu_stall_suppress boot-time parameter or via the same parameter
from sysfs.  There is therefore no longer any reason to have
kernel config parameters for this feature.  This commit therefore
removes the RCU_CPU_STALL_DETECTOR and RCU_CPU_STALL_DETECTOR_RUNNABLE
kernel config parameters.  The RCU_CPU_STALL_TIMEOUT parameter remains
to allow the timeout to be tuned and the RCU_CPU_STALL_VERBOSE parameter
remains to allow task-stall information to be suppressed if desired.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
Paul E. McKenney 2011-02-08 17:14:39 -08:00
parent 0ee5623f9a
commit a00e0d714f
6 changed files with 17 additions and 88 deletions

View File

@ -21,7 +21,7 @@ rcu.txt
RTFP.txt RTFP.txt
- List of RCU papers (bibliography) going back to 1980. - List of RCU papers (bibliography) going back to 1980.
stallwarn.txt stallwarn.txt
- RCU CPU stall warnings (CONFIG_RCU_CPU_STALL_DETECTOR) - RCU CPU stall warnings (module parameter rcu_cpu_stall_suppress)
torture.txt torture.txt
- RCU Torture Test Operation (CONFIG_RCU_TORTURE_TEST) - RCU Torture Test Operation (CONFIG_RCU_TORTURE_TEST)
trace.txt trace.txt

View File

@ -1,22 +1,25 @@
Using RCU's CPU Stall Detector Using RCU's CPU Stall Detector
The CONFIG_RCU_CPU_STALL_DETECTOR kernel config parameter enables The rcu_cpu_stall_suppress module parameter enables RCU's CPU stall
RCU's CPU stall detector, which detects conditions that unduly delay detector, which detects conditions that unduly delay RCU grace periods.
RCU grace periods. The stall detector's idea of what constitutes This module parameter enables CPU stall detection by default, but
"unduly delayed" is controlled by a set of C preprocessor macros: may be overridden via boot-time parameter or at runtime via sysfs.
The stall detector's idea of what constitutes "unduly delayed" is
controlled by a set of kernel configuration variables and cpp macros:
RCU_SECONDS_TILL_STALL_CHECK CONFIG_RCU_CPU_STALL_TIMEOUT
This macro defines the period of time that RCU will wait from This kernel configuration parameter defines the period of time
the beginning of a grace period until it issues an RCU CPU that RCU will wait from the beginning of a grace period until it
stall warning. This time period is normally ten seconds. issues an RCU CPU stall warning. This time period is normally
ten seconds.
RCU_SECONDS_TILL_STALL_RECHECK RCU_SECONDS_TILL_STALL_RECHECK
This macro defines the period of time that RCU will wait after This macro defines the period of time that RCU will wait after
issuing a stall warning until it issues another stall warning issuing a stall warning until it issues another stall warning
for the same stall. This time period is normally set to thirty for the same stall. This time period is normally set to three
seconds. times the check interval plus thirty seconds.
RCU_STALL_RAT_DELAY RCU_STALL_RAT_DELAY

View File

@ -140,10 +140,8 @@ module_param(blimit, int, 0);
module_param(qhimark, int, 0); module_param(qhimark, int, 0);
module_param(qlowmark, int, 0); module_param(qlowmark, int, 0);
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR int rcu_cpu_stall_suppress __read_mostly;
int rcu_cpu_stall_suppress __read_mostly = RCU_CPU_STALL_SUPPRESS_INIT;
module_param(rcu_cpu_stall_suppress, int, 0644); module_param(rcu_cpu_stall_suppress, int, 0644);
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
static void force_quiescent_state(struct rcu_state *rsp, int relaxed); static void force_quiescent_state(struct rcu_state *rsp, int relaxed);
static int rcu_pending(int cpu); static int rcu_pending(int cpu);
@ -450,8 +448,6 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
#endif /* #else #ifdef CONFIG_NO_HZ */ #endif /* #else #ifdef CONFIG_NO_HZ */
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
int rcu_cpu_stall_suppress __read_mostly; int rcu_cpu_stall_suppress __read_mostly;
static void record_gp_stall_check_time(struct rcu_state *rsp) static void record_gp_stall_check_time(struct rcu_state *rsp)
@ -587,26 +583,6 @@ static void __init check_cpu_stall_init(void)
atomic_notifier_chain_register(&panic_notifier_list, &rcu_panic_block); atomic_notifier_chain_register(&panic_notifier_list, &rcu_panic_block);
} }
#else /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
static void record_gp_stall_check_time(struct rcu_state *rsp)
{
}
static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp)
{
}
void rcu_cpu_stall_reset(void)
{
}
static void __init check_cpu_stall_init(void)
{
}
#endif /* #else #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
/* /*
* Update CPU-local rcu_data state to record the newly noticed grace period. * Update CPU-local rcu_data state to record the newly noticed grace period.
* This is used both when we started the grace period and when we notice * This is used both when we started the grace period and when we notice

View File

@ -254,7 +254,6 @@ struct rcu_data {
#endif /* #else #ifdef CONFIG_NO_HZ */ #endif /* #else #ifdef CONFIG_NO_HZ */
#define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
#ifdef CONFIG_PROVE_RCU #ifdef CONFIG_PROVE_RCU
#define RCU_STALL_DELAY_DELTA (5 * HZ) #define RCU_STALL_DELAY_DELTA (5 * HZ)
@ -272,13 +271,6 @@ struct rcu_data {
/* scheduling clock irq */ /* scheduling clock irq */
/* before ratting on them. */ /* before ratting on them. */
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR_RUNNABLE
#define RCU_CPU_STALL_SUPPRESS_INIT 0
#else
#define RCU_CPU_STALL_SUPPRESS_INIT 1
#endif
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
/* /*
* RCU global state, including node hierarchy. This hierarchy is * RCU global state, including node hierarchy. This hierarchy is
@ -325,12 +317,10 @@ struct rcu_state {
/* due to lock unavailable. */ /* due to lock unavailable. */
unsigned long n_force_qs_ngp; /* Number of calls leaving */ unsigned long n_force_qs_ngp; /* Number of calls leaving */
/* due to no GP active. */ /* due to no GP active. */
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
unsigned long gp_start; /* Time at which GP started, */ unsigned long gp_start; /* Time at which GP started, */
/* but in jiffies. */ /* but in jiffies. */
unsigned long jiffies_stall; /* Time at which to check */ unsigned long jiffies_stall; /* Time at which to check */
/* for CPU stalls. */ /* for CPU stalls. */
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
char *name; /* Name of structure. */ char *name; /* Name of structure. */
}; };
@ -366,11 +356,9 @@ static int rcu_preempted_readers(struct rcu_node *rnp);
static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp,
unsigned long flags); unsigned long flags);
#endif /* #ifdef CONFIG_HOTPLUG_CPU */ #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_detail_task_stall(struct rcu_state *rsp);
static void rcu_print_task_stall(struct rcu_node *rnp); static void rcu_print_task_stall(struct rcu_node *rnp);
static void rcu_preempt_stall_reset(void); static void rcu_preempt_stall_reset(void);
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp);
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static int rcu_preempt_offline_tasks(struct rcu_state *rsp, static int rcu_preempt_offline_tasks(struct rcu_state *rsp,

View File

@ -54,10 +54,6 @@ static void __init rcu_bootup_announce_oddness(void)
#ifdef CONFIG_RCU_TORTURE_TEST_RUNNABLE #ifdef CONFIG_RCU_TORTURE_TEST_RUNNABLE
printk(KERN_INFO "\tRCU torture testing starts during boot.\n"); printk(KERN_INFO "\tRCU torture testing starts during boot.\n");
#endif #endif
#ifndef CONFIG_RCU_CPU_STALL_DETECTOR
printk(KERN_INFO
"\tRCU-based detection of stalled CPUs is disabled.\n");
#endif
#if defined(CONFIG_TREE_PREEMPT_RCU) && !defined(CONFIG_RCU_CPU_STALL_VERBOSE) #if defined(CONFIG_TREE_PREEMPT_RCU) && !defined(CONFIG_RCU_CPU_STALL_VERBOSE)
printk(KERN_INFO "\tVerbose stalled-CPUs detection is disabled.\n"); printk(KERN_INFO "\tVerbose stalled-CPUs detection is disabled.\n");
#endif #endif
@ -356,8 +352,6 @@ void __rcu_read_unlock(void)
} }
EXPORT_SYMBOL_GPL(__rcu_read_unlock); EXPORT_SYMBOL_GPL(__rcu_read_unlock);
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
#ifdef CONFIG_RCU_CPU_STALL_VERBOSE #ifdef CONFIG_RCU_CPU_STALL_VERBOSE
/* /*
@ -430,8 +424,6 @@ static void rcu_preempt_stall_reset(void)
rcu_preempt_state.jiffies_stall = jiffies + ULONG_MAX / 2; rcu_preempt_state.jiffies_stall = jiffies + ULONG_MAX / 2;
} }
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
/* /*
* Check that the list of blocked tasks for the newly completed grace * Check that the list of blocked tasks for the newly completed grace
* period is in fact empty. It is a serious bug to complete a grace * period is in fact empty. It is a serious bug to complete a grace
@ -862,8 +854,6 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
#endif /* #ifdef CONFIG_HOTPLUG_CPU */ #endif /* #ifdef CONFIG_HOTPLUG_CPU */
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
/* /*
* Because preemptable RCU does not exist, we never have to check for * Because preemptable RCU does not exist, we never have to check for
* tasks blocked within RCU read-side critical sections. * tasks blocked within RCU read-side critical sections.
@ -888,8 +878,6 @@ static void rcu_preempt_stall_reset(void)
{ {
} }
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
/* /*
* Because there is no preemptable RCU, there can be no readers blocked, * Because there is no preemptable RCU, there can be no readers blocked,
* so there is no need to check for blocked tasks. So check only for * so there is no need to check for blocked tasks. So check only for

View File

@ -875,22 +875,9 @@ config RCU_TORTURE_TEST_RUNNABLE
Say N here if you want the RCU torture tests to start only Say N here if you want the RCU torture tests to start only
after being manually enabled via /proc. after being manually enabled via /proc.
config RCU_CPU_STALL_DETECTOR
bool "Check for stalled CPUs delaying RCU grace periods"
depends on TREE_RCU || TREE_PREEMPT_RCU
default y
help
This option causes RCU to printk information on which
CPUs are delaying the current grace period, but only when
the grace period extends for excessive time periods.
Say N if you want to disable such checks.
Say Y if you are unsure.
config RCU_CPU_STALL_TIMEOUT config RCU_CPU_STALL_TIMEOUT
int "RCU CPU stall timeout in seconds" int "RCU CPU stall timeout in seconds"
depends on RCU_CPU_STALL_DETECTOR depends on TREE_RCU || TREE_PREEMPT_RCU
range 3 300 range 3 300
default 60 default 60
help help
@ -899,22 +886,9 @@ config RCU_CPU_STALL_TIMEOUT
RCU grace period persists, additional CPU stall warnings are RCU grace period persists, additional CPU stall warnings are
printed at more widely spaced intervals. printed at more widely spaced intervals.
config RCU_CPU_STALL_DETECTOR_RUNNABLE
bool "RCU CPU stall checking starts automatically at boot"
depends on RCU_CPU_STALL_DETECTOR
default y
help
If set, start checking for RCU CPU stalls immediately on
boot. Otherwise, RCU CPU stall checking must be manually
enabled.
Say Y if you are unsure.
Say N if you wish to suppress RCU CPU stall checking during boot.
config RCU_CPU_STALL_VERBOSE config RCU_CPU_STALL_VERBOSE
bool "Print additional per-task information for RCU_CPU_STALL_DETECTOR" bool "Print additional per-task information for RCU_CPU_STALL_DETECTOR"
depends on RCU_CPU_STALL_DETECTOR && TREE_PREEMPT_RCU depends on TREE_PREEMPT_RCU
default y default y
help help
This option causes RCU to printk detailed per-task information This option causes RCU to printk detailed per-task information