|
@@ -132,7 +132,6 @@ static struct rcu_preempt_ctrlblk rcu_preempt_ctrlblk = {
|
|
RCU_TRACE(.rcb.name = "rcu_preempt")
|
|
RCU_TRACE(.rcb.name = "rcu_preempt")
|
|
};
|
|
};
|
|
|
|
|
|
-static void rcu_read_unlock_special(struct task_struct *t);
|
|
|
|
static int rcu_preempted_readers_exp(void);
|
|
static int rcu_preempted_readers_exp(void);
|
|
static void rcu_report_exp_done(void);
|
|
static void rcu_report_exp_done(void);
|
|
|
|
|
|
@@ -526,24 +525,12 @@ void rcu_preempt_note_context_switch(void)
|
|
local_irq_restore(flags);
|
|
local_irq_restore(flags);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Tiny-preemptible RCU implementation for rcu_read_lock().
|
|
|
|
- * Just increment ->rcu_read_lock_nesting, shared state will be updated
|
|
|
|
- * if we block.
|
|
|
|
- */
|
|
|
|
-void __rcu_read_lock(void)
|
|
|
|
-{
|
|
|
|
- current->rcu_read_lock_nesting++;
|
|
|
|
- barrier(); /* needed if we ever invoke rcu_read_lock in rcutiny.c */
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(__rcu_read_lock);
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Handle special cases during rcu_read_unlock(), such as needing to
|
|
* Handle special cases during rcu_read_unlock(), such as needing to
|
|
* notify RCU core processing or task having blocked during the RCU
|
|
* notify RCU core processing or task having blocked during the RCU
|
|
* read-side critical section.
|
|
* read-side critical section.
|
|
*/
|
|
*/
|
|
-static noinline void rcu_read_unlock_special(struct task_struct *t)
|
|
|
|
|
|
+void rcu_read_unlock_special(struct task_struct *t)
|
|
{
|
|
{
|
|
int empty;
|
|
int empty;
|
|
int empty_exp;
|
|
int empty_exp;
|
|
@@ -626,38 +613,6 @@ static noinline void rcu_read_unlock_special(struct task_struct *t)
|
|
local_irq_restore(flags);
|
|
local_irq_restore(flags);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Tiny-preemptible RCU implementation for rcu_read_unlock().
|
|
|
|
- * Decrement ->rcu_read_lock_nesting. If the result is zero (outermost
|
|
|
|
- * rcu_read_unlock()) and ->rcu_read_unlock_special is non-zero, then
|
|
|
|
- * invoke rcu_read_unlock_special() to clean up after a context switch
|
|
|
|
- * in an RCU read-side critical section and other special cases.
|
|
|
|
- */
|
|
|
|
-void __rcu_read_unlock(void)
|
|
|
|
-{
|
|
|
|
- struct task_struct *t = current;
|
|
|
|
-
|
|
|
|
- barrier(); /* needed if we ever invoke rcu_read_unlock in rcutiny.c */
|
|
|
|
- if (t->rcu_read_lock_nesting != 1)
|
|
|
|
- --t->rcu_read_lock_nesting;
|
|
|
|
- else {
|
|
|
|
- t->rcu_read_lock_nesting = INT_MIN;
|
|
|
|
- barrier(); /* assign before ->rcu_read_unlock_special load */
|
|
|
|
- if (unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))
|
|
|
|
- rcu_read_unlock_special(t);
|
|
|
|
- barrier(); /* ->rcu_read_unlock_special load before assign */
|
|
|
|
- t->rcu_read_lock_nesting = 0;
|
|
|
|
- }
|
|
|
|
-#ifdef CONFIG_PROVE_LOCKING
|
|
|
|
- {
|
|
|
|
- int rrln = ACCESS_ONCE(t->rcu_read_lock_nesting);
|
|
|
|
-
|
|
|
|
- WARN_ON_ONCE(rrln < 0 && rrln > INT_MIN / 2);
|
|
|
|
- }
|
|
|
|
-#endif /* #ifdef CONFIG_PROVE_LOCKING */
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(__rcu_read_unlock);
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Check for a quiescent state from the current CPU. When a task blocks,
|
|
* Check for a quiescent state from the current CPU. When a task blocks,
|
|
* the task is recorded in the rcu_preempt_ctrlblk structure, which is
|
|
* the task is recorded in the rcu_preempt_ctrlblk structure, which is
|