summaryrefslogtreecommitdiff
path: root/kernel/entry
diff options
context:
space:
mode:
authorSven Schnelle <svens@linux.ibm.com>2020-12-01 15:27:55 +0100
committerThomas Gleixner <tglx@linutronix.de>2020-12-02 15:07:58 +0100
commitc6156e1da633f241e132eaea3b676d674376d770 (patch)
treec3d78a19a518c4e3358f1949306be1494b55d793 /kernel/entry
parent310de1a678b2184c078c593dae343cb79c807f8d (diff)
entry: Add syscall_exit_to_user_mode_work()
This is the same as syscall_exit_to_user_mode() but without calling exit_to_user_mode(). This can be used if there is an architectural reason to avoid the combo function, e.g. restarting a syscall without returning to userspace. Before returning to user space the caller has to invoke exit_to_user_mode(). [ tglx: Amended comments ] Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20201201142755.31931-6-svens@linux.ibm.com
Diffstat (limited to 'kernel/entry')
-rw-r--r--kernel/entry/common.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/kernel/entry/common.c b/kernel/entry/common.c
index 48d30ce2e00e..d6b73937dab3 100644
--- a/kernel/entry/common.c
+++ b/kernel/entry/common.c
@@ -282,12 +282,22 @@ static void syscall_exit_to_user_mode_prepare(struct pt_regs *regs)
syscall_exit_work(regs, work);
}
-__visible noinstr void syscall_exit_to_user_mode(struct pt_regs *regs)
+static __always_inline void __syscall_exit_to_user_mode_work(struct pt_regs *regs)
{
- instrumentation_begin();
syscall_exit_to_user_mode_prepare(regs);
local_irq_disable_exit_to_user();
exit_to_user_mode_prepare(regs);
+}
+
+void syscall_exit_to_user_mode_work(struct pt_regs *regs)
+{
+ __syscall_exit_to_user_mode_work(regs);
+}
+
+__visible noinstr void syscall_exit_to_user_mode(struct pt_regs *regs)
+{
+ instrumentation_begin();
+ __syscall_exit_to_user_mode_work(regs);
instrumentation_end();
__exit_to_user_mode();
}