[PATCH 00/21] rcu/context-tracking: Merge RCU eqs-dynticks counter to context tracking v2

Frederic Weisbecker posted 21 patches 4 years ago
.../RCU/Design/Requirements/Requirements.rst       |  10 +-
Documentation/RCU/stallwarn.rst                    |   6 +-
.../time/context-tracking/arch-support.txt         |   6 +-
arch/Kconfig                                       |   8 +-
arch/arm/Kconfig                                   |   2 +-
arch/arm/kernel/entry-common.S                     |   4 +-
arch/arm/kernel/entry-header.S                     |  12 +-
arch/arm/mach-imx/cpuidle-imx6q.c                  |   5 +-
arch/arm64/Kconfig                                 |   2 +-
arch/arm64/kernel/entry-common.c                   |  14 +-
arch/csky/Kconfig                                  |   2 +-
arch/csky/kernel/entry.S                           |   8 +-
arch/mips/Kconfig                                  |   2 +-
arch/powerpc/Kconfig                               |   2 +-
arch/powerpc/include/asm/context_tracking.h        |   2 +-
arch/riscv/Kconfig                                 |   2 +-
arch/riscv/kernel/entry.S                          |  12 +-
arch/sparc/Kconfig                                 |   2 +-
arch/sparc/kernel/rtrap_64.S                       |   2 +-
arch/x86/Kconfig                                   |   4 +-
arch/x86/mm/fault.c                                |   2 +-
drivers/acpi/processor_idle.c                      |   5 +-
drivers/cpuidle/cpuidle-psci.c                     |   8 +-
drivers/cpuidle/cpuidle-riscv-sbi.c                |   8 +-
drivers/cpuidle/cpuidle.c                          |   9 +-
include/linux/context_tracking.h                   |  89 ++--
include/linux/context_tracking_irq.h               |  21 +
include/linux/context_tracking_state.h             | 103 +++-
include/linux/entry-common.h                       |  10 +-
include/linux/hardirq.h                            |  12 +-
include/linux/rcupdate.h                           |  15 +-
include/linux/rcutiny.h                            |   6 -
include/linux/rcutree.h                            |  15 +-
include/linux/tracepoint.h                         |   4 +-
init/Kconfig                                       |   4 +-
kernel/context_tracking.c                          | 556 +++++++++++++++++++--
kernel/cpu_pm.c                                    |   8 +-
kernel/entry/common.c                              |  16 +-
kernel/extable.c                                   |   4 +-
kernel/locking/lockdep.c                           |   2 +-
kernel/rcu/Kconfig                                 |   2 +
kernel/rcu/rcu.h                                   |   4 -
kernel/rcu/tree.c                                  | 476 +-----------------
kernel/rcu/tree.h                                  |   8 -
kernel/rcu/tree_exp.h                              |   2 +-
kernel/rcu/tree_plugin.h                           |  38 +-
kernel/rcu/tree_stall.h                            |   8 +-
kernel/rcu/update.c                                |   2 +-
kernel/sched/core.c                                |   2 +-
kernel/sched/idle.c                                |  10 +-
kernel/sched/sched.h                               |   1 +
kernel/softirq.c                                   |   4 +-
kernel/time/Kconfig                                |  22 +-
kernel/time/tick-sched.c                           |   2 +-
kernel/trace/trace.c                               |   8 +-
55 files changed, 845 insertions(+), 748 deletions(-)
[PATCH 00/21] rcu/context-tracking: Merge RCU eqs-dynticks counter to context tracking v2
Posted by Frederic Weisbecker 4 years ago
This mixes up the RCU dynticks counter and the context tracking state
updates into a single atomic instruction. This may serve several
purposes:

1) Improve CPU isolation with deferring some disturbances until sensitive
   userspace workload completes and goes to the kernel. This can take
   several forms, for example smp_call_function_housekeeping() or
   on_each_housekeeping_cpu() to enqueue and execute work on all
   housekeeping CPUs. Then an atomic operation on ct->state can defer
   the work on nohz_full CPUs until they run in kernel (or IPI them
   if they are in kernel mode), see this proposal by Peter:
   https://lore.kernel.org/all/20210929151723.162004989@infradead.org/#r

2) Unearth sysidle (https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git/commit/?h=sysidle.2017.05.11a&id=fe5ac724d81a3c7803e60c2232718f212f3f38d4)
   This feature allowed to shutdown the tick on the last housekeeping
   CPU once the rest of the system is fully idle. We needed some proper
   fully ordered context tracking for that.

Inspired by Peterz: https://lore.kernel.org/all/20210929151723.162004989@infradead.org

Passed 100 hours of TREE01.

---
Changes since v1 after Paul, Nicolas and Peter's reviews:

* Rebased against latest rcu:dev

* Remove context_tracking_in_user()

* Tag rcu_idle_enter() as noinstr

* Add comments to explain why some RCU and context tracking functions can not
  be tagged as noinstr yet even though they should

* Add Acks from Paul

* Rename context_tracking_cpu_set() to ct_cpu_track_user()

* Some changelogs fixed

* Fix missing renames in cpuidle

* Add missing header comments for ct_irq_*()

* Add accessors for ->dynticks_nesting and ->dynticks_nmi_nesting

* Fix ->dynticks_nesting[_nmi] that were printed from the local ct
  instead of the remote one

* Only build rcu_irq_exit_check_preempt() when CONFIG_NO_HZ_FULL=y

* Remove static from rcu_preempt_deferred_qs() for all configs

* CONTEXT_* values now count from 0 to 4 instead of using bit flags,
  since all these states are mutually exclusive anyway.
  Therefore RCU_DYNTICKS_IDX now starts at 4 instead of 8.

* Keep the lowest bits of rcu_dynticks_snap() and expand a bit the
  printing size accordingly.

---
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
	rcu/context-tracking-v2

HEAD: 0364ddb8830db4d4b78f7bfd9344e12d22e9cd32

Thanks,
	Frederic
---

Frederic Weisbecker (21):
      context_tracking: Remove unused context_tracking_in_user()
      rcu: Set rcu_idle_enter() as noinstr
      rcu: Add a note about noinstr VS unsafe eqs functions
      context_tracking: Add a note about noinstr VS unsafe context tracking functions
      context_tracking: Rename __context_tracking_enter/exit() to __ct_user_enter/exit()
      context_tracking: Rename context_tracking_user_enter/exit() to user_enter/exit_callable()
      context_tracking: Rename context_tracking_enter/exit() to ct_user_enter/exit()
      context_tracking: Rename context_tracking_cpu_set() to ct_cpu_track_user()
      context_tracking: Split user tracking Kconfig
      context_tracking: Take idle eqs entrypoints over RCU
      context_tracking: Take IRQ eqs entrypoints over RCU
      context_tracking: Take NMI eqs entrypoints over RCU
      rcu/context-tracking: Remove rcu_irq_enter/exit()
      rcu/context_tracking: Move dynticks counter to context tracking
      rcu/context_tracking: Move dynticks_nesting to context tracking
      rcu/context_tracking: Move dynticks_nmi_nesting to context tracking
      rcu/context-tracking: Move deferred nocb resched to context tracking
      rcu/context-tracking: Move RCU-dynticks internal functions to context_tracking
      rcu/context-tracking: Remove unused and/or unecessary middle functions
      context_tracking: Convert state to atomic_t
      rcu/context_tracking: Merge dynticks counter and context tracking states


 .../RCU/Design/Requirements/Requirements.rst       |  10 +-
 Documentation/RCU/stallwarn.rst                    |   6 +-
 .../time/context-tracking/arch-support.txt         |   6 +-
 arch/Kconfig                                       |   8 +-
 arch/arm/Kconfig                                   |   2 +-
 arch/arm/kernel/entry-common.S                     |   4 +-
 arch/arm/kernel/entry-header.S                     |  12 +-
 arch/arm/mach-imx/cpuidle-imx6q.c                  |   5 +-
 arch/arm64/Kconfig                                 |   2 +-
 arch/arm64/kernel/entry-common.c                   |  14 +-
 arch/csky/Kconfig                                  |   2 +-
 arch/csky/kernel/entry.S                           |   8 +-
 arch/mips/Kconfig                                  |   2 +-
 arch/powerpc/Kconfig                               |   2 +-
 arch/powerpc/include/asm/context_tracking.h        |   2 +-
 arch/riscv/Kconfig                                 |   2 +-
 arch/riscv/kernel/entry.S                          |  12 +-
 arch/sparc/Kconfig                                 |   2 +-
 arch/sparc/kernel/rtrap_64.S                       |   2 +-
 arch/x86/Kconfig                                   |   4 +-
 arch/x86/mm/fault.c                                |   2 +-
 drivers/acpi/processor_idle.c                      |   5 +-
 drivers/cpuidle/cpuidle-psci.c                     |   8 +-
 drivers/cpuidle/cpuidle-riscv-sbi.c                |   8 +-
 drivers/cpuidle/cpuidle.c                          |   9 +-
 include/linux/context_tracking.h                   |  89 ++--
 include/linux/context_tracking_irq.h               |  21 +
 include/linux/context_tracking_state.h             | 103 +++-
 include/linux/entry-common.h                       |  10 +-
 include/linux/hardirq.h                            |  12 +-
 include/linux/rcupdate.h                           |  15 +-
 include/linux/rcutiny.h                            |   6 -
 include/linux/rcutree.h                            |  15 +-
 include/linux/tracepoint.h                         |   4 +-
 init/Kconfig                                       |   4 +-
 kernel/context_tracking.c                          | 556 +++++++++++++++++++--
 kernel/cpu_pm.c                                    |   8 +-
 kernel/entry/common.c                              |  16 +-
 kernel/extable.c                                   |   4 +-
 kernel/locking/lockdep.c                           |   2 +-
 kernel/rcu/Kconfig                                 |   2 +
 kernel/rcu/rcu.h                                   |   4 -
 kernel/rcu/tree.c                                  | 476 +-----------------
 kernel/rcu/tree.h                                  |   8 -
 kernel/rcu/tree_exp.h                              |   2 +-
 kernel/rcu/tree_plugin.h                           |  38 +-
 kernel/rcu/tree_stall.h                            |   8 +-
 kernel/rcu/update.c                                |   2 +-
 kernel/sched/core.c                                |   2 +-
 kernel/sched/idle.c                                |  10 +-
 kernel/sched/sched.h                               |   1 +
 kernel/softirq.c                                   |   4 +-
 kernel/time/Kconfig                                |  22 +-
 kernel/time/tick-sched.c                           |   2 +-
 kernel/trace/trace.c                               |   8 +-
 55 files changed, 845 insertions(+), 748 deletions(-)
Re: [PATCH 00/21] rcu/context-tracking: Merge RCU eqs-dynticks counter to context tracking v2
Posted by Nicolas Saenz Julienne 3 years, 11 months ago
On Tue, 2022-05-03 at 12:00 +0200, Frederic Weisbecker wrote:
> This mixes up the RCU dynticks counter and the context tracking state
> updates into a single atomic instruction. This may serve several
> purposes:
> 
> 1) Improve CPU isolation with deferring some disturbances until sensitive
>    userspace workload completes and goes to the kernel. This can take
>    several forms, for example smp_call_function_housekeeping() or
>    on_each_housekeeping_cpu() to enqueue and execute work on all
>    housekeeping CPUs. Then an atomic operation on ct->state can defer
>    the work on nohz_full CPUs until they run in kernel (or IPI them
>    if they are in kernel mode), see this proposal by Peter:
>    https://lore.kernel.org/all/20210929151723.162004989@infradead.org/#r
> 
> 2) Unearth sysidle (https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git/commit/?h=sysidle.2017.05.11a&id=fe5ac724d81a3c7803e60c2232718f212f3f38d4)
>    This feature allowed to shutdown the tick on the last housekeeping
>    CPU once the rest of the system is fully idle. We needed some proper
>    fully ordered context tracking for that.
> 
> Inspired by Peterz: https://lore.kernel.org/all/20210929151723.162004989@infradead.org
> 
> Passed 100 hours of TREE01.
> 
> ---

For the whole series:

Reviewed-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
Tested-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>

Thanks!

-- 
Nicolás Sáenz
Re: [PATCH 00/21] rcu/context-tracking: Merge RCU eqs-dynticks counter to context tracking v2
Posted by Frederic Weisbecker 3 years, 11 months ago
On Wed, May 18, 2022 at 05:33:02PM +0200, Nicolas Saenz Julienne wrote:
> On Tue, 2022-05-03 at 12:00 +0200, Frederic Weisbecker wrote:
> > This mixes up the RCU dynticks counter and the context tracking state
> > updates into a single atomic instruction. This may serve several
> > purposes:
> > 
> > 1) Improve CPU isolation with deferring some disturbances until sensitive
> >    userspace workload completes and goes to the kernel. This can take
> >    several forms, for example smp_call_function_housekeeping() or
> >    on_each_housekeeping_cpu() to enqueue and execute work on all
> >    housekeeping CPUs. Then an atomic operation on ct->state can defer
> >    the work on nohz_full CPUs until they run in kernel (or IPI them
> >    if they are in kernel mode), see this proposal by Peter:
> >    https://lore.kernel.org/all/20210929151723.162004989@infradead.org/#r
> > 
> > 2) Unearth sysidle (https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git/commit/?h=sysidle.2017.05.11a&id=fe5ac724d81a3c7803e60c2232718f212f3f38d4)
> >    This feature allowed to shutdown the tick on the last housekeeping
> >    CPU once the rest of the system is fully idle. We needed some proper
> >    fully ordered context tracking for that.
> > 
> > Inspired by Peterz: https://lore.kernel.org/all/20210929151723.162004989@infradead.org
> > 
> > Passed 100 hours of TREE01.
> > 
> > ---
> 
> For the whole series:
> 
> Reviewed-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
> Tested-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>

I hesitated to apply these but the series has changed a little, although
the fundamental bits remain.

I'll just wait for a confirmation from you on this v3.

Thanks!