From: ebiederm@xmission.com (Eric W. Biederman) To: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>, Paul Mackerras <paulus@samba.org>, Michael Ellerman <mpe@ellerman.id.au>, hch@infradead.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Subject: Re: [PATCH RESEND v3 6/6] powerpc/signal: Use unsafe_copy_siginfo_to_user() Date: Mon, 13 Sep 2021 11:21:41 -0500 [thread overview] Message-ID: <87y280o38q.fsf@disp2133> (raw) In-Reply-To: <87h7eopixa.fsf@disp2133> (Eric W. Biederman's message of "Mon, 13 Sep 2021 10:57:37 -0500") ebiederm@xmission.com (Eric W. Biederman) writes: > Christophe Leroy <christophe.leroy@csgroup.eu> writes: > >> 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. If you can't make function calls from an unsafe macro there is another way to handle this that doesn't require everything to be inline. From a safety perspective it is probably even a better approach. Eric diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 0608581967f0..1b30bb78b863 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -205,6 +205,12 @@ struct sigframe { int abigap[56]; }; +#ifdef CONFIG_PPC64 +# define user_siginfo_t compat_siginfo_t +#else +# define user_siginfo_t siginfo_t +#endif + /* * When we have rt signals to deliver, we set up on the * user stack, going down from the original stack pointer: @@ -217,11 +223,7 @@ struct sigframe { * */ struct rt_sigframe { -#ifdef CONFIG_PPC64 - compat_siginfo_t info; -#else - struct siginfo info; -#endif + user_siginfo_t info; struct ucontext uc; #ifdef CONFIG_PPC_TRANSACTIONAL_MEM struct ucontext uc_transact; @@ -712,7 +714,7 @@ static long restore_tm_user_regs(struct pt_regs *regs, struct mcontext __user *s #ifdef CONFIG_PPC64 -#define copy_siginfo_to_user copy_siginfo_to_user32 +#define copy_siginfo_to_external copy_siginfo_to_external32 #endif /* CONFIG_PPC64 */ @@ -731,6 +733,7 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, struct pt_regs *regs = tsk->thread.regs; /* Save the thread's msr before get_tm_stackpointer() changes it */ unsigned long msr = regs->msr; + user_siginfo_t uinfo; /* Set up Signal Frame */ frame = get_sigframe(ksig, tsk, sizeof(*frame), 1); @@ -743,6 +746,8 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, else prepare_save_user_regs(1); + copy_siginfo_to_external(&uinfo, &ksig->info); + if (!user_access_begin(frame, sizeof(*frame))) goto badframe; @@ -778,12 +783,10 @@ 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); + unsafe_copy_to_user(&frame->info, &uinfo, failed); user_access_end(); - if (copy_siginfo_to_user(&frame->info, &ksig->info)) - goto badframe; - regs->link = tramp; #ifdef CONFIG_PPC_FPU_REGS Eric
WARNING: multiple messages have this Message-ID (diff)
From: ebiederm@xmission.com (Eric W. Biederman) To: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: linux-kernel@vger.kernel.org, hch@infradead.org, Paul Mackerras <paulus@samba.org>, linuxppc-dev@lists.ozlabs.org Subject: Re: [PATCH RESEND v3 6/6] powerpc/signal: Use unsafe_copy_siginfo_to_user() Date: Mon, 13 Sep 2021 11:21:41 -0500 [thread overview] Message-ID: <87y280o38q.fsf@disp2133> (raw) In-Reply-To: <87h7eopixa.fsf@disp2133> (Eric W. Biederman's message of "Mon, 13 Sep 2021 10:57:37 -0500") ebiederm@xmission.com (Eric W. Biederman) writes: > Christophe Leroy <christophe.leroy@csgroup.eu> writes: > >> 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. If you can't make function calls from an unsafe macro there is another way to handle this that doesn't require everything to be inline. From a safety perspective it is probably even a better approach. Eric diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 0608581967f0..1b30bb78b863 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -205,6 +205,12 @@ struct sigframe { int abigap[56]; }; +#ifdef CONFIG_PPC64 +# define user_siginfo_t compat_siginfo_t +#else +# define user_siginfo_t siginfo_t +#endif + /* * When we have rt signals to deliver, we set up on the * user stack, going down from the original stack pointer: @@ -217,11 +223,7 @@ struct sigframe { * */ struct rt_sigframe { -#ifdef CONFIG_PPC64 - compat_siginfo_t info; -#else - struct siginfo info; -#endif + user_siginfo_t info; struct ucontext uc; #ifdef CONFIG_PPC_TRANSACTIONAL_MEM struct ucontext uc_transact; @@ -712,7 +714,7 @@ static long restore_tm_user_regs(struct pt_regs *regs, struct mcontext __user *s #ifdef CONFIG_PPC64 -#define copy_siginfo_to_user copy_siginfo_to_user32 +#define copy_siginfo_to_external copy_siginfo_to_external32 #endif /* CONFIG_PPC64 */ @@ -731,6 +733,7 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, struct pt_regs *regs = tsk->thread.regs; /* Save the thread's msr before get_tm_stackpointer() changes it */ unsigned long msr = regs->msr; + user_siginfo_t uinfo; /* Set up Signal Frame */ frame = get_sigframe(ksig, tsk, sizeof(*frame), 1); @@ -743,6 +746,8 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, else prepare_save_user_regs(1); + copy_siginfo_to_external(&uinfo, &ksig->info); + if (!user_access_begin(frame, sizeof(*frame))) goto badframe; @@ -778,12 +783,10 @@ 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); + unsafe_copy_to_user(&frame->info, &uinfo, failed); user_access_end(); - if (copy_siginfo_to_user(&frame->info, &ksig->info)) - goto badframe; - regs->link = tramp; #ifdef CONFIG_PPC_FPU_REGS Eric
next prev parent reply other threads:[~2021-09-13 16:21 UTC|newest] Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-09-13 15:19 [PATCH RESEND v3 1/6] powerpc/signal64: Access function descriptor with user access block Christophe Leroy 2021-09-13 15:19 ` Christophe Leroy 2021-09-13 15:19 ` [PATCH RESEND v3 2/6] powerpc/signal: Include the new stack frame inside the " Christophe Leroy 2021-09-13 15:19 ` Christophe Leroy 2021-09-13 15:19 ` [PATCH RESEND v3 3/6] signal: Add unsafe_copy_siginfo_to_user() Christophe Leroy 2021-09-13 15:19 ` Christophe Leroy 2021-09-13 15:19 ` [PATCH RESEND v3 4/6] signal: Add unsafe_copy_siginfo_to_user32() Christophe Leroy 2021-09-13 15:19 ` Christophe Leroy 2021-09-13 15:54 ` Eric W. Biederman 2021-09-13 15:54 ` Eric W. Biederman 2021-09-13 17:01 ` Christophe Leroy 2021-09-13 17:01 ` Christophe Leroy 2021-09-13 15:19 ` [PATCH RESEND v3 5/6] powerpc/uaccess: Add unsafe_clear_user() Christophe Leroy 2021-09-13 15:19 ` Christophe Leroy 2021-09-13 15:19 ` [PATCH RESEND v3 6/6] powerpc/signal: Use unsafe_copy_siginfo_to_user() Christophe Leroy 2021-09-13 15:19 ` Christophe Leroy 2021-09-13 15:57 ` Eric W. Biederman 2021-09-13 15:57 ` Eric W. Biederman 2021-09-13 16:21 ` Eric W. Biederman [this message] 2021-09-13 16:21 ` Eric W. Biederman 2021-09-13 17:19 ` Christophe Leroy 2021-09-13 17:19 ` Christophe Leroy 2021-09-13 19:11 ` Eric W. Biederman 2021-09-13 19:11 ` Eric W. Biederman 2021-09-14 14:00 ` Christophe Leroy 2021-09-14 14:00 ` Christophe Leroy 2021-09-13 17:14 ` Christophe Leroy 2021-09-13 17:14 ` Christophe Leroy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=87y280o38q.fsf@disp2133 \ --to=ebiederm@xmission.com \ --cc=benh@kernel.crashing.org \ --cc=christophe.leroy@csgroup.eu \ --cc=hch@infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mpe@ellerman.id.au \ --cc=paulus@samba.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.