From: Paul E. McKenney Date: Thu, 24 Feb 2022 17:38:46 +0000 (-0800) Subject: Merge branches 'exp.2022.02.24a', 'fixes.2022.02.14a', 'rcu_barrier.2022.02.08a'... X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=d5578190bed3d110203e3b6b29c5a7a39d51c6c0;p=linux.git Merge branches 'exp.2022.02.24a', 'fixes.2022.02.14a', 'rcu_barrier.2022.02.08a', 'rcu-tasks.2022.02.08a', 'rt.2022.02.01b', 'torture.2022.02.01b' and 'torturescript.2022.02.08a' into HEAD exp.2022.02.24a: Expedited grace-period updates. fixes.2022.02.14a: Miscellaneous fixes. rcu_barrier.2022.02.08a: Make rcu_barrier() no longer exclude CPU hotplug. rcu-tasks.2022.02.08a: RCU-tasks updates. rt.2022.02.01b: Real-time-related updates. torture.2022.02.01b: Torture-test updates. torturescript.2022.02.08a: Torture-test scripting updates. --- d5578190bed3d110203e3b6b29c5a7a39d51c6c0 diff --cc kernel/rcu/tree.c index a4c25a6283b0b,ca8d7dd026eeb,1d3507d563db1,a4c25a6283b0b,bd9b2af247abd,a4c25a6283b0b,a4c25a6283b0b..acf3985268183 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@@@@@@@ -4056,29 -4049,29 -4087,31 -4056,29 -4059,29 -4056,29 -4056,29 +4083,31 @@@@@@@@ void rcu_barrier(void */ for_each_possible_cpu(cpu) { rdp = per_cpu_ptr(&rcu_data, cpu); -- ---- if (cpu_is_offline(cpu) && -- ---- !rcu_rdp_is_offloaded(rdp)) ++ ++++retry: ++ ++++ if (smp_load_acquire(&rdp->barrier_seq_snap) == gseq) + continue; -- - -- if (rcu_segcblist_n_cbs(&rdp->cblist) && cpu_online(cpu)) { -- - -- rcu_barrier_trace(TPS("OnlineQ"), cpu, -- - -- rcu_state.barrier_sequence); -- - -- smp_call_function_single(cpu, rcu_barrier_func, (void *)cpu, 1); -- - -- } else if (rcu_segcblist_n_cbs(&rdp->cblist) && -- - -- cpu_is_offline(cpu)) { -- - -- rcu_barrier_trace(TPS("OfflineNoCBQ"), cpu, -- - -- rcu_state.barrier_sequence); -- - -- local_irq_disable(); -- - -- rcu_barrier_func((void *)cpu); -- - -- local_irq_enable(); -- - -- } else if (cpu_is_offline(cpu)) { -- - -- rcu_barrier_trace(TPS("OfflineNoCBNoQ"), cpu, -- - -- rcu_state.barrier_sequence); -- - -- } else { -- - -- rcu_barrier_trace(TPS("OnlineNQ"), cpu, -- - -- rcu_state.barrier_sequence); ++ ++++ raw_spin_lock_irqsave(&rcu_state.barrier_lock, flags); ++ ++++ if (!rcu_segcblist_n_cbs(&rdp->cblist)) { ++ ++++ WRITE_ONCE(rdp->barrier_seq_snap, gseq); ++ ++++ raw_spin_unlock_irqrestore(&rcu_state.barrier_lock, flags); ++ ++++ rcu_barrier_trace(TPS("NQ"), cpu, rcu_state.barrier_sequence); ++ + ++ continue; - if (rcu_segcblist_n_cbs(&rdp->cblist) && cpu_online(cpu)) { - rcu_barrier_trace(TPS("OnlineQ"), cpu, - rcu_state.barrier_sequence); - smp_call_function_single(cpu, rcu_barrier_func, (void *)cpu, 1); - } else if (rcu_segcblist_n_cbs(&rdp->cblist) && - cpu_is_offline(cpu)) { - rcu_barrier_trace(TPS("OfflineNoCBQ"), cpu, - rcu_state.barrier_sequence); - local_irq_disable(); - rcu_barrier_func((void *)cpu); - local_irq_enable(); - } else if (cpu_is_offline(cpu)) { - rcu_barrier_trace(TPS("OfflineNoCBNoQ"), cpu, - rcu_state.barrier_sequence); - } else { - rcu_barrier_trace(TPS("OnlineNQ"), cpu, - rcu_state.barrier_sequence); ++ + ++ } ++ ++++ if (!rcu_rdp_cpu_online(rdp)) { ++ ++++ rcu_barrier_entrain(rdp); ++ ++++ WARN_ON_ONCE(READ_ONCE(rdp->barrier_seq_snap) != gseq); ++ ++++ raw_spin_unlock_irqrestore(&rcu_state.barrier_lock, flags); ++ ++++ rcu_barrier_trace(TPS("OfflineNoCBQ"), cpu, rcu_state.barrier_sequence); ++ ++++ continue; ++ ++++ } ++ ++++ raw_spin_unlock_irqrestore(&rcu_state.barrier_lock, flags); ++ ++++ if (smp_call_function_single(cpu, rcu_barrier_handler, (void *)cpu, 1)) { ++ ++++ schedule_timeout_uninterruptible(1); ++ ++++ goto retry; + } ++ ++++ WARN_ON_ONCE(READ_ONCE(rdp->barrier_seq_snap) != gseq); ++ ++++ rcu_barrier_trace(TPS("OnlineQ"), cpu, rcu_state.barrier_sequence); } -- ---- cpus_read_unlock(); /* * Now that we have an rcu_barrier_callback() callback on each diff --cc kernel/rcu/tree_plugin.h index c5b45c2f68a15,efd0c87d2ffae,d3db2168598ef,c5b45c2f68a15,8167cab1bffc8,c5b45c2f68a15,c5b45c2f68a15..6082dd23408f8 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@@@@@@@ -1172,11 -1172,12 -1170,11 -1172,11 -1175,9 -1172,11 -1172,11 +1173,10 @@@@@@@@ static void rcu_spawn_one_boost_kthread struct sched_param sp; struct task_struct *t; + +++++ mutex_lock(&rnp->boost_kthread_mutex); if (rnp->boost_kthread_task || !rcu_scheduler_fully_active) - ----- return; - -- -- - -- -- rcu_state.boost = 1; + +++++ goto out; - rcu_state.boost = 1; - t = kthread_create(rcu_boost_kthread, (void *)rnp, "rcub/%d", rnp_index); if (WARN_ON_ONCE(IS_ERR(t)))