rcu: Rename rcu_check_callbacks() to rcu_sched_clock_irq()
The name rcu_check_callbacks() arguably made sense back in the early 2000s when RCU was quite a bit simpler than it is today, but it has become quite misleading, especially with the advent of dyntick-idle and NO_HZ_FULL. The rcu_check_callbacks() function is RCU's hook into the scheduling-clock interrupt, and is now but one of many ways that callbacks get promoted to invocable state. This commit therefore changes the name to rcu_sched_clock_irq(), which is the same number of characters and clearly indicates this function's relation to the rest of the Linux kernel. In addition, for the sake of consistency, rcu_flavor_check_callbacks() is also renamed to rcu_flavor_sched_clock_irq(). While in the area, the header comments for both functions are reworked. Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
This commit is contained in:
parent
2aa5503026
commit
c98cac603f
|
@ -485,7 +485,7 @@ section that the grace period must wait on.
|
||||||
noted by <tt>rcu_node_context_switch()</tt> on the left.
|
noted by <tt>rcu_node_context_switch()</tt> on the left.
|
||||||
On the other hand, if the CPU takes a scheduler-clock interrupt
|
On the other hand, if the CPU takes a scheduler-clock interrupt
|
||||||
while executing in usermode, a quiescent state will be noted by
|
while executing in usermode, a quiescent state will be noted by
|
||||||
<tt>rcu_check_callbacks()</tt> on the right.
|
<tt>rcu_sched_clock_irq()</tt> on the right.
|
||||||
Either way, the passage through a quiescent state will be noted
|
Either way, the passage through a quiescent state will be noted
|
||||||
in a per-CPU variable.
|
in a per-CPU variable.
|
||||||
|
|
||||||
|
@ -651,7 +651,7 @@ to end.
|
||||||
These callbacks are identified by <tt>rcu_advance_cbs()</tt>,
|
These callbacks are identified by <tt>rcu_advance_cbs()</tt>,
|
||||||
which is usually invoked by <tt>__note_gp_changes()</tt>.
|
which is usually invoked by <tt>__note_gp_changes()</tt>.
|
||||||
As shown in the diagram below, this invocation can be triggered by
|
As shown in the diagram below, this invocation can be triggered by
|
||||||
the scheduling-clock interrupt (<tt>rcu_check_callbacks()</tt> on
|
the scheduling-clock interrupt (<tt>rcu_sched_clock_irq()</tt> on
|
||||||
the left) or by idle entry (<tt>rcu_cleanup_after_idle()</tt> on
|
the left) or by idle entry (<tt>rcu_cleanup_after_idle()</tt> on
|
||||||
the right, but only for kernels build with
|
the right, but only for kernels build with
|
||||||
<tt>CONFIG_RCU_FAST_NO_HZ=y</tt>).
|
<tt>CONFIG_RCU_FAST_NO_HZ=y</tt>).
|
||||||
|
|
|
@ -349,7 +349,7 @@
|
||||||
font-weight="bold"
|
font-weight="bold"
|
||||||
font-size="192"
|
font-size="192"
|
||||||
id="text202-7-5"
|
id="text202-7-5"
|
||||||
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_check_callbacks()</text>
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_sched_clock_irq()</text>
|
||||||
<rect
|
<rect
|
||||||
x="7069.6187"
|
x="7069.6187"
|
||||||
y="5087.4678"
|
y="5087.4678"
|
||||||
|
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -3902,7 +3902,7 @@
|
||||||
font-style="normal"
|
font-style="normal"
|
||||||
y="-4418.6582"
|
y="-4418.6582"
|
||||||
x="3745.7725"
|
x="3745.7725"
|
||||||
xml:space="preserve">rcu_check_callbacks()</text>
|
xml:space="preserve">rcu_sched_clock_irq()</text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
transform="translate(-850.30204,55463.106)"
|
transform="translate(-850.30204,55463.106)"
|
||||||
|
@ -4968,7 +4968,7 @@
|
||||||
font-weight="bold"
|
font-weight="bold"
|
||||||
font-size="192"
|
font-size="192"
|
||||||
id="text202-7-5-19"
|
id="text202-7-5-19"
|
||||||
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_check_callbacks()</text>
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_sched_clock_irq()</text>
|
||||||
<rect
|
<rect
|
||||||
x="5314.2671"
|
x="5314.2671"
|
||||||
y="82817.688"
|
y="82817.688"
|
||||||
|
|
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 209 KiB |
|
@ -775,7 +775,7 @@
|
||||||
font-style="normal"
|
font-style="normal"
|
||||||
y="-4418.6582"
|
y="-4418.6582"
|
||||||
x="3745.7725"
|
x="3745.7725"
|
||||||
xml:space="preserve">rcu_check_callbacks()</text>
|
xml:space="preserve">rcu_sched_clock_irq()</text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
transform="translate(399.7744,828.86448)"
|
transform="translate(399.7744,828.86448)"
|
||||||
|
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
@ -89,7 +89,7 @@ static inline int rcu_preempt_depth(void)
|
||||||
/* Internal to kernel */
|
/* Internal to kernel */
|
||||||
void rcu_init(void);
|
void rcu_init(void);
|
||||||
extern int rcu_scheduler_active __read_mostly;
|
extern int rcu_scheduler_active __read_mostly;
|
||||||
void rcu_check_callbacks(int user);
|
void rcu_sched_clock_irq(int user);
|
||||||
void rcu_report_dead(unsigned int cpu);
|
void rcu_report_dead(unsigned int cpu);
|
||||||
void rcutree_migrate_callbacks(int cpu);
|
void rcutree_migrate_callbacks(int cpu);
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ void rcu_qs(void)
|
||||||
* be called from hardirq context. It is normally called from the
|
* be called from hardirq context. It is normally called from the
|
||||||
* scheduling-clock interrupt.
|
* scheduling-clock interrupt.
|
||||||
*/
|
*/
|
||||||
void rcu_check_callbacks(int user)
|
void rcu_sched_clock_irq(int user)
|
||||||
{
|
{
|
||||||
if (user) {
|
if (user) {
|
||||||
rcu_qs();
|
rcu_qs();
|
||||||
|
|
|
@ -1139,7 +1139,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NO_HZ_FULL CPUs can run in-kernel without rcu_check_callbacks!
|
* NO_HZ_FULL CPUs can run in-kernel without rcu_sched_clock_irq!
|
||||||
* The above code handles this, but only for straight cond_resched().
|
* The above code handles this, but only for straight cond_resched().
|
||||||
* And some in-kernel loops check need_resched() before calling
|
* And some in-kernel loops check need_resched() before calling
|
||||||
* cond_resched(), which defeats the above code for CPUs that are
|
* cond_resched(), which defeats the above code for CPUs that are
|
||||||
|
@ -2532,14 +2532,14 @@ static void rcu_do_batch(struct rcu_data *rdp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if this CPU is in a non-context-switch quiescent state
|
* This function is invoked from each scheduling-clock interrupt,
|
||||||
* (user mode or idle loop for rcu, non-softirq execution for rcu_bh).
|
* and checks to see if this CPU is in a non-context-switch quiescent
|
||||||
* Also schedule RCU core processing.
|
* state, for example, user mode or idle loop. It also schedules RCU
|
||||||
*
|
* core processing. If the current grace period has gone on too long,
|
||||||
* This function must be called from hardirq context. It is normally
|
* it will ask the scheduler to manufacture a context switch for the sole
|
||||||
* invoked from the scheduling-clock interrupt.
|
* purpose of providing a providing the needed quiescent state.
|
||||||
*/
|
*/
|
||||||
void rcu_check_callbacks(int user)
|
void rcu_sched_clock_irq(int user)
|
||||||
{
|
{
|
||||||
trace_rcu_utilization(TPS("Start scheduler-tick"));
|
trace_rcu_utilization(TPS("Start scheduler-tick"));
|
||||||
raw_cpu_inc(rcu_data.ticks_this_gp);
|
raw_cpu_inc(rcu_data.ticks_this_gp);
|
||||||
|
@ -2552,7 +2552,7 @@ void rcu_check_callbacks(int user)
|
||||||
}
|
}
|
||||||
__this_cpu_write(rcu_data.rcu_urgent_qs, false);
|
__this_cpu_write(rcu_data.rcu_urgent_qs, false);
|
||||||
}
|
}
|
||||||
rcu_flavor_check_callbacks(user);
|
rcu_flavor_sched_clock_irq(user);
|
||||||
if (rcu_pending())
|
if (rcu_pending())
|
||||||
invoke_rcu_core();
|
invoke_rcu_core();
|
||||||
|
|
||||||
|
|
|
@ -417,7 +417,7 @@ static void rcu_print_detail_task_stall(void);
|
||||||
static int rcu_print_task_stall(struct rcu_node *rnp);
|
static int rcu_print_task_stall(struct rcu_node *rnp);
|
||||||
static int rcu_print_task_exp_stall(struct rcu_node *rnp);
|
static int rcu_print_task_exp_stall(struct rcu_node *rnp);
|
||||||
static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp);
|
static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp);
|
||||||
static void rcu_flavor_check_callbacks(int user);
|
static void rcu_flavor_sched_clock_irq(int user);
|
||||||
void call_rcu(struct rcu_head *head, rcu_callback_t func);
|
void call_rcu(struct rcu_head *head, rcu_callback_t func);
|
||||||
static void dump_blkd_tasks(struct rcu_node *rnp, int ncheck);
|
static void dump_blkd_tasks(struct rcu_node *rnp, int ncheck);
|
||||||
static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags);
|
static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags);
|
||||||
|
|
|
@ -297,7 +297,7 @@ static void rcu_qs(void)
|
||||||
__this_cpu_read(rcu_data.gp_seq),
|
__this_cpu_read(rcu_data.gp_seq),
|
||||||
TPS("cpuqs"));
|
TPS("cpuqs"));
|
||||||
__this_cpu_write(rcu_data.cpu_no_qs.b.norm, false);
|
__this_cpu_write(rcu_data.cpu_no_qs.b.norm, false);
|
||||||
barrier(); /* Coordinate with rcu_flavor_check_callbacks(). */
|
barrier(); /* Coordinate with rcu_flavor_sched_clock_irq(). */
|
||||||
current->rcu_read_unlock_special.b.need_qs = false;
|
current->rcu_read_unlock_special.b.need_qs = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -778,13 +778,13 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for a quiescent state from the current CPU. When a task blocks,
|
* Check for a quiescent state from the current CPU, including voluntary
|
||||||
* the task is recorded in the corresponding CPU's rcu_node structure,
|
* context switches for Tasks RCU. When a task blocks, the task is
|
||||||
* which is checked elsewhere.
|
* recorded in the corresponding CPU's rcu_node structure, which is checked
|
||||||
*
|
* elsewhere, hence this function need only check for quiescent states
|
||||||
* Caller must disable hard irqs.
|
* related to the current CPU, not to those related to tasks.
|
||||||
*/
|
*/
|
||||||
static void rcu_flavor_check_callbacks(int user)
|
static void rcu_flavor_sched_clock_irq(int user)
|
||||||
{
|
{
|
||||||
struct task_struct *t = current;
|
struct task_struct *t = current;
|
||||||
|
|
||||||
|
@ -1030,14 +1030,10 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if this CPU is in a non-context-switch quiescent state
|
* Check to see if this CPU is in a non-context-switch quiescent state,
|
||||||
* (user mode or idle loop for rcu, non-softirq execution for rcu_bh).
|
* namely user mode and idle loop.
|
||||||
* Also schedule RCU core processing.
|
|
||||||
*
|
|
||||||
* This function must be called from hardirq context. It is normally
|
|
||||||
* invoked from the scheduling-clock interrupt.
|
|
||||||
*/
|
*/
|
||||||
static void rcu_flavor_check_callbacks(int user)
|
static void rcu_flavor_sched_clock_irq(int user)
|
||||||
{
|
{
|
||||||
if (user || rcu_is_cpu_rrupt_from_idle()) {
|
if (user || rcu_is_cpu_rrupt_from_idle()) {
|
||||||
|
|
||||||
|
|
|
@ -1632,7 +1632,7 @@ void update_process_times(int user_tick)
|
||||||
/* Note: this timer irq context must be accounted for as well. */
|
/* Note: this timer irq context must be accounted for as well. */
|
||||||
account_process_tick(p, user_tick);
|
account_process_tick(p, user_tick);
|
||||||
run_local_timers();
|
run_local_timers();
|
||||||
rcu_check_callbacks(user_tick);
|
rcu_sched_clock_irq(user_tick);
|
||||||
#ifdef CONFIG_IRQ_WORK
|
#ifdef CONFIG_IRQ_WORK
|
||||||
if (in_irq())
|
if (in_irq())
|
||||||
irq_work_tick();
|
irq_work_tick();
|
||||||
|
|
Loading…
Reference in New Issue