rcu: Simplify RCU_TINY RCU callback invocation
TINY_PREEMPT_RCU could use a kthread to handle RCU callback invocation, which required an API to abstract kthread vs. softirq invocation. Now that TINY_PREEMPT_RCU is no longer with us, this commit retires this API in favor of direct use of the relevant softirq primitives. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>wifi-calibration
parent
58c4e69d43
commit
9dc5ad3248
|
@ -216,6 +216,7 @@ static inline int rcu_preempt_depth(void)
|
||||||
#endif /* #else #ifdef CONFIG_PREEMPT_RCU */
|
#endif /* #else #ifdef CONFIG_PREEMPT_RCU */
|
||||||
|
|
||||||
/* Internal to kernel */
|
/* Internal to kernel */
|
||||||
|
extern void rcu_init(void);
|
||||||
extern void rcu_sched_qs(int cpu);
|
extern void rcu_sched_qs(int cpu);
|
||||||
extern void rcu_bh_qs(int cpu);
|
extern void rcu_bh_qs(int cpu);
|
||||||
extern void rcu_check_callbacks(int cpu, int user);
|
extern void rcu_check_callbacks(int cpu, int user);
|
||||||
|
|
|
@ -27,10 +27,6 @@
|
||||||
|
|
||||||
#include <linux/cache.h>
|
#include <linux/cache.h>
|
||||||
|
|
||||||
static inline void rcu_init(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void rcu_barrier_bh(void)
|
static inline void rcu_barrier_bh(void)
|
||||||
{
|
{
|
||||||
wait_rcu_gp(call_rcu_bh);
|
wait_rcu_gp(call_rcu_bh);
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#ifndef __LINUX_RCUTREE_H
|
#ifndef __LINUX_RCUTREE_H
|
||||||
#define __LINUX_RCUTREE_H
|
#define __LINUX_RCUTREE_H
|
||||||
|
|
||||||
extern void rcu_init(void);
|
|
||||||
extern void rcu_note_context_switch(int cpu);
|
extern void rcu_note_context_switch(int cpu);
|
||||||
extern int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies);
|
extern int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies);
|
||||||
extern void rcu_cpu_stall_reset(void);
|
extern void rcu_cpu_stall_reset(void);
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
|
|
||||||
/* Forward declarations for rcutiny_plugin.h. */
|
/* Forward declarations for rcutiny_plugin.h. */
|
||||||
struct rcu_ctrlblk;
|
struct rcu_ctrlblk;
|
||||||
static void invoke_rcu_callbacks(void);
|
|
||||||
static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp);
|
static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp);
|
||||||
static void rcu_process_callbacks(struct softirq_action *unused);
|
static void rcu_process_callbacks(struct softirq_action *unused);
|
||||||
static void __call_rcu(struct rcu_head *head,
|
static void __call_rcu(struct rcu_head *head,
|
||||||
|
@ -227,7 +226,7 @@ void rcu_sched_qs(int cpu)
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
if (rcu_qsctr_help(&rcu_sched_ctrlblk) +
|
if (rcu_qsctr_help(&rcu_sched_ctrlblk) +
|
||||||
rcu_qsctr_help(&rcu_bh_ctrlblk))
|
rcu_qsctr_help(&rcu_bh_ctrlblk))
|
||||||
invoke_rcu_callbacks();
|
raise_softirq(RCU_SOFTIRQ);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,7 +239,7 @@ void rcu_bh_qs(int cpu)
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
if (rcu_qsctr_help(&rcu_bh_ctrlblk))
|
if (rcu_qsctr_help(&rcu_bh_ctrlblk))
|
||||||
invoke_rcu_callbacks();
|
raise_softirq(RCU_SOFTIRQ);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +276,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)
|
||||||
ACCESS_ONCE(rcp->rcucblist),
|
ACCESS_ONCE(rcp->rcucblist),
|
||||||
need_resched(),
|
need_resched(),
|
||||||
is_idle_task(current),
|
is_idle_task(current),
|
||||||
rcu_is_callbacks_kthread()));
|
false));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,7 +306,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)
|
||||||
RCU_TRACE(rcu_trace_sub_qlen(rcp, cb_count));
|
RCU_TRACE(rcu_trace_sub_qlen(rcp, cb_count));
|
||||||
RCU_TRACE(trace_rcu_batch_end(rcp->name, cb_count, 0, need_resched(),
|
RCU_TRACE(trace_rcu_batch_end(rcp->name, cb_count, 0, need_resched(),
|
||||||
is_idle_task(current),
|
is_idle_task(current),
|
||||||
rcu_is_callbacks_kthread()));
|
false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcu_process_callbacks(struct softirq_action *unused)
|
static void rcu_process_callbacks(struct softirq_action *unused)
|
||||||
|
@ -379,3 +378,8 @@ void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
|
||||||
__call_rcu(head, func, &rcu_bh_ctrlblk);
|
__call_rcu(head, func, &rcu_bh_ctrlblk);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(call_rcu_bh);
|
EXPORT_SYMBOL_GPL(call_rcu_bh);
|
||||||
|
|
||||||
|
void rcu_init(void)
|
||||||
|
{
|
||||||
|
open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
|
||||||
|
}
|
||||||
|
|
|
@ -102,39 +102,6 @@ static void check_cpu_stalls(void)
|
||||||
RCU_TRACE(check_cpu_stall_preempt());
|
RCU_TRACE(check_cpu_stall_preempt());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hold off callback invocation until early_initcall() time. */
|
|
||||||
static int rcu_scheduler_fully_active __read_mostly;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start up softirq processing of callbacks.
|
|
||||||
*/
|
|
||||||
void invoke_rcu_callbacks(void)
|
|
||||||
{
|
|
||||||
if (rcu_scheduler_fully_active)
|
|
||||||
raise_softirq(RCU_SOFTIRQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_RCU_TRACE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* There is no callback kthread, so this thread is never it.
|
|
||||||
*/
|
|
||||||
static bool rcu_is_callbacks_kthread(void)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifdef CONFIG_RCU_TRACE */
|
|
||||||
|
|
||||||
static int __init rcu_scheduler_really_started(void)
|
|
||||||
{
|
|
||||||
rcu_scheduler_fully_active = 1;
|
|
||||||
open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
|
|
||||||
raise_softirq(RCU_SOFTIRQ); /* Invoke any callbacks from early boot. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
early_initcall(rcu_scheduler_really_started);
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue