Skip to content
Permalink
Chun-Hung-Tsen…
Switch branches/tags

Commits on Sep 12, 2021

  1. rcu: replace _________p1 with __UNIQUE_ID(rcu)

    This commit replaced _________p1 with __UNIQUE_ID(rcu), which
    generates unique variable names during compilation. Necessary
    modifications due to the changes in the RCU macros have also been
    reflected in this commit.
    
    The same idea is used for the min/max macros (commit 589a978 and commit
    e9092d0), which aims to reduce variable shadowing issues caused by hard
    coded variable names.
    
    Signed-off-by: Jim Huang <jserv@ccns.ncku.edu.tw>
    Signed-off-by: Chun-Hung Tseng <henrybear327@gmail.com>
    henrybear327 authored and intel-lab-lkp committed Sep 12, 2021

Commits on Sep 2, 2021

  1. hrtimer: Don't apply offset to KTIME_MAX values

    The hrtimer_reprogram() function unconditionally adjusts the timer
    expiration time.  In theory, this works (at least for positive offsets)
    because a timeout some centuries into the future is not much different
    than not setting the timer at all.  However, there are equality checks
    for KTIME_MAX downstream, and there could be other benefits to shutting
    down timers entirely.
    
    Therefore, apply the offset only to non-KTIME_MAX expirations.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  2. timers: Fix get_next_timer_interrupt() with no timers pending

    31cd0e1 ("timers: Recalculate next timer interrupt only when
    necessary") subtly altered get_next_timer_interrupt()'s behaviour. The
    function no longer consistently returns KTIME_MAX with no timers
    pending.
    
    In order to decide if there are any timers pending we check whether the
    next expiry will happen NEXT_TIMER_MAX_DELTA jiffies from now.
    Unfortunately, the next expiry time and the timer base clock are no
    longer updated in unison. The former changes upon certain timer
    operations (enqueue, expire, detach), whereas the latter keeps track of
    jiffies as they move forward. Ultimately breaking the logic above.
    
    A simplified example:
    
    - Upon entering get_next_timer_interrupt() with:
    
    	jiffies = 1
    	base->clk = 0;
    	base->next_expiry = NEXT_TIMER_MAX_DELTA;
    
      'base->next_expiry == base->clk + NEXT_TIMER_MAX_DELTA', the function
      returns KTIME_MAX.
    
    - 'base->clk' is updated to the jiffies value.
    
    - The next time we enter get_next_timer_interrupt(), taking into account
      no timer operations happened:
    
    	base->clk = 1;
    	base->next_expiry = NEXT_TIMER_MAX_DELTA;
    
      'base->next_expiry != base->clk + NEXT_TIMER_MAX_DELTA', the function
      returns a valid expire time, which is incorrect.
    
    This ultimately might unnecessarily rearm sched's timer on nohz_full
    setups, and add latency to the system[1].
    
    So, introduce 'base->timers_pending'[2], update it every time
    'base->next_expiry' changes, and use it in get_next_timer_interrupt().
    
    [1] See tick_nohz_stop_tick().
    [2] A quick pahole check on x86_64 and arm64 shows it doesn't make
        'struct timer_base' any bigger.
    
    Fixes: 31cd0e1 ("timers: Recalculate next timer interrupt only when necessary")
    Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
    Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
    vianpl authored and paulmckrcu committed Sep 2, 2021
  3. EXP softirq: More aggressively update tick

    Not-yet-signed-off-by: Frederic Weisbecker <frederic@kernel.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Frederic Weisbecker authored and paulmckrcu committed Sep 2, 2021
  4. rcu-tasks: Fix IPI failure handling in trc_wait_for_one_reader

    The trc_wait_for_one_reader() function is called at multiple stages
    of trace rcu-tasks GP function, rcu_tasks_wait_gp():
    
    - First, it is called as part of per task function -
      rcu_tasks_trace_pertask(), for all non-idle tasks. As part of per task
      processing, this function add the task in the holdout list and if the
      task is currently running on a CPU, it sends IPI to the task's CPU.
      The IPI handler takes action depending on whether task is in trace
      rcu-tasks read side critical section or not:
    
      - a. If the task is in trace rcu-tasks read side critical section
           (t->trc_reader_nesting != 0), the IPI handler sets the task's
           ->trc_reader_special.b.need_qs, so that this task notifies exit
           from its outermost read side critical section (by decrementing
           trc_n_readers_need_end) to the GP handling function.
           trc_wait_for_one_reader() also increments trc_n_readers_need_end,
           so that the trace rcu-tasks GP handler function waits for this
           task's read side exit notification. The IPI handler also sets
           t->trc_reader_checked to true, and no further IPIs are sent for
           this task, for this trace rcu-tasks grace period and this
           task can be removed from holdout list.
    
      - b. If the task is in the process of exiting its trace rcu-tasks
           read side critical section, (t->trc_reader_nesting < 0), defer
           this task's processing to future calls to trc_wait_for_one_reader().
    
      - c. If task is not in rcu-task read side critical section,
           t->trc_reader_nesting == 0, ->trc_reader_checked is set for this
           task, so that this task is removed from holdout list.
    
    - Second, trc_wait_for_one_reader() is called as part of post scan, in
      function rcu_tasks_trace_postscan(), for all idle tasks.
    
    - Third, in function check_all_holdout_tasks_trace(), this function is
      called for each task in the holdout list, but only if there isn't
      a pending IPI for the task (->trc_ipi_to_cpu == -1). This function
      removed the task from holdout list, if IPI handler has completed the
      required work, to ensure that the current trace rcu-tasks grace period
      either waits for this task, or this task is not in a trace rcu-tasks
      read side critical section.
    
    Now, considering the scenario where smp_call_function_single() fails in
    first case, inside rcu_tasks_trace_pertask(). In this case,
    ->trc_ipi_to_cpu is set to the current CPU for that task. This will
    result in trc_wait_for_one_reader() getting skipped in third case,
    inside check_all_holdout_tasks_trace(), for this task. This further
    results in ->trc_reader_checked never getting set for this task,
    and the task not getting removed from holdout list. This can cause
    the current trace rcu-tasks grace period to stall.
    
    Fix the above problem, by resetting ->trc_ipi_to_cpu to -1, on
    smp_call_function_single() failure, so that future IPI calls can
    be send for this task.
    
    Note that all three of the trc_wait_for_one_reader() function's
    callers (rcu_tasks_trace_pertask(), rcu_tasks_trace_postscan(),
    check_all_holdout_tasks_trace()) hold cpu_read_lock().  This means
    that smp_call_function_single() cannot race with CPU hotplug, and thus
    should never fail.  Therefore, also add a warning in order to report
    any such failure in case smp_call_function_single() grows some other
    reason for failure.
    
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  5. rcu: Avoid unneeded function call in rcu_read_unlock()

    Since commit aa40c13 ("rcu: Report QS for outermost PREEMPT=n
    rcu_read_unlock() for strict GPs") the function rcu_read_unlock_strict()
    is invoked by the inlined rcu_read_unlock() function.  However,
    rcu_read_unlock_strict() is an empty function in production kernels,
    which are built with CONFIG_RCU_STRICT_GRACE_PERIOD=n.
    
    There is a mention of rcu_read_unlock_strict() in the BPF verifier,
    but this is in a deny-list, meaning that BPF does not care whether
    rcu_read_unlock_strict() is ever called.
    
    This commit therefore provides a slight performance improvement
    by hoisting the check of CONFIG_RCU_STRICT_GRACE_PERIOD from
    rcu_read_unlock_strict() into rcu_read_unlock(), thus avoiding the
    pointless call to an empty function.
    
    Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
    Cc: Andrii Nakryiko <andrii@kernel.org>
    Signed-off-by: Waiman Long <longman@redhat.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Waiman Long authored and paulmckrcu committed Sep 2, 2021
  6. rcutorture: Avoid problematic critical section nesting on PREEMPT_RT

    rcutorture is generating some nesting scenarios that are not compatible on PREEMPT_RT.
    For example:
    	preempt_disable();
    	rcu_read_lock_bh();
    	preempt_enable();
    	rcu_read_unlock_bh();
    
    The problem here is that on PREEMPT_RT the bottom halves have to be
    disabled and enabled in preemptible context.
    
    Reorder locking: start with BH locking and continue with then with
    disabling preemption or interrupts. In the unlocking do it reverse by
    first enabling interrupts and preemption and BH at the very end.
    Ensure that on PREEMPT_RT BH locking remains unchanged if in
    non-preemptible context.
    
    Link: https://lkml.kernel.org/r/20190911165729.11178-6-swood@redhat.com
    Link: https://lkml.kernel.org/r/20210819182035.GF4126399@paulmck-ThinkPad-P17-Gen-1
    Signed-off-by: Scott Wood <swood@redhat.com>
    [bigeasy: Drop ATOM_BH, make it only about changing BH in atomic
    context. Allow enabling RCU in IRQ-off section. Reword commit message.]
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    swood-rh authored and paulmckrcu committed Sep 2, 2021
  7. rcu-tasks: Fix read-side primitives comment for call_rcu_tasks_trace

    call_rcu_tasks_trace() does have read-side primitives - rcu_read_lock_trace()
    and rcu_read_unlock_trace(). Fix this information in the comments.
    
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  8. rcu: Fix existing exp request check in sync_sched_exp_online_cleanup()

    The sync_sched_exp_online_cleanup() checks to see if RCU needs
    an expedited quiescent state from the incoming CPU, sending it
    an IPI if so. Before sending IPI, it checks whether expedited
    qs need has been already requested for the incoming CPU, by
    checking rcu_data.cpu_no_qs.b.exp for the current cpu, on which
    sync_sched_exp_online_cleanup() is running. This works for the
    case where incoming CPU is same as self. However, for the case
    where incoming CPU is different from self, expedited request
    won't get marked, which can potentially delay reporting of
    expedited quiescent state for the incoming CPU.
    
    Fixes: e015a34 ("rcu: Avoid self-IPI in sync_sched_exp_online_cleanup()")
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  9. rcu-tasks: Clarify read side section info for rcu_tasks_rude GP primi…

    …tives
    
    RCU tasks rude variant does not check whether the current
    running context on a CPU is usermode. Read side critical section ends
    on transition to usermode execution, by the virtue of usermode
    execution being schedulable. Clarify this in comments for
    call_rcu_tasks_rude() and synchronize_rcu_tasks_rude().
    
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  10. rcu-tasks: Correct check for no_hz_full cpu in show_stalled_task_trace

    Correct the check for no_hz_full cpu in show_stalled_task_trace(),
    to include cpu 0.
    
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  11. rcu-tasks: Correct firstreport usage in check_all_holdout_tasks_trace

    In check_all_holdout_tasks_trace(), firstreport is a pointer argument;
    so, check the dereferenced value, instead of checking the pointer.
    
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  12. rcu-tasks: Fix s/rcu_add_holdout/trc_add_holdout/ typo in comment

    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Neeraj Upadhyay authored and paulmckrcu committed Sep 2, 2021
  13. kcsan: selftest: Cleanup and add missing __init

    Make test_encode_decode() more readable and add missing __init.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  14. kcsan: Move ctx to start of argument list

    It is clearer if ctx is at the start of the function argument list;
    it'll be more consistent when adding functions with varying arguments
    but all requiring ctx.
    
    No functional change intended.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  15. kcsan: Support reporting scoped read-write access type

    Support generating the string representation of scoped read-write
    accesses for completeness. They will become required in planned changes.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  16. kcsan: Start stack trace with explicit location if provided

    If an explicit access address is set, as is done for scoped accesses,
    always start the stack trace from that location. get_stack_skipnr() is
    changed into sanitize_stack_entries(), which if given an address, scans
    the stack trace for a matching function and then replaces that entry
    with the explicitly provided address.
    
    The previous reports for scoped accesses were all over the place, which
    could be quite confusing. We now always point at the start of the scope.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  17. kcsan: Save instruction pointer for scoped accesses

    Save the instruction pointer for scoped accesses, so that it becomes
    possible for the reporting code to construct more accurate stack traces
    that will show the start of the scope.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  18. kcsan: Add ability to pass instruction pointer of access to reporting

    Add the ability to pass an explicitly set instruction pointer of access
    from check_access() all the way through to reporting.
    
    In preparation of using it in reporting.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  19. kcsan: test: Fix flaky test case

    If CONFIG_KCSAN_REPORT_VALUE_CHANGE_ONLY=n, then we may also see data
    races between the writers only. If we get unlucky and never capture a
    read-write data race, but only the write-write data races, then the
    test_no_value_change* test cases may incorrectly fail.
    
    The second problem is that the initial value needs to be reset, as
    otherwise we might actually observe a value change at the start.
    
    Fix it by also looking for the write-write data races, and resetting the
    value to what will be written.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  20. kcsan: test: Use kunit_skip() to skip tests

    Use the new kunit_skip() to skip tests if requirements were not met.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  21. kcsan: test: Defer kcsan_test_init() after kunit initialization

    When the test is built into the kernel (not a module), kcsan_test_init()
    and kunit_init() both use late_initcall(), which means kcsan_test_init()
    might see a NULL debugfs_rootdir as parent dentry, resulting in
    kcsan_test_init() and kcsan_debugfs_init() both trying to create a
    debugfs node named "kcsan" in debugfs root. One of them will show an
    error and be unsuccessful.
    
    Defer kcsan_test_init() until we're sure kunit was initialized.
    
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    melver authored and paulmckrcu committed Sep 2, 2021
  22. rcu-tasks: Move RTGS_WAIT_CBS to beginning of rcu_tasks_kthread() loop

    Early in debugging, it made some sense to differentiate the first
    iteration from subsequent iterations, but now this just causes confusion.
    This commit therefore moves the "set_tasks_gp_state(rtp, RTGS_WAIT_CBS)"
    statement to the beginning of the "for" loop in rcu_tasks_kthread().
    
    Reported-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  23. rcu: Make rcu update module parameters world-readable

    rcu update module parameters currently don't appear in sysfs and this is
    a serviceability issue as it might be needed to access their default
    values at runtime.
    
    Fix this issue by changing rcu update module parameters permissions to
    world-readable.
    
    Suggested-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Juri Lelli <juri.lelli@redhat.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    jlelli authored and paulmckrcu committed Sep 2, 2021
  24. rcu: Make rcu_normal_after_boot writable again

    Certain configurations (e.g., systems that make heavy use of netns)
    need to use synchronize_rcu_expedited() to service RCU grace periods
    even after boot.
    
    Even though synchronize_rcu_expedited() has been traditionally
    considered harmful for RT for the heavy use of IPIs, it is perfectly
    usable under certain conditions (e.g. nohz_full).
    
    Make rcupdate.rcu_normal_after_boot= again writeable on RT (if NO_HZ_
    FULL is defined), but keep its default value to 1 (enabled) to avoid
    regressions. Users who need synchronize_rcu_expedited() will boot with
    rcupdate.rcu_normal_after_ boot=0 in the kernel cmdline.
    
    Reflect the change in synchronize_rcu_expedited_wait() by removing the
    WARN related to CONFIG_PREEMPT_RT.
    
    Signed-off-by: Juri Lelli <juri.lelli@redhat.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    jlelli authored and paulmckrcu committed Sep 2, 2021
  25. rcutorture: Don't cpuhp_remove_state() if cpuhp_setup_state() failed

    Currently, in CONFIG_RCU_BOOST kernels, if the rcu_torture_init()
    function's call to cpuhp_setup_state() fails, rcu_torture_cleanup()
    gamely passes nonsense to cpuhp_remove_state().  This results in
    strange and misleading splats.  This commit therefore ensures that if
    the rcu_torture_init() function's call to cpuhp_setup_state() fails,
    rcu_torture_cleanup() avoids invoking cpuhp_remove_state().
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  26. scftorture: Warn on individual scf_torture_init() error conditions

    When running scftorture as a module, any scf_torture_init() issues will be
    reflected in the error code from modprobe or insmod, as the case may be.
    However, these error codes are not available when running scftorture
    built-in, for example, when using the kvm.sh script.  This commit
    therefore adds WARN_ON_ONCE() to allow distinguishing scf_torture_init()
    errors when running scftorture built-in.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  27. rcuscale: Warn on individual rcu_scale_init() error conditions

    When running rcuscale as a module, any rcu_scale_init() issues will be
    reflected in the error code from modprobe or insmod, as the case may be.
    However, these error codes are not available when running rcuscale
    built-in, for example, when using the kvm.sh script.  This commit
    therefore adds WARN_ON_ONCE() to allow distinguishing rcu_scale_init()
    errors when running rcuscale built-in.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  28. refscale: Warn on individual ref_scale_init() error conditions

    When running refscale as a module, any ref_scale_init() issues will be
    reflected in the error code from modprobe or insmod, as the case may be.
    However, these error codes are not available when running refscale
    built-in, for example, when using the kvm.sh script.  This commit
    therefore adds WARN_ON_ONCE() to allow distinguishing ref_scale_init()
    errors when running refscale built-in.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  29. locktorture: Warn on individual lock_torture_init() error conditions

    When running locktorture as a module, any lock_torture_init() issues will be
    reflected in the error code from modprobe or insmod, as the case may be.
    However, these error codes are not available when running locktorture
    built-in, for example, when using the kvm.sh script.  This commit
    therefore adds WARN_ON_ONCE() to allow distinguishing lock_torture_init()
    errors when running locktorture built-in.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  30. rcutorture: Warn on individual rcu_torture_init() error conditions

    When running rcutorture as a module, any rcu_torture_init() issues will be
    reflected in the error code from modprobe or insmod, as the case may be.
    However, these error codes are not available when running rcutorture
    built-in, for example, when using the kvm.sh script.  This commit
    therefore adds WARN_ON_ONCE() to allow distinguishing rcu_torture_init()
    errors when running rcutorture built-in.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  31. torture: Make kvm-remote.sh print size of downloaded tarball

    This commit causes kvm-remote.sh to print the size of the tarball that
    is downloaded to each of the remote systems.  This size can help with
    performance projections and analysis.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  32. rcu-tasks: Fix s/instruction/instructions/ typo in comment

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  33. rcutorture: Suppressing read-exit testing is not an error

    Currently, specifying the rcutorture.read_exit_burst=0 kernel boot
    parameter will result in a -EINVAL exit code that will stop the rcutorture
    test run before it has fully initialized.  This commit therefore uses a
    zero exit code in that case, thus allowing rcutorture.read_exit_burst=0
    to complete normally.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
  34. rcu: Make rcutree_dying_cpu() use its "cpu" parameter

    The CPU-hotplug functions take a "cpu" parameter, but rcutree_dying_cpu()
    ignores it in favor of this_cpu_ptr().  This works at the moment, but
    it would be better to be consistent.  This might also work better given
    some possible future changes.  This commit therefore uses per_cpu_ptr()
    to avoid ignoring the rcutree_dying_cpu() function's argument.
    
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    paulmckrcu committed Sep 2, 2021
Older