Message ID | 8b4b640746523f5efb1c9a9fd97465bac4f00cae.1623739212.git.christophe.leroy@csgroup.eu (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [1/7] powerpc/signal64: Copy siginfo before changing regs->nip | expand |
Related | show |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (419dfbc3e05d80c5f6d6856534cd0a21c22c22de) |
snowpatch_ozlabs/build-ppc64le | success | Build succeeded |
snowpatch_ozlabs/build-ppc64be | success | Build succeeded |
snowpatch_ozlabs/build-ppc64e | success | Build succeeded |
snowpatch_ozlabs/build-pmac32 | success | Build succeeded |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 48 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
> @@ -836,14 +830,19 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, > asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0])); > } > unsafe_put_sigset_t(&frame->uc.uc_sigmask, oldset, failed); > +#ifndef CONFIG_COMPAT > + unsafe_copy_siginfo_to_user(&frame->info, &ksig->info, failed); > +#endif > > /* create a stack frame for the caller of the handler */ > unsafe_put_user(regs->gpr[1], newsp, failed); > > user_access_end(); > > - if (copy_siginfo_to_user(&frame->info, &ksig->info)) > +#ifdef CONFIG_COMPAT > + if (copy_siginfo_to_user32(&frame->info, &ksig->info)) > goto badframe; > +#endif Shouldn't the compat case be handled the same way?
Le 15/06/2021 à 08:55, Christoph Hellwig a écrit : >> @@ -836,14 +830,19 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, >> asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0])); >> } >> unsafe_put_sigset_t(&frame->uc.uc_sigmask, oldset, failed); >> +#ifndef CONFIG_COMPAT >> + unsafe_copy_siginfo_to_user(&frame->info, &ksig->info, failed); >> +#endif >> >> /* create a stack frame for the caller of the handler */ >> unsafe_put_user(regs->gpr[1], newsp, failed); >> >> user_access_end(); >> >> - if (copy_siginfo_to_user(&frame->info, &ksig->info)) >> +#ifdef CONFIG_COMPAT >> + if (copy_siginfo_to_user32(&frame->info, &ksig->info)) >> goto badframe; >> +#endif > > Shouldn't the compat case be handled the same way? > It would be best, but it is not that easy to convert. So for the time being it is left aside, anyway compat is for compatibility, so performance doesn't matter so much.
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 621de6e457b3..f3276cf05c8a 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -765,12 +765,6 @@ static long restore_tm_user_regs(struct pt_regs *regs, struct mcontext __user *s } #endif -#ifdef CONFIG_PPC64 - -#define copy_siginfo_to_user copy_siginfo_to_user32 - -#endif /* CONFIG_PPC64 */ - /* * Set up a signal frame for a "real-time" signal handler * (one which gets siginfo). @@ -836,14 +830,19 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0])); } unsafe_put_sigset_t(&frame->uc.uc_sigmask, oldset, failed); +#ifndef CONFIG_COMPAT + unsafe_copy_siginfo_to_user(&frame->info, &ksig->info, failed); +#endif /* create a stack frame for the caller of the handler */ unsafe_put_user(regs->gpr[1], newsp, failed); user_access_end(); - if (copy_siginfo_to_user(&frame->info, &ksig->info)) +#ifdef CONFIG_COMPAT + if (copy_siginfo_to_user32(&frame->info, &ksig->info)) goto badframe; +#endif regs->link = tramp; diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 35c301457fbf..47cf7462e0d6 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -901,15 +901,12 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, } unsafe_copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set), badframe_block); + unsafe_copy_siginfo_to_user(&frame->info, &ksig->info, badframe_block); /* Allocate a dummy caller frame for the signal handler. */ unsafe_put_user(regs->gpr[1], newsp, badframe_block); user_write_access_end(); - /* Save the siginfo outside of the unsafe block. */ - if (copy_siginfo_to_user(&frame->info, &ksig->info)) - goto badframe; - /* Make sure signal handler doesn't get spurious FP exceptions */ tsk->thread.fp_state.fpscr = 0;
Use unsafe_copy_siginfo_to_user() in order to do the copy within the user access block. On an mpc 8321 (book3s/32) the improvment is about 5% on a process sending a signal to itself. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> --- arch/powerpc/kernel/signal_32.c | 13 ++++++------- arch/powerpc/kernel/signal_64.c | 5 +---- 2 files changed, 7 insertions(+), 11 deletions(-)