Skip to content

Commit 4e90d05

Browse files
xhackerustcpalmer-dabbelt
authored andcommitted
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 99cf983 ("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. Signed-off-by: Jisheng Zhang <jszhang@kernel.org> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Link: https://lore.kernel.org/r/20230716164925.1858-1-jszhang@kernel.org Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
1 parent 150e3c9 commit 4e90d05

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

arch/riscv/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ config RISCV
134134
select HAVE_PERF_REGS
135135
select HAVE_PERF_USER_STACK_DUMP
136136
select HAVE_POSIX_CPU_TIMERS_TASK_WORK
137+
select HAVE_PREEMPT_DYNAMIC_KEY if !XIP_KERNEL
137138
select HAVE_REGS_AND_STACK_ACCESS_API
138139
select HAVE_RETHOOK if !XIP_KERNEL
139140
select HAVE_RSEQ

include/asm-generic/preempt.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,21 @@ static __always_inline bool should_resched(int preempt_offset)
8080

8181
#ifdef CONFIG_PREEMPTION
8282
extern asmlinkage void preempt_schedule(void);
83-
#define __preempt_schedule() preempt_schedule()
8483
extern asmlinkage void preempt_schedule_notrace(void);
84+
85+
#if defined(CONFIG_PREEMPT_DYNAMIC) && defined(CONFIG_HAVE_PREEMPT_DYNAMIC_KEY)
86+
87+
void dynamic_preempt_schedule(void);
88+
void dynamic_preempt_schedule_notrace(void);
89+
#define __preempt_schedule() dynamic_preempt_schedule()
90+
#define __preempt_schedule_notrace() dynamic_preempt_schedule_notrace()
91+
92+
#else /* !CONFIG_PREEMPT_DYNAMIC || !CONFIG_HAVE_PREEMPT_DYNAMIC_KEY*/
93+
94+
#define __preempt_schedule() preempt_schedule()
8595
#define __preempt_schedule_notrace() preempt_schedule_notrace()
96+
97+
#endif /* CONFIG_PREEMPT_DYNAMIC && CONFIG_HAVE_PREEMPT_DYNAMIC_KEY*/
8698
#endif /* CONFIG_PREEMPTION */
8799

88100
#endif /* __ASM_PREEMPT_H */

0 commit comments

Comments
 (0)