Subject: Re: [PATCH v1 2/8] powerpc/signal64: Untangle setup_tm_sigcontexts() and user_access_begin()

From: "Christophe Leroy (CS GROUP)" <[email-masked]>
Date: Fri, 22 May 2026 14:06:14 +0200

Le 22/05/2026 à 13:12, David Laight a écrit :
> On Fri, 22 May 2026 11:56:02 +0200
> "Christophe Leroy (CS GROUP)" <[email-masked]> wrote:
> 
>> Call setup_tm_sigcontexts() before opening user access to avoid
>> having to close and open again.
>>
>> Signed-off-by: Christophe Leroy (CS GROUP) <[email-masked]>
>> ---
>>   arch/powerpc/kernel/signal_64.c | 22 +++++++++-------------
>>   1 file changed, 9 insertions(+), 13 deletions(-)
>>
>> diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
>> index 86bb5bb4c143..3849af21e1d8 100644
>> --- a/arch/powerpc/kernel/signal_64.c
>> +++ b/arch/powerpc/kernel/signal_64.c
>> @@ -873,6 +873,15 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
>>   	if (!MSR_TM_ACTIVE(msr))
>>   		prepare_setup_sigcontext(tsk);
>>   
>> +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
>> +	if (MSR_TM_ACTIVE(msr))
> 
> Can't that be done without the ugly #ifdef?
> I assume MSR_TM_ACTIVE() will be zero - so it will all get optimised away.

Yes but struct rt_sigframe field uc_transact only exists when 
CONFIG_PPC_TRANSACTIONAL_MEM is defined.

And that would also require a stub setup_tm_sigcontexts()

Chistophe

> 
> -- David
> 
>> +		err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext,
>> +					    &frame->uc_transact.uc_mcontext,
>> +					    tsk, ksig->sig, NULL,
>> +					    (unsigned long)ksig->ka.sa.sa_handler,
>> +					    msr);
>> +
>> +#endif
>>   	if (!user_write_access_begin(frame, sizeof(*frame)))
>>   		goto badframe;
>>   
>> @@ -889,19 +898,6 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
>>   		 * ucontext_t (for transactional state) with its uc_link ptr.
>>   		 */
>>   		unsafe_put_user(&frame->uc_transact, &frame->uc.uc_link, badframe_block);
>> -
>> -		user_write_access_end();
>> -
>> -		err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext,
>> -					    &frame->uc_transact.uc_mcontext,
>> -					    tsk, ksig->sig, NULL,
>> -					    (unsigned long)ksig->ka.sa.sa_handler,
>> -					    msr);
>> -
>> -		if (!user_write_access_begin(&frame->uc.uc_sigmask,
>> -					     sizeof(frame->uc.uc_sigmask)))
>> -			goto badframe;
>> -
>>   #endif
>>   	} else {
>>   		unsafe_put_user(0, &frame->uc.uc_link, badframe_block);
>