[PATCH v6 00/12]powerpc: "paca->soft_enabled" based local atomic operation implementation
Madhavan Srinivasan
maddy at linux.vnet.ibm.com
Tue Feb 7 15:22:58 AEDT 2017
Hi mpe,
Any update on this series. Have also fixed the naming issue with patch 12
and with this series applied,
"paca->soft_enabled" becomes "paca->soft_disabled_mask"
Kindly let me know your comments.
Maddy
On Monday 09 January 2017 07:06 PM, Madhavan Srinivasan wrote:
> Local atomic operations are fast and highly reentrant per CPU counters.
> Used for percpu variable updates. Local atomic operations only guarantee
> variable modification atomicity wrt the CPU which owns the data and
> these needs to be executed in a preemption safe way.
>
> Here is the design of the patchset. Since local_* operations
> are only need to be atomic to interrupts (IIUC), we have two options.
> Either replay the "op" if interrupted or replay the interrupt after
> the "op". Initial patchset posted was based on implementing local_* operation
> based on CR5 which replay's the "op". Patchset had issues in case of
> rewinding the address pointor from an array. This make the slow path
> really slow. Since CR5 based implementation proposed using __ex_table to find
> the rewind address, this rasied concerns about size of __ex_table and vmlinux.
>
> https://lists.ozlabs.org/pipermail/linuxppc-dev/2014-December/123115.html
>
> But this patchset uses Benjamin Herrenschmidt suggestion of using
> arch_local_irq_disable() to soft_disable interrupts (including PMIs).
> After finishing the "op", arch_local_irq_restore() called and correspondingly
> interrupts are replayed if any occured.
>
> Current paca->soft_enabled logic is reserved and MASKABLE_EXCEPTION_* macros
> are extended to support this feature.
>
> patch re-write the current local_* functions to use arch_local_irq_disbale.
> Base flow for each function is
>
> {
> powerpc_local_irq_pmu_save(flags)
> load
> ..
> store
> powerpc_local_irq_pmu_restore(flags)
> }
>
> Reason for the approach is that, currently l[w/d]arx/st[w/d]cx.
> instruction pair is used for local_* operations, which are heavy
> on cycle count and they dont support a local variant. So to
> see whether the new implementation helps, used a modified
> version of Rusty's benchmark code on local_t.
>
> https://lkml.org/lkml/2008/12/16/450
>
> Modifications to Rusty's benchmark code:
> - Executed only local_t test
>
> Here are the values with the patch.
>
> Time in ns per iteration
>
> Local_t Without Patch With Patch
>
> _inc 28 8
> _add 28 8
> _read 3 3
> _add_return 28 7
>
> Currently only asm/local.h has been rewritten, and also
> the entire change is tested only in PPC64 (pseries guest)
> and PPC64 LE host. Have only compile tested ppc64e_*.
>
> First five are the clean up patches which lays the foundation
> to make things easier. Fifth patch in the patchset reverse the
> current soft_enabled logic and commit message details the reason and
> need for this change. Six and seventh patch refactor's the __EXPECTION_PROLOG_1
> code to support addition of a new parameter to MASKABLE_* macros. New parameter
> will give the possible mask for the interrupt. Rest of the patches are
> to add support for maskable PMI and implementation of local_t using powerpc_local_irq_pmu_*().
>
> Other suggestions from Nick: (planned to be handled via separate follow up patchset):
> 1)builtin_constants for the soft_enabled manipulation functions
> 2)Update the proper clobber for "r13->soft_enabled" updates and add barriers()
> to caller functions
>
> Changelog v5:
> 1)Fixed the check in hard_irq_disable() macro for soft_disabled_mask
>
> Changelog v4:
> 1)split the __SOFT_ENABLED logic check from patch 7 and merged to soft_enabled
> logic reversing patch.
> 2)Made changes to commit messages
> 3)Added a new IRQ_DISBALE_MASK_ALL to include supported disabled mask bits.
>
> Changelog v3:
> 1)Made suggest to commit messages
> 2)Added a new patch (patch 12) to rename the soft_enabled to soft_disabled_mask
>
> Changelog v2:
> Rebased to latest upstream
>
> Changelog v1:
> 1)squashed patches 1/2 together and 8/9/10 together for readability
> 2)Created a separate patch for the kconfig changes
> 3)Moved the new mask value commit to patch 11.
> 4)Renamed local_irq_pmu_*() to powerpc_irq_pmu_*() to avoid
> namespaces matches with generic kernel local_irq*() functions
> 5)Renamed __EXCEPTION_PROLOG_1 macro to MASKABLE_EXCEPTION_PROLOG_1 macro
> 6)Made changes to commit messages
> 7)Add more comments to codes
>
> Changelog RFC v5:
> 1)Implemented new set of soft_enabled manipulation functions
> 2)rewritten arch_local_irq_* functions to use the new soft_enabled_*()
> 3)Add WARN_ON to identify invalid soft_enabled transitions
> 4)Added powerpc_local_irq_pmu_save() and powerpc_local_irq_pmu_restore() to
> support masking of irqs (with PMI).
> 5)Added local_irq_pmu_*()s macros with trace_hardirqs_on|off() to match
> include/linux/irqflags.h
>
> Changelog RFC v4:
> 1)Fix build breaks in in ppc64e_defconfig compilation
> 2)Merged PMI replay code with the exception vector changes patch
> 3)Renamed the new API to set PMI mask bit as suggested
> 4)Modified the current arch_local_save and new API function call to
> "OR" and store the value to ->soft_enabled instead of just store.
> 5)Updated the check in the arch_local_irq_restore() to alway check for
> greather than or zero to _LINUX mask bit.
> 6)Updated the commit messages.
>
> Changelog RFC v3:
> 1)Squashed PMI masked interrupt patch and replay patch together
> 2)Have created a new patch which includes a new Kconfig and set_irq_set_mask()
> 3)Fixed the compilation issue with IRQ_DISABLE_MASK_* macros in book3e_*
>
> Changelog RFC v2:
> 1)Renamed IRQ_DISABLE_LEVEL_* to IRQ_DISABLE_MASK_* and made logic changes
> to treat soft_enabled as a mask and not a flag or level.
> 2)Added a new Kconfig variable to support a WARN_ON
> 3)Refactored patchset for eaiser review.
> 4)Made changes to commit messages.
> 5)Made changes for BOOK3E version
>
> Changelog RFC v1:
>
> 1)Commit messages are improved.
> 2)Renamed the arch_local_irq_disable_var to soft_irq_set_level as suggested
> 3)Renamed the LAZY_INTERRUPT* macro to IRQ_DISABLE_LEVEL_* as suggested
> 4)Extended the MASKABLE_EXCEPTION* macros to support additional parameter.
> 5)Each MASKABLE_EXCEPTION_* macro will carry a "mask_level"
> 6)Logic to decide on jump to maskable_handler in SOFTEN_TEST is now based on
> "mask_level"
> 7)__EXCEPTION_PROLOG_1 is factored out to support "mask_level" parameter.
> This reduced the code changes needed for supporting "mask_level" parameters.
>
> Madhavan Srinivasan (12):
> powerpc: Add #defs for paca->soft_enabled flags
> powerpc: move set_soft_enabled() and rename
> powerpc: Use soft_enabled_set api to update paca->soft_enabled
> powerpc: Add soft_enabled manipulation functions
> powerpc: reverse the soft_enable logic
> powerpc: Avoid using EXCEPTION_PROLOG_1 macro in MASKABLE_*
> Add support to take additional parameter in MASKABLE_* macro
> powerpc: Add support to mask perf interrupts and replay them
> powerpc:Add new kconfig IRQ_DEBUG_SUPPORT
> powerpc: Add new set of soft_enabled_ functions
> powerpc: rewrite local_t using soft_irq
> powerpc: Rename soft_enabled to soft_disabled_mask
>
> arch/powerpc/Kconfig | 4 +
> arch/powerpc/include/asm/exception-64s.h | 99 +++++++++------
> arch/powerpc/include/asm/head-64.h | 40 +++---
> arch/powerpc/include/asm/hw_irq.h | 119 ++++++++++++++++--
> arch/powerpc/include/asm/irqflags.h | 8 +-
> arch/powerpc/include/asm/kvm_ppc.h | 2 +-
> arch/powerpc/include/asm/local.h | 201 +++++++++++++++++++++++++++++++
> arch/powerpc/include/asm/paca.h | 2 +-
> arch/powerpc/kernel/asm-offsets.c | 2 +-
> arch/powerpc/kernel/entry_64.S | 24 ++--
> arch/powerpc/kernel/exceptions-64e.S | 8 +-
> arch/powerpc/kernel/exceptions-64s.S | 38 +++---
> arch/powerpc/kernel/head_64.S | 5 +-
> arch/powerpc/kernel/idle_book3e.S | 3 +-
> arch/powerpc/kernel/idle_power4.S | 3 +-
> arch/powerpc/kernel/irq.c | 48 ++++++--
> arch/powerpc/kernel/process.c | 3 +-
> arch/powerpc/kernel/setup_64.c | 5 +-
> arch/powerpc/kernel/time.c | 6 +-
> arch/powerpc/mm/hugetlbpage.c | 2 +-
> arch/powerpc/perf/core-book3s.c | 2 +-
> arch/powerpc/xmon/xmon.c | 4 +-
> 22 files changed, 498 insertions(+), 130 deletions(-)
>
More information about the Linuxppc-dev
mailing list