This commit saves a few lines by checking first for an empty callback list. If the callback list is empty, then that CPU is taken care of, regardless of its online or nocb state. Also simplify tracing accordingly and fold a few lines together.
Showing the changes to kernel (1 of 2 files). Show all
Unified · Split
| @@ -4030,8 +4030,7 @@ void rcu_barrier(void) · 4029 unmodified lines | ||
| 4030 | 4030 | |
| 4031 | 4031 | /* Did someone else do our work for us? */ |
| 4032 | 4032 | if (rcu_seq_done(&rcu_state.barrier_sequence, s)) { |
| 4033 | − rcu_barrier_trace(TPS("EarlyExit"), -1, | |
| 4034 | − rcu_state.barrier_sequence); | |
| 4033 | + rcu_barrier_trace(TPS("EarlyExit"), -1, rcu_state.barrier_sequence); | |
| 4035 | 4034 | smp_mb(); /* caller's subsequent code after above check. */ |
| 4036 | 4035 | mutex_unlock(&rcu_state.barrier_mutex); |
| 4037 | 4036 | return; |
| @@ -4059,26 +4058,18 @@ void rcu_barrier(void) · 21 unmodified lines | ||
| 4059 | 4058 | */ |
| 4060 | 4059 | for_each_possible_cpu(cpu) { |
| 4061 | 4060 | rdp = per_cpu_ptr(&rcu_data, cpu); |
| 4062 | − if (cpu_is_offline(cpu) && | |
| 4063 | − !rcu_rdp_is_offloaded(rdp)) | |
| 4061 | + if (!rcu_segcblist_n_cbs(&rdp->cblist)) { | |
| 4062 | + rcu_barrier_trace(TPS("NQ"), cpu, rcu_state.barrier_sequence); | |
| 4064 | 4063 | continue; |
| 4065 | − if (rcu_segcblist_n_cbs(&rdp->cblist) && cpu_online(cpu)) { | |
| 4066 | − rcu_barrier_trace(TPS("OnlineQ"), cpu, | |
| 4067 | − rcu_state.barrier_sequence); | |
| 4064 | + } | |
| 4065 | + if (cpu_online(cpu)) { | |
| 4066 | + rcu_barrier_trace(TPS("OnlineQ"), cpu, rcu_state.barrier_sequence); | |
| 4068 | 4067 | smp_call_function_single(cpu, rcu_barrier_func, (void *)cpu, 1); |
| 4069 | − } else if (rcu_segcblist_n_cbs(&rdp->cblist) && | |
| 4070 | − cpu_is_offline(cpu)) { | |
| 4071 | − rcu_barrier_trace(TPS("OfflineNoCBQ"), cpu, | |
| 4072 | − rcu_state.barrier_sequence); | |
| 4068 | + } else { | |
| 4069 | + rcu_barrier_trace(TPS("OfflineNoCBQ"), cpu, rcu_state.barrier_sequence); | |
| 4073 | 4070 | local_irq_disable(); |
| 4074 | 4071 | rcu_barrier_func((void *)cpu); |
| 4075 | 4072 | local_irq_enable(); |
| 4076 | − } else if (cpu_is_offline(cpu)) { | |
| 4077 | − rcu_barrier_trace(TPS("OfflineNoCBNoQ"), cpu, | |
| 4078 | − rcu_state.barrier_sequence); | |
| 4079 | − } else { | |
| 4080 | − rcu_barrier_trace(TPS("OnlineNQ"), cpu, | |
| 4081 | − rcu_state.barrier_sequence); | |
| 4082 | 4073 | } |
| 4083 | 4074 | } |
| 4084 | 4075 | cpus_read_unlock(); |