1. 16 5月, 2018 12 次提交
    • P
      rcu: Cleanup, don't put ->completed into an int · a508aa59
      Paul E. McKenney 提交于
      It is true that currently only the low-order two bits are used, so
      there should be no problem given modern machines and compilers, but
      good hygiene and maintainability dictates use of an unsigned long
      instead of an int.  This commit therefore makes this change.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      a508aa59
    • P
      rcu: Switch __rcu_process_callbacks() to rcu_accelerate_cbs() · bd7af846
      Paul E. McKenney 提交于
      The __rcu_process_callbacks() function currently checks to see if
      the current CPU needs a grace period and also if there is any other
      reason to kick off a new grace period.  This is one of the fail-safe
      checks that has been rendered unnecessary by the changes that increase
      the accuracy of rcu_gp_cleanup()'s estimate as to whether another grace
      period is required.  Because this particular fail-safe involved acquiring
      the root rcu_node structure's ->lock, which has seen excessive contention
      in real life, this fail-safe needs to go.
      
      However, one check must remain, namely the check for newly arrived
      RCU callbacks that have not yet been associated with a grace period.
      One might hope that the checks in __note_gp_changes(), which is invoked
      indirectly from rcu_check_quiescent_state(), would suffice, but this
      function won't be invoked at all if RCU is idle.  It is therefore necessary
      to replace the fail-safe checks with a simpler check for newly arrived
      callbacks during an RCU idle period, which is exactly what this commit
      does.  This change removes the final call to rcu_start_gp(), so this
      function is removed as well.
      
      Note that lockless use of cpu_needs_another_gp() is racy, but that
      these races are harmless in this case.  If RCU really is idle, the
      values will not change, so the return value from cpu_needs_another_gp()
      will be correct.  If RCU is not idle, the resulting redundant call to
      rcu_accelerate_cbs() will be harmless, and might even have the benefit
      of reducing grace-period latency a bit.
      
      This commit also moves interrupt disabling into the "if" statement to
      improve real-time response a bit.
      Reported-by: NNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      bd7af846
    • P
      rcu: Avoid __call_rcu_core() root rcu_node ->lock acquisition · a6058d85
      Paul E. McKenney 提交于
      When __call_rcu_core() notices excessive numbers of callbacks pending
      on the current CPU, we know that at least one of them is not yet
      classified, namely the one that was just now queued.  Therefore, it
      is not necessary to invoke rcu_start_gp() and thus not necessary to
      acquire the root rcu_node structure's ->lock.  This commit therefore
      replaces the rcu_start_gp() with rcu_accelerate_cbs(), thus replacing
      an acquisition of the root rcu_node structure's ->lock with that of
      this CPU's leaf rcu_node structure.
      
      This decreases contention on the root rcu_node structure's ->lock.
      Reported-by: NNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      a6058d85
    • P
      rcu: Make rcu_migrate_callbacks wake GP kthread when needed · ec4eacce
      Paul E. McKenney 提交于
      The rcu_migrate_callbacks() function invokes rcu_advance_cbs()
      twice, ignoring the return value.  This is OK at pressent because of
      failsafe code that does the wakeup when needed.  However, this failsafe
      code acquires the root rcu_node structure's lock frequently, while
      rcu_migrate_callbacks() does so only once per CPU-offline operation.
      
      This commit therefore makes rcu_migrate_callbacks()
      wake up the RCU GP kthread when either call to rcu_advance_cbs()
      returns true, thus removing need for the failsafe code.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      ec4eacce
    • P
      rcu: Convert ->need_future_gp[] array to boolean · 6f576e28
      Paul E. McKenney 提交于
      There is no longer any need for ->need_future_gp[] to count the number of
      requests for future grace periods, so this commit converts the additions
      to assignments to "true" and reduces the size of each element to one byte.
      While we are in the area, fix an obsolete comment.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      6f576e28
    • P
      rcu: Make rcu_future_needs_gp() check all ->need_future_gps[] elements · 0ae94e00
      Paul E. McKenney 提交于
      Currently, the rcu_future_needs_gp() function checks only the current
      element of the ->need_future_gps[] array, which might miss elements that
      were offset from the expected element, for example, due to races with
      the start or the end of a grace period.  This commit therefore makes
      rcu_future_needs_gp() use the need_any_future_gp() macro to check all
      of the elements of this array.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      0ae94e00
    • P
      rcu: Avoid losing ->need_future_gp[] values due to GP start/end races · 51af970d
      Paul E. McKenney 提交于
      The rcu_cbs_completed() function provides the value of ->completed
      at which new callbacks can safely be invoked.  This is recorded in
      two-element ->need_future_gp[] arrays in the rcu_node structure, and
      the elements of these arrays corresponding to the just-completed grace
      period are zeroed at the end of that grace period.  However, the
      rcu_cbs_completed() function can return the current ->completed value
      plus either one or two, so it is possible for the corresponding
      ->need_future_gp[] entry to be cleared just after it was set, thus
      losing a request for a future grace period.
      
      This commit avoids this race by expanding ->need_future_gp[] to four
      elements.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      51af970d
    • P
      rcu: Make rcu_gp_cleanup() more accurately predict need for new GP · fb31340f
      Paul E. McKenney 提交于
      Currently, rcu_gp_cleanup() scans the rcu_node tree in order to reset
      state to reflect the end of the grace period.  It also checks to see
      whether a new grace period is needed, but in a number of cases, rather
      than directly cause the new grace period to be immediately started, it
      instead leaves the grace-period-needed state where various fail-safes
      can find it.  This works fine, but results in higher contention on the
      root rcu_node structure's ->lock, which is undesirable, and contention
      on that lock has recently become noticeable.
      
      This commit therefore makes rcu_gp_cleanup() immediately start a new
      grace period if there is any need for one.
      
      It is quite possible that it will later be necessary to throttle the
      grace-period rate, but that can be dealt with when and if.
      Reported-by: NNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      fb31340f
    • P
      rcu: Make rcu_gp_kthread() check for early-boot activity · 5fe0a562
      Paul E. McKenney 提交于
      The rcu_gp_kthread() function immediately sleeps waiting to be notified
      of the need for a new grace period, which currently works because there
      are a number of code sequences that will provide the needed wakeup later.
      However, some of these code sequences need to acquire the root rcu_node
      structure's ->lock, and contention on that lock has started manifesting.
      This commit therefore makes rcu_gp_kthread() check for early-boot activity
      when it starts up, omitting the initial sleep in that case.
      Reported-by: NNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      5fe0a562
    • P
      rcu: Add accessor macros for the ->need_future_gp[] array · c91a8675
      Paul E. McKenney 提交于
      Accessors for the ->need_future_gp[] array are currently open-coded,
      which makes them difficult to change.  To improve maintainability, this
      commit adds need_future_gp_mask() to compute the indexing mask from the
      array size, need_future_gp_element() to access the element corresponding
      to the specified grace-period number, and need_any_future_gp() to
      determine if any future grace period is needed.  This commit also applies
      need_future_gp_element() to existing open-coded single-element accesses.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      c91a8675
    • P
      rcu: Make rcu_start_future_gp()'s grace-period check more precise · 825a9911
      Paul E. McKenney 提交于
      The rcu_start_future_gp() function uses a sloppy check for a grace
      period being in progress, which works today because there are a number
      of code sequences that resolve the resulting races.  However, some of
      these race-resolution code sequences must acquire the root rcu_node
      structure's ->lock, and contention on that lock has started manifesting.
      This commit therefore makes rcu_start_future_gp() check more precise,
      eliminating the sloppy lockless check of the rcu_state structure's ->gpnum
      and ->completed fields.  The effect is that rcu_start_future_gp() will
      sometimes unnecessarily attempt to start a new grace period, but this
      overhead will be reduced later using funnel locking.
      Reported-by: NNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      825a9911
    • P
      rcu: Improve non-root rcu_cbs_completed() accuracy · 9036c2ff
      Paul E. McKenney 提交于
      When rcu_cbs_completed() is invoked on a non-root rcu_node structure,
      it unconditionally assumes that two grace periods must complete before
      the callbacks at hand can be invoked.  This is overly conservative because
      if that non-root rcu_node structure believes that no grace period is in
      progress, and if the corresponding rcu_state structure's ->gpnum field
      has not yet been incremented, then these callbacks may safely be invoked
      after only one grace period has completed.
      
      This change is required to permit grace-period start requests to use
      funnel locking, which is in turn permitted to reduce root rcu_node ->lock
      contention, which has been observed by Nick Piggin.  Furthermore, such
      contention will likely be increased by the merging of RCU-bh, RCU-preempt,
      and RCU-sched, so it makes sense to take steps to decrease it.
      
      This commit therefore improves the accuracy of rcu_cbs_completed() when
      invoked on a non-root rcu_node structure as described above.
      Reported-by: NNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: NNicholas Piggin <npiggin@gmail.com>
      9036c2ff
  2. 24 2月, 2018 1 次提交
    • P
      rcu: Create RCU-specific workqueues with rescuers · ad7c946b
      Paul E. McKenney 提交于
      RCU's expedited grace periods can participate in out-of-memory deadlocks
      due to all available system_wq kthreads being blocked and there not being
      memory available to create more.  This commit prevents such deadlocks
      by allocating an RCU-specific workqueue_struct at early boot time, and
      providing it with a rescuer to ensure forward progress.  This uses the
      shiny new init_rescuer() function provided by Tejun (but indirectly).
      
      This commit also causes SRCU to use this new RCU-specific
      workqueue_struct.  Note that SRCU's use of workqueues never blocks them
      waiting for readers, so this should be safe from a forward-progress
      viewpoint.  Note that this moves SRCU from system_power_efficient_wq
      to a normal workqueue.  In the unlikely event that this results in
      measurable degradation, a separate power-efficient workqueue will be
      creates for SRCU.
      Reported-by: NPrateek Sood <prsood@codeaurora.org>
      Reported-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Acked-by: NTejun Heo <tj@kernel.org>
      ad7c946b
  3. 21 2月, 2018 25 次提交
    • P
      torture: Provide more sensible nreader/nwriter defaults for rcuperf · 85ba6bfe
      Paul E. McKenney 提交于
      The default values for nreader and nwriter are apparently not all that
      user-friendly, resulting in people doing scalability tests that ran all
      runs at large scale.  This commit therefore makes both the nreaders and
      nwriters module default to the number of CPUs, and adds a comment to
      rcuperf.c stating that the number of CPUs should be specified using the
      nr_cpus kernel boot parameter.  This commit also eliminates the redundant
      rcuperf scripting specification of default values for these parameters.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      85ba6bfe
    • P
      rcutorture: Record which grace-period primitives are tested · db0c1a8a
      Paul E. McKenney 提交于
      The rcu_torture_writer() function adapts to requested testing from module
      parameters as well as the function pointers in the structure referenced
      by cur_ops.  However, as long as the module parameters do not conflict
      with the function pointers, this adaptation is silent.  This silence can
      result in confusion as to exactly what was tested, which could in turn
      result in untested RCU code making its way into mainline.
      
      This commit therefore makes rcu_torture_writer() announce exactly which
      portions of RCU's API it ends up testing.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      db0c1a8a
    • P
      rcutorture: Re-enable testing of dynamic expediting · f7c0e6ad
      Paul E. McKenney 提交于
      During boot, normal grace periods are processed as expedited.  When
      rcutorture is built into the kernel, it starts during boot and thus
      detects that normal grace periods are unconditionally expedited.
      Therefore, rcutorture concludes that there is no point in trying
      to dynamically enable expediting, do it disables this aspect of testing,
      which is a bit of an overreaction to the temporary boot-time expediting.
      
      This commit therefore rechecks forced expediting throughout the test,
      enabling dynamic expediting if normal grace periods are processed
      normally at any point.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      f7c0e6ad
    • P
      rcutorture: Avoid fake-writer use of undefined primitives · eb033993
      Paul E. McKenney 提交于
      Currently the rcu_torture_fakewriter() function invokes cur_ops->sync()
      and cur_ops->exp_sync() without first checking to see if they are in
      fact non-NULL.  This results in kernel NULL pointer dereferences when
      testing RCU implementations that choose not to provide the full set of
      primitives.  Given that it is perfectly reasonable to have specialized
      RCU implementations that provide only a subset of the RCU API, this is
      a bug in rcutorture.
      
      This commit therefore makes rcu_torture_fakewriter() check function
      pointers before invoking them, thus allowing it to test subsetted
      RCU implementations.
      Reported-by: NLihao Liang <lianglihao@huawei.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      eb033993
    • P
      rcutorture: Abstract function and module names · e0d31a34
      Paul E. McKenney 提交于
      This commit moves to __func__ for function names and for KBUILD_MODNAME
      for module names, all in the name of better resilience to change.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      e0d31a34
    • P
      rcutorture: Replace multi-instance kzalloc() with kcalloc() · 68a675d4
      Paul E. McKenney 提交于
      This commit replaces array-allocation calls to kzalloc() with
      equivalent calls to kcalloc().
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      68a675d4
    • P
      rcu: Remove SRCU throttling · 6308f347
      Paul E. McKenney 提交于
      The code in srcu_gp_end() inserts a delay every 0x3ff grace periods in
      order to prevent SRCU grace-period work from consuming an entire CPU
      when there is a long sequence of expedited SRCU grace-period requests.
      However, all of SRCU's grace-period work is carried out in workqueues,
      which are in turn within kthreads, which are automatically throttled as
      needed by the scheduler.  In particular, if there is plenty of idle time,
      there is no point in throttling.
      
      This commit therefore removes the expedited SRCU grace-period throttling.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      6308f347
    • B
      srcu: Remove dead code in srcu_gp_end() · a72da917
      Byungchul Park 提交于
      Of course, compilers will optimize out a dead code. Anyway, remove
      any dead code for better readibility.
      Signed-off-by: NByungchul Park <byungchul.park@lge.com>
      Reviewed-by: NSteven Rostedt (VMware) <rostedt@goodmis.org>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a72da917
    • I
      srcu: Reduce scans of srcu_data in counter wrap check · 8ddbd883
      Ildar Ismagilov 提交于
      Currently, given a multi-level srcu_node tree, SRCU can scan the full
      set of srcu_data structures at each level when cleaning up after a grace
      period.  This, though harmless otherwise, represents pointless overhead.
      This commit therefore eliminates this overhead by scanning the srcu_data
      structures only when traversing the leaf srcu_node structures.
      Signed-off-by: NIldar Ismagilov <devix84@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      8ddbd883
    • I
      srcu: Prevent sdp->srcu_gp_seq_needed_exp counter wrap · a35d13ec
      Ildar Ismagilov 提交于
      SRCU checks each srcu_data structure's grace-period number for counter
      wrap four times per cycle by default.  This frequency guarantees that
      normal comparisons will detect potential wrap.  However, the expedited
      grace-period number is not checked.  The consquences are not too horrible
      (a failure to expedite a grace period when requested), but it would be
      good to avoid such things.  This commit therefore adds this check to
      the expedited grace-period number.
      Signed-off-by: NIldar Ismagilov <devix84@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a35d13ec
    • P
      srcu: Abstract function name · cb4081cd
      Paul E. McKenney 提交于
      This commit moves to __func__ for function names in the name of better
      resilience to change.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      cb4081cd
    • P
      rcu: Make expedited RCU CPU selection avoid unnecessary stores · 65963d24
      Paul E. McKenney 提交于
      This commit reworks the first loop in sync_rcu_exp_select_cpus()
      to avoid doing unnecssary stores to other CPUs' rcu_data
      structures.  This speeds up that first loop by roughly a factor of
      two on an old x86 system.  In the case where the system is mostly
      idle, this loop incurs a large fraction of the overhead of the
      synchronize_rcu_expedited().  There is less benefit on busy systems
      because the overhead of the smp_call_function_single() in the second
      loop dominates in that case.
      
      However, it is not unusual to do configuration chances involving
      RCU grace periods (both expedited and normal) while the system is
      mostly idle, so this optimization is worth doing.
      
      While we are in the area, this commit also adds parentheses to arguments
      used by the for_each_leaf_node_possible_cpu() macro.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      65963d24
    • P
      rcu: Trace expedited GP delays due to transitioning CPUs · 7f5d42d0
      Paul E. McKenney 提交于
      If a CPU is transitioning to or from offline state, an expedited
      grace period may undergo a timed wait.  This timed wait can unduly
      delay grace periods, so this commit adds a trace statement to make
      it visible.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      7f5d42d0
    • P
      rcu: Add more tracing of expedited grace periods · 9a414201
      Paul E. McKenney 提交于
      This commit adds more tracing of expedited grace periods to enable
      improved debugging of slowdowns.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      9a414201
    • I
      rcu: Fix misprint in srcu_funnel_exp_start · 274afd6b
      Ildar Ismagilov 提交于
      The srcu_funnel_exp_start() function checks to see if the srcu_struct
      structure's expedited grace period counter needs updating to reflect a
      newly arrived request for an expedited SRCU grace period.  Unfortunately,
      the check is backwards, so this commit reverses the sense of the test.
      Signed-off-by: NIldar Ismagilov <devix84@gmail.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      274afd6b
    • M
      rcu: Use wrapper for lockdep asserts · a32e01ee
      Matthew Wilcox 提交于
      Commits c0b334c5 and ea9b0c8a introduced new sparse warnings
      by accessing rcu_node->lock directly and ignoring the __private
      marker.  Introduce a new wrapper and use it.  Also fix a similar problem
      in srcutree.c introduced by a3883df3.
      Signed-off-by: NMatthew Wilcox <mawilcox@microsoft.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a32e01ee
    • L
      rcu: Remove redundant nxttail index macro define · 65518db8
      Liu, Changcheng 提交于
      RCU's nxttail has been optimized to be a rcu_segcblist, which is
      a multi-tailed linked list with macros defined for the indexes for
      each tail.  The indexes have been defined in linux/rcu_segcblist.h,
      so this commit removes the redundant definitions in kernel/rcu/tree.h.
      Signed-off-by: NLiu Changcheng <changcheng.liu@intel.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      65518db8
    • P
      rcu: Consolidate rcu.h #ifdefs · bfbd767d
      Paul E. McKenney 提交于
      The kernel/rcu/rcu.h file has a pair of consecutive #ifdefs on
      CONFIG_TINY_RCU, so this commit consolidates them, thus saving a few
      lines of code.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      bfbd767d
    • P
      rcu: More clearly identify grace-period kthread stack dump · d07aee2c
      Paul E. McKenney 提交于
      It is not always obvious that the stack dump from a starved grace-period
      kthread isn't instead that of a CPU stalling the current grace period.
      This commit therefore adds a pr_err() flagging these dumps.
      Reported-by: NPeter Zijlstra <peterz@infradead.org>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      d07aee2c
    • P
      rcu: Remove obsolete force-quiescent-state statistics for debugfs · d62df573
      Paul E. McKenney 提交于
      The debugfs interface displayed statistics on RCU-pending checks but
      this interface has since been removed.  This commit therefore removes the
      no-longer-used rcu_state structure's ->n_force_qs_lh and ->n_force_qs_ngp
      fields along with their updates.  (Though the ->n_force_qs_ngp field
      was actually not used at all, embarrassingly enough.)
      
      If this information proves necessary in the future, the corresponding
      event traces will be added.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      d62df573
    • P
      rcu: Remove obsolete __rcu_pending() statistics for debugfs · 01c495f7
      Paul E. McKenney 提交于
      The debugfs interface displayed statistics on RCU-pending checks
      but this interface has since been removed.  This commit therefore
      removes the no-longer-used rcu_data structure's ->n_rcu_pending,
      ->n_rp_core_needs_qs, ->n_rp_report_qs, ->n_rp_cb_ready,
      ->n_rp_cpu_needs_gp, ->n_rp_gp_completed, ->n_rp_gp_started,
      ->n_rp_nocb_defer_wakeup, and ->n_rp_need_nothing fields along with
      their updates.
      
      If this information proves necessary in the future, the corresponding
      event traces will be added.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      01c495f7
    • P
      rcu: Remove obsolete callback-invocation statistics for debugfs · 62df63e0
      Paul E. McKenney 提交于
      The debugfs interface displayed statistics on RCU callback invocation but
      this interface has since been removed.  This commit therefore removes the
      no-longer-used rcu_data structure's ->n_cbs_invoked and ->n_nocbs_invoked
      fields along with their updates.
      
      If this information proves necessary in the future, the corresponding
      event traces will be added.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      62df63e0
    • P
      rcu: Remove obsolete boost statistics for debugfs · bec06785
      Paul E. McKenney 提交于
      The debugfs interface displayed statistics on RCU priority boosting,
      but this interface has since been removed.  This commit therefore
      removes the no-longer-used rcu_data structure's ->n_tasks_boosted,
      ->n_exp_boosts, and ->n_exp_boosts and their updates.
      
      If this information proves necessary in the future, the corresponding
      event traces will be added.
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      bec06785
    • T
      rcu: Call touch_nmi_watchdog() while printing stall warnings · 3caa973b
      Tejun Heo 提交于
      When RCU stall warning triggers, it can print out a lot of messages
      while holding spinlocks.  If the console device is slow (e.g. an
      actual or IPMI serial console), it may end up triggering NMI hard
      lockup watchdog like the following.
      
      *** CPU printking while holding RCU spinlock
      
        PID: 4149739  TASK: ffff881a46baa880  CPU: 13  COMMAND: "CPUThreadPool8"
         #0 [ffff881fff945e48] crash_nmi_callback at ffffffff8103f7d0
         #1 [ffff881fff945e58] nmi_handle at ffffffff81020653
         #2 [ffff881fff945eb0] default_do_nmi at ffffffff81020c36
         #3 [ffff881fff945ed0] do_nmi at ffffffff81020d32
         #4 [ffff881fff945ef0] end_repeat_nmi at ffffffff81956a7e
            [exception RIP: io_serial_in+21]
            RIP: ffffffff81630e55  RSP: ffff881fff943b88  RFLAGS: 00000002
            RAX: 000000000000ca00  RBX: ffffffff8230e188  RCX: 0000000000000000
            RDX: 00000000000002fd  RSI: 0000000000000005  RDI: ffffffff8230e188
            RBP: ffff881fff943bb0   R8: 0000000000000000   R9: ffffffff820cb3c4
            R10: 0000000000000019  R11: 0000000000002000  R12: 00000000000026e1
            R13: 0000000000000020  R14: ffffffff820cd398  R15: 0000000000000035
            ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0000
        --- <NMI exception stack> ---
         #5 [ffff881fff943b88] io_serial_in at ffffffff81630e55
         #6 [ffff881fff943b90] wait_for_xmitr at ffffffff8163175c
         #7 [ffff881fff943bb8] serial8250_console_putchar at ffffffff816317dc
         #8 [ffff881fff943bd8] uart_console_write at ffffffff8162ac00
         #9 [ffff881fff943c08] serial8250_console_write at ffffffff81634691
        #10 [ffff881fff943c80] univ8250_console_write at ffffffff8162f7c2
        #11 [ffff881fff943c90] console_unlock at ffffffff810dfc55
        #12 [ffff881fff943cf0] vprintk_emit at ffffffff810dffb5
        #13 [ffff881fff943d50] vprintk_default at ffffffff810e01bf
        #14 [ffff881fff943d60] vprintk_func at ffffffff810e1127
        #15 [ffff881fff943d70] printk at ffffffff8119a8a4
        #16 [ffff881fff943dd0] print_cpu_stall_info at ffffffff810eb78c
        #17 [ffff881fff943e88] rcu_check_callbacks at ffffffff810ef133
        #18 [ffff881fff943ee8] update_process_times at ffffffff810f3497
        #19 [ffff881fff943f10] tick_sched_timer at ffffffff81103037
        #20 [ffff881fff943f38] __hrtimer_run_queues at ffffffff810f3f38
        #21 [ffff881fff943f88] hrtimer_interrupt at ffffffff810f442b
      
      *** CPU triggering the hardlockup watchdog
      
        PID: 4149709  TASK: ffff88010f88c380  CPU: 26  COMMAND: "CPUThreadPool35"
         #0 [ffff883fff1059d0] machine_kexec at ffffffff8104a874
         #1 [ffff883fff105a30] __crash_kexec at ffffffff811116cc
         #2 [ffff883fff105af0] __crash_kexec at ffffffff81111795
         #3 [ffff883fff105b08] panic at ffffffff8119a6ae
         #4 [ffff883fff105b98] watchdog_overflow_callback at ffffffff81135dbd
         #5 [ffff883fff105bb0] __perf_event_overflow at ffffffff81186866
         #6 [ffff883fff105be8] perf_event_overflow at ffffffff81192bc4
         #7 [ffff883fff105bf8] intel_pmu_handle_irq at ffffffff8100b265
         #8 [ffff883fff105df8] perf_event_nmi_handler at ffffffff8100489f
         #9 [ffff883fff105e58] nmi_handle at ffffffff81020653
        #10 [ffff883fff105eb0] default_do_nmi at ffffffff81020b94
        #11 [ffff883fff105ed0] do_nmi at ffffffff81020d32
        #12 [ffff883fff105ef0] end_repeat_nmi at ffffffff81956a7e
            [exception RIP: queued_spin_lock_slowpath+248]
            RIP: ffffffff810da958  RSP: ffff883fff103e68  RFLAGS: 00000046
            RAX: 0000000000000000  RBX: 0000000000000046  RCX: 00000000006d0000
            RDX: ffff883fff49a950  RSI: 0000000000d10101  RDI: ffffffff81e54300
            RBP: ffff883fff103e80   R8: ffff883fff11a950   R9: 0000000000000000
            R10: 000000000e5873ba  R11: 000000000000010f  R12: ffffffff81e54300
            R13: 0000000000000000  R14: ffff88010f88c380  R15: ffffffff81e54300
            ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
        --- <NMI exception stack> ---
        #13 [ffff883fff103e68] queued_spin_lock_slowpath at ffffffff810da958
        #14 [ffff883fff103e70] _raw_spin_lock_irqsave at ffffffff8195550b
        #15 [ffff883fff103e88] rcu_check_callbacks at ffffffff810eed18
        #16 [ffff883fff103ee8] update_process_times at ffffffff810f3497
        #17 [ffff883fff103f10] tick_sched_timer at ffffffff81103037
        #18 [ffff883fff103f38] __hrtimer_run_queues at ffffffff810f3f38
        #19 [ffff883fff103f88] hrtimer_interrupt at ffffffff810f442b
        --- <IRQ stack> ---
      
      Avoid spuriously triggering NMI hardlockup watchdog by touching it
      from the print functions.  show_state_filter() shares the same problem
      and solution.
      
      v2: Relocate the comment to where it belongs.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      3caa973b
    • P
      rcu: Fix CPU offload boot message when no CPUs are offloaded · 3016611e
      Paul E. McKenney 提交于
      In CONFIG_RCU_NOCB_CPU=y kernels, if the boot parameters indicate that
      none of the CPUs should in fact be offloaded, the following somewhat
      obtuse message appears:
      
      	Offload RCU callbacks from CPUs: .
      
      This commit therefore makes the message at least grammatically correct
      in this case:
      
      	Offload RCU callbacks from CPUs: (none)
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      3016611e
  4. 16 2月, 2018 1 次提交
  5. 12 12月, 2017 1 次提交
    • P
      torture: Eliminate torture_runnable and perf_runnable · a2f2577d
      Paul E. McKenney 提交于
      The purpose of torture_runnable is to allow rcutorture and locktorture
      to be started and stopped via sysfs when they are built into the kernel
      (as in not compiled as loadable modules).  However, the 0444 permissions
      for both instances of torture_runnable prevent this use case from ever
      being put into practice.  Given that there have been no complaints
      about this deficiency, it is reasonable to conclude that no one actually
      makes use of this sysfs capability.  The perf_runnable module parameter
      for rcuperf is in the same situation.
      
      This commit therefore removes both torture_runnable instances as well
      as perf_runnable.
      Reported-by: NThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a2f2577d