Merge branches 'doc.2015.02.26a', 'earlycb.2015.03.03a', 'fixes.2015.03.03a', 'gpexp.2015.02.26a', 'hotplug.2015.03.20a', 'sysidle.2015.02.26b' and 'tiny.2015.02.26a' into HEAD
doc.2015.02.26a: Documentation changes earlycb.2015.03.03a: Permit early-boot RCU callbacks fixes.2015.03.03a: Miscellaneous fixes gpexp.2015.02.26a: In-kernel expediting of normal grace periods hotplug.2015.03.20a: CPU hotplug fixes sysidle.2015.02.26b: NO_HZ_FULL_SYSIDLE fixes tiny.2015.02.26a: TINY_RCU fixes
This commit is contained in:
commit
42528795ac
26 changed files with 863 additions and 377 deletions
|
|
@ -95,6 +95,10 @@ enum {
|
|||
* Called on the new cpu, just before
|
||||
* enabling interrupts. Must not sleep,
|
||||
* must not fail */
|
||||
#define CPU_DYING_IDLE 0x000B /* CPU (unsigned)v dying, reached
|
||||
* idle loop. */
|
||||
#define CPU_BROKEN 0x000C /* CPU (unsigned)v did not die properly,
|
||||
* perhaps due to preemption. */
|
||||
|
||||
/* Used for CPU hotplug events occurring while tasks are frozen due to a suspend
|
||||
* operation in progress
|
||||
|
|
@ -271,4 +275,14 @@ void arch_cpu_idle_enter(void);
|
|||
void arch_cpu_idle_exit(void);
|
||||
void arch_cpu_idle_dead(void);
|
||||
|
||||
DECLARE_PER_CPU(bool, cpu_dead_idle);
|
||||
|
||||
int cpu_report_state(int cpu);
|
||||
int cpu_check_up_prepare(int cpu);
|
||||
void cpu_set_state_online(int cpu);
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
bool cpu_wait_death(unsigned int cpu, int seconds);
|
||||
bool cpu_report_death(void);
|
||||
#endif /* #ifdef CONFIG_HOTPLUG_CPU */
|
||||
|
||||
#endif /* _LINUX_CPU_H_ */
|
||||
|
|
|
|||
|
|
@ -531,8 +531,13 @@ do { \
|
|||
# define might_lock_read(lock) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROVE_RCU
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
void lockdep_rcu_suspicious(const char *file, const int line, const char *s);
|
||||
#else
|
||||
static inline void
|
||||
lockdep_rcu_suspicious(const char *file, const int line, const char *s)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_LOCKDEP_H */
|
||||
|
|
|
|||
|
|
@ -48,6 +48,26 @@
|
|||
|
||||
extern int rcu_expedited; /* for sysctl */
|
||||
|
||||
#ifdef CONFIG_TINY_RCU
|
||||
/* Tiny RCU doesn't expedite, as its purpose in life is instead to be tiny. */
|
||||
static inline bool rcu_gp_is_expedited(void) /* Internal RCU use. */
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void rcu_expedite_gp(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void rcu_unexpedite_gp(void)
|
||||
{
|
||||
}
|
||||
#else /* #ifdef CONFIG_TINY_RCU */
|
||||
bool rcu_gp_is_expedited(void); /* Internal RCU use. */
|
||||
void rcu_expedite_gp(void);
|
||||
void rcu_unexpedite_gp(void);
|
||||
#endif /* #else #ifdef CONFIG_TINY_RCU */
|
||||
|
||||
enum rcutorture_type {
|
||||
RCU_FLAVOR,
|
||||
RCU_BH_FLAVOR,
|
||||
|
|
@ -195,6 +215,15 @@ void call_rcu_sched(struct rcu_head *head,
|
|||
|
||||
void synchronize_sched(void);
|
||||
|
||||
/*
|
||||
* Structure allowing asynchronous waiting on RCU.
|
||||
*/
|
||||
struct rcu_synchronize {
|
||||
struct rcu_head head;
|
||||
struct completion completion;
|
||||
};
|
||||
void wakeme_after_rcu(struct rcu_head *head);
|
||||
|
||||
/**
|
||||
* call_rcu_tasks() - Queue an RCU for invocation task-based grace period
|
||||
* @head: structure to be used for queueing the RCU updates.
|
||||
|
|
@ -258,6 +287,7 @@ static inline int rcu_preempt_depth(void)
|
|||
|
||||
/* Internal to kernel */
|
||||
void rcu_init(void);
|
||||
void rcu_end_inkernel_boot(void);
|
||||
void rcu_sched_qs(void);
|
||||
void rcu_bh_qs(void);
|
||||
void rcu_check_callbacks(int user);
|
||||
|
|
@ -266,6 +296,8 @@ void rcu_idle_enter(void);
|
|||
void rcu_idle_exit(void);
|
||||
void rcu_irq_enter(void);
|
||||
void rcu_irq_exit(void);
|
||||
int rcu_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu);
|
||||
|
||||
#ifdef CONFIG_RCU_STALL_COMMON
|
||||
void rcu_sysrq_start(void);
|
||||
|
|
@ -720,7 +752,7 @@ static inline void rcu_preempt_sleep_check(void)
|
|||
* annotated as __rcu.
|
||||
*/
|
||||
#define rcu_dereference_check(p, c) \
|
||||
__rcu_dereference_check((p), rcu_read_lock_held() || (c), __rcu)
|
||||
__rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
|
||||
|
||||
/**
|
||||
* rcu_dereference_bh_check() - rcu_dereference_bh with debug checking
|
||||
|
|
@ -730,7 +762,7 @@ static inline void rcu_preempt_sleep_check(void)
|
|||
* This is the RCU-bh counterpart to rcu_dereference_check().
|
||||
*/
|
||||
#define rcu_dereference_bh_check(p, c) \
|
||||
__rcu_dereference_check((p), rcu_read_lock_bh_held() || (c), __rcu)
|
||||
__rcu_dereference_check((p), (c) || rcu_read_lock_bh_held(), __rcu)
|
||||
|
||||
/**
|
||||
* rcu_dereference_sched_check() - rcu_dereference_sched with debug checking
|
||||
|
|
@ -740,7 +772,7 @@ static inline void rcu_preempt_sleep_check(void)
|
|||
* This is the RCU-sched counterpart to rcu_dereference_check().
|
||||
*/
|
||||
#define rcu_dereference_sched_check(p, c) \
|
||||
__rcu_dereference_check((p), rcu_read_lock_sched_held() || (c), \
|
||||
__rcu_dereference_check((p), (c) || rcu_read_lock_sched_held(), \
|
||||
__rcu)
|
||||
|
||||
#define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/
|
||||
|
|
@ -933,9 +965,9 @@ static inline void rcu_read_unlock(void)
|
|||
{
|
||||
rcu_lockdep_assert(rcu_is_watching(),
|
||||
"rcu_read_unlock() used illegally while idle");
|
||||
rcu_lock_release(&rcu_lock_map);
|
||||
__release(RCU);
|
||||
__rcu_read_unlock();
|
||||
rcu_lock_release(&rcu_lock_map); /* Keep acq info for rls diags. */
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp)
|
|||
* lockdep_is_held() calls.
|
||||
*/
|
||||
#define srcu_dereference_check(p, sp, c) \
|
||||
__rcu_dereference_check((p), srcu_read_lock_held(sp) || (c), __rcu)
|
||||
__rcu_dereference_check((p), (c) || srcu_read_lock_held(sp), __rcu)
|
||||
|
||||
/**
|
||||
* srcu_dereference - fetch SRCU-protected pointer for later dereferencing
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue