rcu_data
static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp,
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
static bool rcu_accelerate_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
struct rcu_data *rdp)
static bool rcu_advance_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
struct rcu_data *rdp)
static bool __note_gp_changes(struct rcu_node *rnp, struct rcu_data *rdp)
static void note_gp_changes(struct rcu_data *rdp)
static void rcu_report_exp_rdp(struct rcu_data *rdp);
static void rcu_report_qs_rdp(struct rcu_data *rdp);
static void check_cb_ovld_locked(struct rcu_data *rdp, struct rcu_node *rnp);
static bool rcu_rdp_is_offloaded(struct rcu_data *rdp);
static bool rcu_rdp_cpu_online(struct rcu_data *rdp);
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
rcu_report_qs_rdp(this_cpu_ptr(&rcu_data));
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
rdp = per_cpu_ptr(&rcu_data, cpu);
rdp = this_cpu_ptr(&rcu_data);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
rcu_report_qs_rdp(struct rcu_data *rdp)
rcu_check_quiescent_state(struct rcu_data *rdp)
static void rcu_do_batch(struct rcu_data *rdp)
WARN_ON_ONCE(time_before(j, __this_cpu_read(rcu_data.last_sched_clock)));
__this_cpu_write(rcu_data.last_sched_clock, j);
raw_cpu_inc(rcu_data.ticks_this_gp);
if (smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs))) {
__this_cpu_write(rcu_data.rcu_urgent_qs, false);
static void force_qs_rnp(int (*f)(struct rcu_data *rdp))
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
rnp = raw_cpu_read(rcu_data.mynode);
struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
__this_cpu_write(rcu_data.rcu_cpu_has_work, 1);
t = __this_cpu_read(rcu_data.rcu_cpu_kthread_task);
rcu_wake_cond(t, __this_cpu_read(rcu_data.rcu_cpu_kthread_status));
per_cpu(rcu_data.rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU;
return __this_cpu_read(rcu_data.rcu_cpu_has_work);
unsigned int *statusp = this_cpu_ptr(&rcu_data.rcu_cpu_kthread_status);
char work, *workp = this_cpu_ptr(&rcu_data.rcu_cpu_has_work);
unsigned long *j = this_cpu_ptr(&rcu_data.rcuc_activity);
.store = &rcu_data.rcu_cpu_kthread_task,
per_cpu(rcu_data.rcu_cpu_has_work, cpu) = 0;
static void rcutree_enqueue(struct rcu_data *rdp, struct rcu_head *head, rcu_callback_t func)
static void call_rcu_core(struct rcu_data *rdp, struct rcu_head *head,
static void check_cb_ovld_locked(struct rcu_data *rdp, struct rcu_node *rnp)
static void check_cb_ovld(struct rcu_data *rdp)
struct rcu_data *rdp;
static bool rcu_watching_snap_stopped_since(struct rcu_data *rdp, int snap)
rdp = this_cpu_ptr(&rcu_data);
for (rnp = this_cpu_ptr(&rcu_data)->mynode; rnp; rnp = rnp->parent)
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
raw_cpu_write(rcu_data.rcu_need_heavy_qs, false);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
static void rcu_barrier_entrain(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
rdp = per_cpu_ptr(&rcu_data, cpu);
static bool rcu_rdp_cpu_online(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
struct rcu_data *my_rdp;
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
my_rdp = this_cpu_ptr(&rcu_data);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
per_cpu_ptr(&rcu_data, i)->mynode = rnp;
per_cpu_ptr(&rcu_data, i)->barrier_head.next =
&per_cpu_ptr(&rcu_data, i)->barrier_head;
static void force_qs_rnp(int (*f)(struct rcu_data *rdp));
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
return !rcu_segcblist_empty(&this_cpu_ptr(&rcu_data)->cblist) &&
!rcu_rdp_is_offloaded(this_cpu_ptr(&rcu_data));
static void rcu_disable_urgency_upon_qs(struct rcu_data *rdp)
smp_store_release(per_cpu_ptr(&rcu_data.rcu_urgent_qs, cpu), true);
static DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, rcu_data) = {
static void rcu_gpnum_ovf(struct rcu_node *rnp, struct rcu_data *rdp)
static int rcu_watching_snap_save(struct rcu_data *rdp)
static int rcu_watching_snap_recheck(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
struct rcu_data *nocb_toggling_rdp; /* rdp queued for (de-)offloading */
struct rcu_data *nocb_gp_rdp ____cacheline_internodealigned_in_smp;
static void rcu_preempt_deferred_qs_init(struct rcu_data *rdp);
static bool rcu_is_callbacks_kthread(struct rcu_data *rdp);
static void zero_cpu_stall_ticks(struct rcu_data *rdp);
static bool wake_nocb_gp(struct rcu_data *rdp);
static bool rcu_nocb_flush_bypass(struct rcu_data *rdp, struct rcu_head *rhp,
static void call_rcu_nocb(struct rcu_data *rdp, struct rcu_head *head,
static void __maybe_unused __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_empty,
static int rcu_nocb_need_deferred_wakeup(struct rcu_data *rdp, int level);
static bool do_nocb_deferred_wakeup(struct rcu_data *rdp);
static void rcu_boot_init_nocb_percpu_data(struct rcu_data *rdp);
static void show_rcu_nocb_state(struct rcu_data *rdp);
static void rcu_nocb_lock(struct rcu_data *rdp);
static void rcu_nocb_unlock(struct rcu_data *rdp);
static void rcu_nocb_unlock_irqrestore(struct rcu_data *rdp,
static void rcu_lockdep_assert_cblist_protected(struct rcu_data *rdp);
static void check_cpu_stall(struct rcu_data *rdp);
static void rcu_check_gp_start_stall(struct rcu_node *rnp, struct rcu_data *rdp,
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, raw_smp_processor_id());
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
static void rcu_report_exp_rdp(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, raw_smp_processor_id());
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
ASSERT_EXCLUSIVE_WRITER_SCOPED(*this_cpu_ptr(&rcu_data.cpu_no_qs.b.exp));
__this_cpu_write(rcu_data.cpu_no_qs.b.exp, true);
smp_store_release(this_cpu_ptr(&rcu_data.rcu_urgent_qs), true);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
__this_cpu_read(rcu_data.cpu_no_qs.b.exp))
rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
static bool rcu_nocb_rdp_deoffload_wait_cond(struct rcu_data *rdp)
static int rcu_nocb_rdp_deoffload(struct rcu_data *rdp)
struct rcu_data *rdp_gp = rdp->nocb_gp_rdp;
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
static bool rcu_nocb_bypass_trylock(struct rcu_data *rdp)
static bool rcu_nocb_rdp_offload_wait_cond(struct rcu_data *rdp)
static int rcu_nocb_rdp_offload(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
static void rcu_nocb_bypass_unlock(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp;
static void rcu_nocb_lock(struct rcu_data *rdp)
rdp = per_cpu_ptr(&rcu_data, cpu);
static void __init rcu_boot_init_nocb_percpu_data(struct rcu_data *rdp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp_gp;
static void rcu_nocb_unlock(struct rcu_data *rdp)
struct rcu_data *rdp;
struct rcu_data *rdp_gp = NULL; /* Suppress misguided gcc warn. */
rdp = per_cpu_ptr(&rcu_data, cpu);
static void show_rcu_nocb_gp_state(struct rcu_data *rdp)
static void show_rcu_nocb_state(struct rcu_data *rdp)
struct rcu_data *nocb_next_rdp;
static void rcu_nocb_unlock_irqrestore(struct rcu_data *rdp,
static void rcu_nocb_lock(struct rcu_data *rdp)
static void rcu_nocb_unlock(struct rcu_data *rdp)
static void rcu_nocb_unlock_irqrestore(struct rcu_data *rdp,
static void rcu_lockdep_assert_cblist_protected(struct rcu_data *rdp)
static bool wake_nocb_gp(struct rcu_data *rdp)
static bool rcu_nocb_flush_bypass(struct rcu_data *rdp, struct rcu_head *rhp,
static void call_rcu_nocb(struct rcu_data *rdp, struct rcu_head *head,
static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_empty,
static void __init rcu_boot_init_nocb_percpu_data(struct rcu_data *rdp)
static void rcu_lockdep_assert_cblist_protected(struct rcu_data *rdp)
static int rcu_nocb_need_deferred_wakeup(struct rcu_data *rdp, int level)
static bool do_nocb_deferred_wakeup(struct rcu_data *rdp)
static void show_rcu_nocb_state(struct rcu_data *rdp)
static void nocb_defer_wakeup_cancel(struct rcu_data *rdp_gp)
static inline bool rcu_current_is_nocb_kthread(struct rcu_data *rdp)
static bool __wake_nocb_gp(struct rcu_data *rdp_gp,
struct rcu_data *rdp,
static bool wake_nocb_gp(struct rcu_data *rdp)
struct rcu_data *rdp_gp = rdp->nocb_gp_rdp;
static void wake_nocb_gp_defer(struct rcu_data *rdp, int waketype,
struct rcu_data *rdp_gp = rdp->nocb_gp_rdp;
static bool rcu_nocb_do_flush_bypass(struct rcu_data *rdp, struct rcu_head *rhp_in,
static bool rcu_nocb_flush_bypass(struct rcu_data *rdp, struct rcu_head *rhp,
static void rcu_nocb_try_flush_bypass(struct rcu_data *rdp, unsigned long j)
static bool rcu_nocb_try_bypass(struct rcu_data *rdp, struct rcu_head *rhp,
static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone,
static void call_rcu_nocb(struct rcu_data *rdp, struct rcu_head *head,
static void nocb_gp_toggle_rdp(struct rcu_data *rdp_gp, struct rcu_data *rdp)
static void nocb_gp_sleep(struct rcu_data *my_rdp, int cpu)
static void nocb_gp_wait(struct rcu_data *my_rdp)
struct rcu_data *rdp, *rdp_toggling = NULL;
struct rcu_data *rdp = arg;
static inline bool nocb_cb_wait_cond(struct rcu_data *rdp)
static void nocb_cb_wait(struct rcu_data *rdp)
static void rcu_nocb_bypass_lock(struct rcu_data *rdp)
struct rcu_data *rdp = arg;
static int rcu_nocb_need_deferred_wakeup(struct rcu_data *rdp, int level)
static bool do_nocb_deferred_wakeup_common(struct rcu_data *rdp_gp,
struct rcu_data *rdp, int level,
struct rcu_data *rdp = timer_container_of(rdp, t, nocb_timer);
static bool do_nocb_deferred_wakeup(struct rcu_data *rdp)
struct rcu_data *rdp_gp = rdp->nocb_gp_rdp;
do_nocb_deferred_wakeup(this_cpu_ptr(&rcu_data));
static int rcu_nocb_queue_toggle_rdp(struct rcu_data *rdp)
struct rcu_data *rdp_gp = rdp->nocb_gp_rdp;
if (!smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs)))
this_cpu_write(rcu_data.rcu_urgent_qs, false);
if (unlikely(raw_cpu_read(rcu_data.rcu_need_heavy_qs)))
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
static void rcu_preempt_deferred_qs_init(struct rcu_data *rdp) { }
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
static bool rcu_is_callbacks_nocb_kthread(struct rcu_data *rdp)
static bool rcu_is_callbacks_kthread(struct rcu_data *rdp)
static bool rcu_rdp_is_offloaded(struct rcu_data *rdp)
static void rcu_preempt_ctxt_queue(struct rcu_node *rnp, struct rcu_data *rdp)
if (__this_cpu_read(rcu_data.cpu_no_qs.b.norm)) {
__this_cpu_read(rcu_data.gp_seq),
__this_cpu_write(rcu_data.cpu_no_qs.b.norm, false);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
rdp == this_cpu_ptr(&rcu_data)) ||
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
return (__this_cpu_read(rcu_data.cpu_no_qs.b.exp) ||
struct rcu_data *rdp;
rdp = container_of(iwp, struct rcu_data, defer_qs_iw);
struct rcu_data *rdp,
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
__this_cpu_read(rcu_data.core_needs_qs) &&
__this_cpu_read(rcu_data.cpu_no_qs.b.norm) &&
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
static void rcu_preempt_deferred_qs_init(struct rcu_data *rdp)
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
if (!__this_cpu_read(rcu_data.cpu_no_qs.s))
__this_cpu_read(rcu_data.gp_seq), TPS("cpuqs"));
__this_cpu_write(rcu_data.cpu_no_qs.b.norm, false);
if (__this_cpu_read(rcu_data.cpu_no_qs.b.exp))
rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
if (!raw_cpu_read(rcu_data.rcu_urgent_qs))
if (!smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs))) {
this_cpu_write(rcu_data.rcu_urgent_qs, false);
if (unlikely(raw_cpu_read(rcu_data.rcu_need_heavy_qs))) {
static void rcu_check_gp_start_stall(struct rcu_node *rnp, struct rcu_data *rdp,
struct rcu_data *rdp;
rdp = this_cpu_ptr(&rcu_data);
static void zero_cpu_stall_ticks(struct rcu_data *rdp)
struct rcu_data *rdp;
rdp = container_of(iwp, struct rcu_data, rcu_iw);
static bool rcu_is_rcuc_kthread_starving(struct rcu_data *rdp, unsigned long *jp)
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
static void check_cpu_stall(struct rcu_data *rdp)
struct rcu_data *rdp;
rdp = per_cpu_ptr(&rcu_data, cpu);
rdp = per_cpu_ptr(&rcu_data, cpu);