diff options
Diffstat (limited to 'kernel/rcutree.h')
| -rw-r--r-- | kernel/rcutree.h | 26 | 
1 files changed, 12 insertions, 14 deletions
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index 849ce9ec51f..fddff92d667 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h @@ -84,9 +84,10 @@   * Dynticks per-CPU state.   */  struct rcu_dynticks { -	int dynticks_nesting;	/* Track irq/process nesting level. */ -	int dynticks_nmi_nesting; /* Track NMI nesting level. */ -	atomic_t dynticks;	/* Even value for dynticks-idle, else odd. */ +	long long dynticks_nesting; /* Track irq/process nesting level. */ +				    /* Process level is worth LLONG_MAX/2. */ +	int dynticks_nmi_nesting;   /* Track NMI nesting level. */ +	atomic_t dynticks;	    /* Even value for idle, else odd. */  };  /* RCU's kthread states for tracing. */ @@ -274,16 +275,12 @@ struct rcu_data {  					/* did other CPU force QS recently? */  	long		blimit;		/* Upper limit on a processed batch */ -#ifdef CONFIG_NO_HZ  	/* 3) dynticks interface. */  	struct rcu_dynticks *dynticks;	/* Shared per-CPU dynticks state. */  	int dynticks_snap;		/* Per-GP tracking for dynticks. */ -#endif /* #ifdef CONFIG_NO_HZ */  	/* 4) reasons this CPU needed to be kicked by force_quiescent_state */ -#ifdef CONFIG_NO_HZ  	unsigned long dynticks_fqs;	/* Kicked due to dynticks idle. */ -#endif /* #ifdef CONFIG_NO_HZ */  	unsigned long offline_fqs;	/* Kicked due to being offline. */  	unsigned long resched_ipi;	/* Sent a resched IPI. */ @@ -302,16 +299,12 @@ struct rcu_data {  	struct rcu_state *rsp;  }; -/* Values for signaled field in struct rcu_state. */ +/* Values for fqs_state field in struct rcu_state. */  #define RCU_GP_IDLE		0	/* No grace period in progress. */  #define RCU_GP_INIT		1	/* Grace period being initialized. */  #define RCU_SAVE_DYNTICK	2	/* Need to scan dyntick state. */  #define RCU_FORCE_QS		3	/* Need to force quiescent state. */ -#ifdef CONFIG_NO_HZ  #define RCU_SIGNAL_INIT		RCU_SAVE_DYNTICK -#else /* #ifdef CONFIG_NO_HZ */ -#define RCU_SIGNAL_INIT		RCU_FORCE_QS -#endif /* #else #ifdef CONFIG_NO_HZ */  #define RCU_JIFFIES_TILL_FORCE_QS	 3	/* for rsp->jiffies_force_qs */ @@ -361,7 +354,7 @@ struct rcu_state {  	/* The following fields are guarded by the root rcu_node's lock. */ -	u8	signaled ____cacheline_internodealigned_in_smp; +	u8	fqs_state ____cacheline_internodealigned_in_smp;  						/* Force QS state. */  	u8	fqs_active;			/* force_quiescent_state() */  						/*  is running. */ @@ -451,7 +444,8 @@ static void rcu_preempt_check_callbacks(int cpu);  static void rcu_preempt_process_callbacks(void);  void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu));  #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) -static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp); +static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp, +			       bool wake);  #endif /* #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) */  static int rcu_preempt_pending(int cpu);  static int rcu_preempt_needs_cpu(int cpu); @@ -461,6 +455,7 @@ static void __init __rcu_init_preempt(void);  static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags);  static void rcu_preempt_boost_start_gp(struct rcu_node *rnp);  static void invoke_rcu_callbacks_kthread(void); +static bool rcu_is_callbacks_kthread(void);  #ifdef CONFIG_RCU_BOOST  static void rcu_preempt_do_callbacks(void);  static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, @@ -473,5 +468,8 @@ static void rcu_yield(void (*f)(unsigned long), unsigned long arg);  #endif /* #ifdef CONFIG_RCU_BOOST */  static void rcu_cpu_kthread_setrt(int cpu, int to_rt);  static void __cpuinit rcu_prepare_kthreads(int cpu); +static void rcu_prepare_for_idle_init(int cpu); +static void rcu_cleanup_after_idle(int cpu); +static void rcu_prepare_for_idle(int cpu);  #endif /* #ifndef RCU_TREE_NONCORE */  |