Hi Chris, > Rework the messy ifdef breaking up the if-else for TM similar to > commit f1cf4f93de2f ("powerpc/signal32: Remove ifdefery in middle of > if/else").
I'm not sure what 'the messy ifdef' and 'the if-else for TM' is (yet): perhaps you could start the commit message with a tiny bit of background. > Unlike that commit for ppc32, the ifdef can't be removed entirely since > uc_transact in sigframe depends on CONFIG_PPC_TRANSACTIONAL_MEM. > > Signed-off-by: Christopher M. Riedl <c...@codefail.de> > --- > arch/powerpc/kernel/signal_64.c | 16 +++++++--------- > 1 file changed, 7 insertions(+), 9 deletions(-) > > diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c > index b211a8ea4f6e..8e1d804ce552 100644 > --- a/arch/powerpc/kernel/signal_64.c > +++ b/arch/powerpc/kernel/signal_64.c > @@ -710,9 +710,7 @@ SYSCALL_DEFINE0(rt_sigreturn) > struct pt_regs *regs = current_pt_regs(); > struct ucontext __user *uc = (struct ucontext __user *)regs->gpr[1]; > sigset_t set; > -#ifdef CONFIG_PPC_TRANSACTIONAL_MEM > unsigned long msr; > -#endif > > /* Always make any pending restarted system calls return -EINTR */ > current->restart_block.fn = do_no_restart_syscall; > @@ -765,7 +763,10 @@ SYSCALL_DEFINE0(rt_sigreturn) > > if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR])) > goto badframe; > +#endif > + > if (MSR_TM_ACTIVE(msr)) { > +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM > /* We recheckpoint on return. */ > struct ucontext __user *uc_transact; > > @@ -778,9 +779,8 @@ SYSCALL_DEFINE0(rt_sigreturn) > if (restore_tm_sigcontexts(current, &uc->uc_mcontext, > &uc_transact->uc_mcontext)) > goto badframe; > - } else > #endif > - { > + } else { > /* > * Fall through, for non-TM restore > * I think you can get rid of all the ifdefs in _this function_ by providing a couple of stubs: diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index a66f435dabbf..19059a4b798f 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -1120,6 +1120,7 @@ void restore_tm_state(struct pt_regs *regs) #else #define tm_recheckpoint_new_task(new) #define __switch_to_tm(prev, new) +void tm_reclaim_current(uint8_t cause) {} #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ static inline void save_sprs(struct thread_struct *t) diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 8e1d804ce552..ed58ca019ad9 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -594,6 +594,13 @@ static long restore_tm_sigcontexts(struct task_struct *tsk, return err; } +#else +static long restore_tm_sigcontexts(struct task_struct *tsk, + struct sigcontext __user *sc, + struct sigcontext __user *tm_sc) +{ + return -EINVAL; +} #endif /* @@ -722,7 +729,6 @@ SYSCALL_DEFINE0(rt_sigreturn) goto badframe; set_current_blocked(&set); -#ifdef CONFIG_PPC_TRANSACTIONAL_MEM /* * If there is a transactional state then throw it away. * The purpose of a sigreturn is to destroy all traces of the @@ -763,10 +769,8 @@ SYSCALL_DEFINE0(rt_sigreturn) if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR])) goto badframe; -#endif if (MSR_TM_ACTIVE(msr)) { -#ifdef CONFIG_PPC_TRANSACTIONAL_MEM /* We recheckpoint on return. */ struct ucontext __user *uc_transact; @@ -779,7 +783,6 @@ SYSCALL_DEFINE0(rt_sigreturn) if (restore_tm_sigcontexts(current, &uc->uc_mcontext, &uc_transact->uc_mcontext)) goto badframe; -#endif } else { /* * Fall through, for non-TM restore My only concern here was whether it was valid to access if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR])) if CONFIG_PPC_TRANSACTIONAL_MEM was not defined, but I didn't think of any obvious reason why it wouldn't be... > @@ -818,10 +818,8 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t > *set, > unsigned long newsp = 0; > long err = 0; > struct pt_regs *regs = tsk->thread.regs; > -#ifdef CONFIG_PPC_TRANSACTIONAL_MEM > /* Save the thread's msr before get_tm_stackpointer() changes it */ > unsigned long msr = regs->msr; > -#endif I wondered if that comment still makes sense in the absence of the ifdef. It is preserved in commit f1cf4f93de2f ("powerpc/signal32: Remove ifdefery in middle of if/else"), and I can't figure out how you would improve it, so I guess it's probably good as it is. > frame = get_sigframe(ksig, tsk, sizeof(*frame), 0); > if (!access_ok(frame, sizeof(*frame))) > @@ -836,8 +834,9 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t > *set, > /* Create the ucontext. */ > err |= __put_user(0, &frame->uc.uc_flags); > err |= __save_altstack(&frame->uc.uc_stack, regs->gpr[1]); > -#ifdef CONFIG_PPC_TRANSACTIONAL_MEM > + > if (MSR_TM_ACTIVE(msr)) { > +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM > /* The ucontext_t passed to userland points to the second > * ucontext_t (for transactional state) with its uc_link ptr. > */ > @@ -847,9 +846,8 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t > *set, > tsk, ksig->sig, NULL, > (unsigned > long)ksig->ka.sa.sa_handler, > msr); > - } else > #endif > - { > + } else { > err |= __put_user(0, &frame->uc.uc_link); > prepare_setup_sigcontext(tsk, 1); > err |= setup_sigcontext(&frame->uc.uc_mcontext, tsk, ksig->sig, That seems reasonable to me. Kind regards, Daniel