Skip to content

Commit

Permalink
powerpc/signal64: Rewrite rt_sigreturn() to minimise uaccess switches
Browse files Browse the repository at this point in the history
Add uaccess blocks and use the 'unsafe' versions of functions doing user
access where possible to reduce the number of times uaccess has to be
opened/closed.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Co-developed-by: Christopher M. Riedl <cmr@codefail.de>
Signed-off-by: Christopher M. Riedl <cmr@codefail.de>
  • Loading branch information
daxtens authored and intel-lab-lkp committed Feb 3, 2021
1 parent d94faec commit cf2cc6f
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions arch/powerpc/kernel/signal_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -782,9 +782,13 @@ SYSCALL_DEFINE0(rt_sigreturn)
* restore_tm_sigcontexts.
*/
regs->msr &= ~MSR_TS_MASK;
#endif

if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
if (!user_read_access_begin(uc, sizeof(*uc)))
goto badframe;

#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
unsafe_get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR], badframe_block);
#endif

if (MSR_TM_ACTIVE(msr)) {
Expand All @@ -794,10 +798,12 @@ SYSCALL_DEFINE0(rt_sigreturn)

/* Trying to start TM on non TM system */
if (!cpu_has_feature(CPU_FTR_TM))
goto badframe;
goto badframe_block;

unsafe_get_user(uc_transact, &uc->uc_link, badframe_block);

user_read_access_end();

if (__get_user(uc_transact, &uc->uc_link))
goto badframe;
if (restore_tm_sigcontexts(current, &uc->uc_mcontext,
&uc_transact->uc_mcontext))
goto badframe;
Expand All @@ -816,12 +822,9 @@ SYSCALL_DEFINE0(rt_sigreturn)
* causing a TM bad thing.
*/
current->thread.regs->msr &= ~MSR_TS_MASK;
if (!user_read_access_begin(uc, sizeof(*uc)))
return -EFAULT;
if (__unsafe_restore_sigcontext(current, NULL, 1, &uc->uc_mcontext)) {
user_read_access_end();
goto badframe;
}
unsafe_restore_sigcontext(current, NULL, 1, &uc->uc_mcontext,
badframe_block);

user_read_access_end();
}

Expand All @@ -831,6 +834,8 @@ SYSCALL_DEFINE0(rt_sigreturn)
set_thread_flag(TIF_RESTOREALL);
return 0;

badframe_block:
user_read_access_end();
badframe:
signal_fault(current, regs, "rt_sigreturn", uc);

Expand Down

0 comments on commit cf2cc6f

Please sign in to comment.