riscv: support PREEMPT_DYNAMIC with static keys
Subsystems (2)
PATCH v2 1/1 riscv: support PREEMPT_DYNAMIC with static keys
Currently, each architecture can support PREEMPT_DYNAMIC through either static calls or static keys. To support PREEMPT_DYNAMIC on riscv, we face three choices:
1. only add static calls support to riscv
As Mark pointed out in commit 99cf983cc8bc ("sched/preempt: Add PREEMPT_DYNAMIC using static keys"), static keys "...should have slightly lower overhead than non-inline static calls, as this effectively inlines each trampoline into the start of its callee. This may avoid redundant work, and may integrate better with CFI schemes." So even we add static calls(without inline static calls) to riscv, static keys is still a better choice.
2. add static calls and inline static calls to riscv Per my understanding, inline static calls requires objtool support which is not easy.
3. use static keys
While riscv doesn't have static calls support, it supports static keys perfectly. So this patch selects HAVE_PREEMPT_DYNAMIC_KEY to enable support for PREEMPT_DYNAMIC on riscv, so that the preemption model can be chosen at boot time. It also patches asm-generic/preempt.h, mainly to add __preempt_schedule() and __preempt_schedule_notrace() macros for PREEMPT_DYNAMIC case. Other architectures which use generic preempt.h can also benefit from this patch by simply selecting HAVE_PREEMPT_DYNAMIC_KEY to enable PREEMPT_DYNAMIC if they supports static keys.
---
since v1:
- keep Kconfig entries sorted
- group asm-generic modifications under CONFIG_PREEMPT_DYNAMIC && CONFIG_HAVE_PREEMPT_DYNAMIC_KEY)
arch/riscv/Kconfig | 1 + include/asm-generic/preempt.h | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-)
arch/riscv/Kconfig +1 -0
@@ -130,6 +130,7 @@ config RISCV select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP select HAVE_POSIX_CPU_TIMERS_TASK_WORK + select HAVE_PREEMPT_DYNAMIC_KEY if !XIP_KERNEL select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_RETHOOK if !XIP_KERNEL select HAVE_RSEQ
include/asm-generic/preempt.h +13 -1
@@ -80,9 +80,21 @@ static __always_inline bool should_resched(int preempt_offset)#ifdef CONFIG_PREEMPTION extern asmlinkage void preempt_schedule(void); -#define __preempt_schedule () preempt_schedule() extern asmlinkage void preempt_schedule_notrace(void); + +#if defined(CONFIG_PREEMPT_DYNAMIC ) && defined(CONFIG_HAVE_PREEMPT_DYNAMIC_KEY ) + +void dynamic_preempt_schedule (void ); +void dynamic_preempt_schedule_notrace (void ); +#define __preempt_schedule () dynamic_preempt_schedule() +#define __preempt_schedule_notrace () dynamic_preempt_schedule_notrace() + +#else /* !CONFIG_PREEMPT_DYNAMIC || !CONFIG_HAVE_PREEMPT_DYNAMIC_KEY*/ + +#define __preempt_schedule () preempt_schedule()#define __preempt_schedule_notrace () preempt_schedule_notrace() + +#endif /* CONFIG_PREEMPT_DYNAMIC && CONFIG_HAVE_PREEMPT_DYNAMIC_KEY*/ #endif /* CONFIG_PREEMPTION */ #endif /* __ASM_PREEMPT_H */
Signature · 1 line
2.40.1
Quoted 45 lines · Jisheng Zhang
Currently, each architecture can support
PREEMPT_DYNAMICthrough either static calls or static keys. To supportPREEMPT_DYNAMICon riscv, we face three choices:1. only add static calls support to riscv
As Mark pointed out in commit99cf983cc8bc("sched/preempt: AddPREEMPT_DYNAMICusing static keys"), static keys "...should have slightly lower overhead than non-inline static calls, as this effectively inlines each trampoline into the start of its callee. This may avoid redundant work, and may integrate better with CFI schemes." So even we add static calls(without inline static calls) to riscv, static keys is still a better choice.2. add static calls and inline static calls to riscv Per my understanding, inline static calls requires objtool support which is not easy.
3. use static keys
While riscv doesn't have static calls support, it supports static keys perfectly. So this patch selects
HAVE_PREEMPT_DYNAMIC_KEYto enable support forPREEMPT_DYNAMICon riscv, so that the preemption model can be chosen at boot time. It also patchesasm-generic/preempt.h, mainly to add__preempt_schedule()and__preempt_schedule_notrace()macros forPREEMPT_DYNAMICcase. Other architectures which use genericpreempt.hcan also benefit from this patch by simply selectingHAVE_PREEMPT_DYNAMIC_KEYto enablePREEMPT_DYNAMICif they supports static keys.Signed-off-by Jisheng Zhang <[email protected]>---
since v1:
- keepKconfigentries sorted
- group asm-generic modifications underCONFIG_PREEMPT_DYNAMIC&&CONFIG_HAVE_PREEMPT_DYNAMIC_KEY)arch/riscv/Kconfig | 1 + include/asm-generic/preempt.h | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-)arch/riscv/Kconfig +0
-0
arch/riscv/Kconfig config RISCV · line 133
Quoted 4 lines
arch/riscv/Kconfig +1
-0@@ -130,6 +130,7 @@ config RISCV select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP select HAVE_POSIX_CPU_TIMERS_TASK_WORK + select HAVE_PREEMPT_DYNAMIC_KEY if !XIP_KERNEL
Had a go of this, and it seems fine to me, as do the asm-generic bits seem fine from a single arch perspective.
Thanks,
Conor.
This patch was applied to riscv/linux.git (for-next) by Palmer Dabbelt <[email protected]>:
Hello:
This patch was applied to riscv/linux.git (for-next) by Palmer Dabbelt <[email protected]>:
Quoted 13 lines · On Mon, 17 Jul 2023 00:49:25 +0800 you wrote:
Currently, each architecture can support
PREEMPT_DYNAMICthrough either static calls or static keys. To supportPREEMPT_DYNAMICon riscv, we face three choices:1. only add static calls support to riscv
As Mark pointed out in commit99cf983cc8bc("sched/preempt: AddPREEMPT_DYNAMICusing static keys"), static keys "...should have slightly lower overhead than non-inline static calls, as this effectively inlines each trampoline into the start of its callee. This may avoid redundant work, and may integrate better with CFI schemes." So even we add static calls(without inline static calls) to riscv, static keys is still a better choice.
Quoted 1 line
[...]
Here is the summary with links:
- [v2] riscv: support PREEMPT_DYNAMIC with static keys
https://git.kernel.org/riscv/c/15e062726f55
You are awesome, thank you!
Signature · 9 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv