summaryrefslogtreecommitdiff
path: root/kernel/entry
diff options
context:
space:
mode:
authorPeter Zijlstra (Intel) <peterz@infradead.org>2021-01-18 15:12:22 +0100
committerIngo Molnar <mingo@kernel.org>2021-02-17 14:12:42 +0100
commit40607ee97e4eec5655cc0f76a720bdc4c63a6434 (patch)
tree7f6d888bf7f72306f4cdc986b3e2af6524f30270 /kernel/entry
parent2c9a98d3bc808717ab63ad928a2b568967775388 (diff)
downloadlwn-40607ee97e4eec5655cc0f76a720bdc4c63a6434.tar.gz
lwn-40607ee97e4eec5655cc0f76a720bdc4c63a6434.zip
preempt/dynamic: Provide irqentry_exit_cond_resched() static call
Provide static call to control IRQ preemption (called in CONFIG_PREEMPT) so that we can override its behaviour when preempt= is overriden. Since the default behaviour is full preemption, its call is initialized to provide IRQ preemption when preempt= isn't passed. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lkml.kernel.org/r/20210118141223.123667-8-frederic@kernel.org
Diffstat (limited to 'kernel/entry')
-rw-r--r--kernel/entry/common.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/kernel/entry/common.c b/kernel/entry/common.c
index f9d491b17b78..f09cae37ddd5 100644
--- a/kernel/entry/common.c
+++ b/kernel/entry/common.c
@@ -385,6 +385,9 @@ void irqentry_exit_cond_resched(void)
preempt_schedule_irq();
}
}
+#ifdef CONFIG_PREEMPT_DYNAMIC
+DEFINE_STATIC_CALL(irqentry_exit_cond_resched, irqentry_exit_cond_resched);
+#endif
noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state)
{
@@ -411,8 +414,13 @@ noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state)
}
instrumentation_begin();
- if (IS_ENABLED(CONFIG_PREEMPTION))
+ if (IS_ENABLED(CONFIG_PREEMPTION)) {
+#ifdef CONFIG_PREEMT_DYNAMIC
+ static_call(irqentry_exit_cond_resched)();
+#else
irqentry_exit_cond_resched();
+#endif
+ }
/* Covers both tracing and lockdep */
trace_hardirqs_on();
instrumentation_end();