Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9dc5ad32 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

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: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent 58c4e69d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ static inline int rcu_preempt_depth(void)
#endif /* #else #ifdef CONFIG_PREEMPT_RCU */

/* Internal to kernel */
extern void rcu_init(void);
extern void rcu_sched_qs(int cpu);
extern void rcu_bh_qs(int cpu);
extern void rcu_check_callbacks(int cpu, int user);
+0 −4
Original line number Diff line number Diff line
@@ -27,10 +27,6 @@

#include <linux/cache.h>

static inline void rcu_init(void)
{
}

static inline void rcu_barrier_bh(void)
{
	wait_rcu_gp(call_rcu_bh);
+0 −1
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@
#ifndef __LINUX_RCUTREE_H
#define __LINUX_RCUTREE_H

extern void rcu_init(void);
extern void rcu_note_context_switch(int cpu);
extern int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies);
extern void rcu_cpu_stall_reset(void);
+9 −5
Original line number Diff line number Diff line
@@ -44,7 +44,6 @@

/* Forward declarations for rcutiny_plugin.h. */
struct rcu_ctrlblk;
static void invoke_rcu_callbacks(void);
static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp);
static void rcu_process_callbacks(struct softirq_action *unused);
static void __call_rcu(struct rcu_head *head,
@@ -227,7 +226,7 @@ void rcu_sched_qs(int cpu)
	local_irq_save(flags);
	if (rcu_qsctr_help(&rcu_sched_ctrlblk) +
	    rcu_qsctr_help(&rcu_bh_ctrlblk))
		invoke_rcu_callbacks();
		raise_softirq(RCU_SOFTIRQ);
	local_irq_restore(flags);
}

@@ -240,7 +239,7 @@ void rcu_bh_qs(int cpu)

	local_irq_save(flags);
	if (rcu_qsctr_help(&rcu_bh_ctrlblk))
		invoke_rcu_callbacks();
		raise_softirq(RCU_SOFTIRQ);
	local_irq_restore(flags);
}

@@ -277,7 +276,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)
					      ACCESS_ONCE(rcp->rcucblist),
					      need_resched(),
					      is_idle_task(current),
					      rcu_is_callbacks_kthread()));
					      false));
		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(trace_rcu_batch_end(rcp->name, cb_count, 0, need_resched(),
				      is_idle_task(current),
				      rcu_is_callbacks_kthread()));
				      false));
}

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);
}
EXPORT_SYMBOL_GPL(call_rcu_bh);

void rcu_init(void)
{
	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
}
+0 −33
Original line number Diff line number Diff line
@@ -102,39 +102,6 @@ static void check_cpu_stalls(void)
	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
#include <linux/kernel_stat.h>