forked from mirrors/linux
		
	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:
		
							parent
							
								
									0ee5623f9a
								
							
						
					
					
						commit
						a00e0d714f
					
				
					 6 changed files with 17 additions and 88 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue