]> www.infradead.org Git - linux.git/commitdiff
Merge tag 'rcu.release.v6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/rcu...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Sep 2024 05:52:24 +0000 (07:52 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Sep 2024 05:52:24 +0000 (07:52 +0200)
Pull RCU updates from Neeraj Upadhyay:
 "Context tracking:
   - rename context tracking state related symbols and remove references
     to "dynticks" in various context tracking state variables and
     related helpers
   - force context_tracking_enabled_this_cpu() to be inlined to avoid
     leaving a noinstr section

  CSD lock:
   - enhance CSD-lock diagnostic reports
   - add an API to provide an indication of ongoing CSD-lock stall

  nocb:
   - update and simplify RCU nocb code to handle (de-)offloading of
     callbacks only for offline CPUs
   - fix RT throttling hrtimer being armed from offline CPU

  rcutorture:
   - remove redundant rcu_torture_ops get_gp_completed fields
   - add SRCU ->same_gp_state and ->get_comp_state functions
   - add generic test for NUM_ACTIVE_*RCU_POLL* for testing RCU and SRCU
     polled grace periods
   - add CFcommon.arch for arch-specific Kconfig options
   - print number of update types in rcu_torture_write_types()
   - add rcutree.nohz_full_patience_delay testing to the TREE07 scenario
   - add a stall_cpu_repeat module parameter to test repeated CPU stalls
   - add argument to limit number of CPUs a guest OS can use in
     torture.sh

  rcustall:
   - abbreviate RCU CPU stall warnings during CSD-lock stalls
   - Allow dump_cpu_task() to be called without disabling preemption
   - defer printing stall-warning backtrace when holding rcu_node lock

  srcu:
   - make SRCU gp seq wrap-around faster
   - add KCSAN checks for concurrent updates to ->srcu_n_exp_nodelay and
     ->reschedule_count which are used in heuristics governing
     auto-expediting of normal SRCU grace periods and
     grace-period-state-machine delays
   - mark idle SRCU-barrier callbacks to help identify stuck
     SRCU-barrier callback

  rcu tasks:
   - remove RCU Tasks Rude asynchronous APIs as they are no longer used
   - stop testing RCU Tasks Rude asynchronous APIs
   - fix access to non-existent percpu regions
   - check processor-ID assumptions during chosen CPU calculation for
     callback enqueuing
   - update description of rtp->tasks_gp_seq grace-period sequence
     number
   - add rcu_barrier_cb_is_done() to identify whether a given
     rcu_barrier callback is stuck
   - mark idle Tasks-RCU-barrier callbacks
   - add *torture_stats_print() functions to print detailed diagnostics
     for Tasks-RCU variants
   - capture start time of rcu_barrier_tasks*() operation to help
     distinguish a hung barrier operation from a long series of barrier
     operations

  refscale:
   - add a TINY scenario to support tests of Tiny RCU and Tiny
     SRCU
   - optimize process_durations() operation

  rcuscale:
   - dump stacks of stalled rcu_scale_writer() instances and
     grace-period statistics when rcu_scale_writer() stalls
   - mark idle RCU-barrier callbacks to identify stuck RCU-barrier
     callbacks
   - print detailed grace-period and barrier diagnostics on
     rcu_scale_writer() hangs for Tasks-RCU variants
   - warn if async module parameter is specified for RCU implementations
     that do not have async primitives such as RCU Tasks Rude
   - make all writer tasks report upon hang
   - tolerate repeated GFP_KERNEL failure in rcu_scale_writer()
   - use special allocator for rcu_scale_writer()
   - NULL out top-level pointers to heap memory to avoid double-free
     bugs on modprobe failures
   - maintain per-task instead of per-CPU callbacks count to avoid any
     issues with migration of either tasks or callbacks
   - constify struct ref_scale_ops

  Fixes:
   - use system_unbound_wq for kfree_rcu work to avoid disturbing
     isolated CPUs

  Misc:
   - warn on unexpected rcu_state.srs_done_tail state
   - better define "atomic" for list_replace_rcu() and
     hlist_replace_rcu() routines
   - annotate struct kvfree_rcu_bulk_data with __counted_by()"

* tag 'rcu.release.v6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux: (90 commits)
  rcu: Defer printing stall-warning backtrace when holding rcu_node lock
  rcu/nocb: Remove superfluous memory barrier after bypass enqueue
  rcu/nocb: Conditionally wake up rcuo if not already waiting on GP
  rcu/nocb: Fix RT throttling hrtimer armed from offline CPU
  rcu/nocb: Simplify (de-)offloading state machine
  context_tracking: Tag context_tracking_enabled_this_cpu() __always_inline
  context_tracking, rcu: Rename rcu_dyntick trace event into rcu_watching
  rcu: Update stray documentation references to rcu_dynticks_eqs_{enter, exit}()
  rcu: Rename rcu_momentary_dyntick_idle() into rcu_momentary_eqs()
  rcu: Rename rcu_implicit_dynticks_qs() into rcu_watching_snap_recheck()
  rcu: Rename dyntick_save_progress_counter() into rcu_watching_snap_save()
  rcu: Rename struct rcu_data .exp_dynticks_snap into .exp_watching_snap
  rcu: Rename struct rcu_data .dynticks_snap into .watching_snap
  rcu: Rename rcu_dynticks_zero_in_eqs() into rcu_watching_zero_in_eqs()
  rcu: Rename rcu_dynticks_in_eqs_since() into rcu_watching_snap_stopped_since()
  rcu: Rename rcu_dynticks_in_eqs() into rcu_watching_snap_in_eqs()
  rcu: Rename rcu_dynticks_eqs_online() into rcu_watching_online()
  context_tracking, rcu: Rename rcu_dynticks_curr_cpu_in_eqs() into rcu_is_watching_curr_cpu()
  context_tracking, rcu: Rename rcu_dynticks_task*() into rcu_task*()
  refscale: Constify struct ref_scale_ops
  ...

1  2 
Documentation/admin-guide/kernel-parameters.txt
include/linux/context_tracking.h
include/linux/smp.h
kernel/rcu/tree.c
kernel/rcu/tree_exp.h
kernel/rcu/tree_stall.h
kernel/sched/core.c
kernel/trace/trace_osnoise.c
lib/Kconfig.debug

index 8a78fabeafc3a92967ea766ef1fca175af39e8d3,d53092ffa9dba7b84c233ca6d9015a7f57247e8a..af9fe87a092251348df0a2a2e7f13bf63388eb5a
@@@ -80,12 -80,10 +80,12 @@@ static __always_inline bool context_tra
        return context_tracking_enabled_this_cpu();
  }
  
 -static __always_inline void context_tracking_guest_exit(void)
 +static __always_inline bool context_tracking_guest_exit(void)
  {
        if (context_tracking_enabled())
-               __ct_user_exit(CONTEXT_GUEST);
+               __ct_user_exit(CT_STATE_GUEST);
 +
 +      return context_tracking_enabled_this_cpu();
  }
  
  #define CT_WARN_ON(cond) WARN_ON(context_tracking_enabled() && (cond))
Simple merge
Simple merge
index f6b35a0585a8b4f8832001aabf48fbb6ff2b8289,c3266bf709d5934beffe69bc6dee08a96a8e4549..fb664d3a01c957ad3bb78a9cf4e1da36af4eefed
@@@ -597,59 -652,8 +656,11 @@@ static void synchronize_rcu_expedited_w
                j = jiffies;
                rcu_stall_notifier_call_chain(RCU_STALL_NOTIFY_EXP, (void *)(j - jiffies_start));
                trace_rcu_stall_warning(rcu_state.name, TPS("ExpeditedStall"));
-               pr_err("INFO: %s detected expedited stalls on CPUs/tasks: {",
-                      rcu_state.name);
-               ndetected = 0;
-               rcu_for_each_leaf_node(rnp) {
-                       ndetected += rcu_print_task_exp_stall(rnp);
-                       for_each_leaf_node_possible_cpu(rnp, cpu) {
-                               struct rcu_data *rdp;
-                               mask = leaf_node_cpu_bit(rnp, cpu);
-                               if (!(READ_ONCE(rnp->expmask) & mask))
-                                       continue;
-                               ndetected++;
-                               rdp = per_cpu_ptr(&rcu_data, cpu);
-                               pr_cont(" %d-%c%c%c%c", cpu,
-                                       "O."[!!cpu_online(cpu)],
-                                       "o."[!!(rdp->grpmask & rnp->expmaskinit)],
-                                       "N."[!!(rdp->grpmask & rnp->expmaskinitnext)],
-                                       "D."[!!data_race(rdp->cpu_no_qs.b.exp)]);
-                       }
-               }
-               pr_cont(" } %lu jiffies s: %lu root: %#lx/%c\n",
-                       j - jiffies_start, rcu_state.expedited_sequence,
-                       data_race(rnp_root->expmask),
-                       ".T"[!!data_race(rnp_root->exp_tasks)]);
-               if (ndetected) {
-                       pr_err("blocking rcu_node structures (internal RCU debug):");
-                       rcu_for_each_node_breadth_first(rnp) {
-                               if (rnp == rnp_root)
-                                       continue; /* printed unconditionally */
-                               if (sync_rcu_exp_done_unlocked(rnp))
-                                       continue;
-                               pr_cont(" l=%u:%d-%d:%#lx/%c",
-                                       rnp->level, rnp->grplo, rnp->grphi,
-                                       data_race(rnp->expmask),
-                                       ".T"[!!data_race(rnp->exp_tasks)]);
-                       }
-                       pr_cont("\n");
-               }
-               rcu_for_each_leaf_node(rnp) {
-                       for_each_leaf_node_possible_cpu(rnp, cpu) {
-                               mask = leaf_node_cpu_bit(rnp, cpu);
-                               if (!(READ_ONCE(rnp->expmask) & mask))
-                                       continue;
-                               preempt_disable(); // For smp_processor_id() in dump_cpu_task().
-                               dump_cpu_task(cpu);
-                               preempt_enable();
-                       }
-                       rcu_exp_print_detail_task_stall_rnp(rnp);
-               }
+               synchronize_rcu_expedited_stall(jiffies_start, j);
                jiffies_stall = 3 * rcu_exp_jiffies_till_stall_check() + 3;
 +
 +              nbcon_cpu_emergency_exit();
 +
                panic_on_rcu_stall();
        }
  }
index b3a6943127bca33bdc50221a900fba3d0634d695,2fb40ec4b2aea38756bebca8e248dea69277dd39..4432db6d0b99b3bfd79194abfe3be478e8929f59
@@@ -7,9 -7,9 +7,10 @@@
   * Author: Paul E. McKenney <paulmck@linux.ibm.com>
   */
  
 +#include <linux/console.h>
  #include <linux/kvm_para.h>
  #include <linux/rcu_notifier.h>
+ #include <linux/smp.h>
  
  //////////////////////////////////////////////////////////////////////////////
  //
Simple merge
Simple merge
Simple merge