From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 20A693B3890 for ; Fri, 22 May 2026 12:44:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779453904; cv=none; b=cX6kKGCJC0mHMhE/m37LeYdZdP1Q/VAWBhCzW387+0X/XxuPp3HAk+PrX9yLcim7hgiiaMMzXaiOI1XuiSnvcAi7qYvET6wsxkYR+oH/0AlzFpbw90qWzdsa2vDt94gh+2rdBNk5ktKt/l7Vwp2vxKTEtwWGUv5hAqoq8UzpdWQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779453904; c=relaxed/simple; bh=TEYknp5dpW7P1ifbJ8+73t7SNZEasqyw4Ejx4IjpTNU=; h=Message-ID:Date:MIME-Version:Subject:From:To:Cc:References: In-Reply-To:Content-Type; b=CMXTTy3dDHBkH0UP7Z0G1MQ52+J6lRf2pmW3kdVyNUthN/tVt/sCEHIpYWlu13ZVJP+0i1X7aZtI+jWv2qPMFTG6CcTiaThvvrcpSAuy/NZdzUbL05LHmENB9o/NwJZUpQJwGqncQS88Ur5qmQ66E3vy/4V2qIK2jEe0GXrFgBo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lRldLOCn; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lRldLOCn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9B1991F000E9; Fri, 22 May 2026 12:44:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1779453899; bh=kc80LGaAlPljAg7ILWOq2bbeI+elbTjRGpAnUDTXRts=; h=Date:Subject:From:To:Cc:References:In-Reply-To; b=lRldLOCn4Yiy3236MudQVu/AwN8Wqlzq1ZYWUa4taX0yZtdXIj5OnjwbBldGuMG4f CGgXzeuT437aQEF6weLjAO3Wf0rg8tPOG4MjN1IY/F64Rx27helR2UjTklyLi05v6M rbVFHKAWQGm3Ufbs7LjNmGKN2g2erF//eWiuxA0fquukjWkHAIlnXfdR+unv0iJSo/ pv0JQNnzYUXYma+/A6Q7zt9JENM/7Jxd8rkf00M+CdVnI4xW86ky+rNXzHRi9bj86Q 3LQPuQiMxwrLVeoS08NQ2zylbQPRdZ3VumnC9wkDFzXiWtHZRQhQJ3mrfwWcIvYxQc BJmOHpLQR9kCw== Message-ID: <28a7b0b9-3c17-4f76-af80-f17f4869f854@kernel.org> Date: Fri, 22 May 2026 14:44:55 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v1 2/8] powerpc/signal64: Untangle setup_tm_sigcontexts() and user_access_begin() From: "Christophe Leroy (CS GROUP)" To: David Laight Cc: Michael Ellerman , Nicholas Piggin , Madhavan Srinivasan , linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org References: <7c83fe5a596514a02fde37da987a48d638d0d097.1779441786.git.chleroy@kernel.org> <20260522121237.3089276f@pumpkin> <69bd69b1-97f7-41e2-934b-bed28dc2fef7@kernel.org> Content-Language: fr-FR In-Reply-To: <69bd69b1-97f7-41e2-934b-bed28dc2fef7@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Le 22/05/2026 à 14:06, Christophe Leroy (CS GROUP) a écrit : > > > Le 22/05/2026 à 13:12, David Laight a écrit : >> On Fri, 22 May 2026 11:56:02 +0200 >> "Christophe Leroy (CS GROUP)" wrote: >> >>> Call setup_tm_sigcontexts() before opening user access to avoid >>> having to close and open again. >>> >>> Signed-off-by: Christophe Leroy (CS GROUP) >>> --- >>>   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() After thinking once more, I think we can do the following, is it better for you ? diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 86bb5bb4c143..c70732e8002d 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -203,8 +203,7 @@ static long notrace __unsafe_setup_sigcontext(struct sigcontext __user *sc, * examine the transactional registers in the 2nd sigcontext to determine the * real origin of the signal. */ -static long setup_tm_sigcontexts(struct sigcontext __user *sc, - struct sigcontext __user *tm_sc, +static long setup_tm_sigcontexts(struct rt_sigframe __user *frame, struct task_struct *tsk, int signr, sigset_t *set, unsigned long handler, unsigned long msr) @@ -217,6 +216,8 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc, * Userland shall check AT_HWCAP to know wether it can rely on the * v_regs pointer or not. */ + struct sigcontext __user *sc = &frame->uc.uc_mcontext; + struct sigcontext __user *tm_sc = &frame->uc_transact.uc_mcontext; #ifdef CONFIG_ALTIVEC elf_vrreg_t __user *v_regs = sigcontext_vmx_regs(sc); elf_vrreg_t __user *tm_v_regs = sigcontext_vmx_regs(tm_sc); @@ -325,6 +326,14 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc, return err; } +#else +static long setup_tm_sigcontexts(struct rt_sigframe __user *frame, + struct task_struct *tsk, + int signr, sigset_t *set, unsigned long handler, + unsigned long msr) +{ + return -EINVAL; +} #endif /* @@ -872,6 +881,9 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, */ if (!MSR_TM_ACTIVE(msr)) prepare_setup_sigcontext(tsk); + else + err |= setup_tm_sigcontexts(frame, tsk, ksig->sig, NULL, + (unsigned long)ksig->ka.sa.sa_handler, msr); if (!user_write_access_begin(frame, sizeof(*frame))) goto badframe; @@ -889,19 +901,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); Christophe