From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B92AFC433E2 for ; Tue, 8 Sep 2020 15:14:53 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4BC9023D3B for ; Tue, 8 Sep 2020 15:14:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="cSOwzp1n" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4BC9023D3B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=sZ2vztepaiAnwVg4fTOHvpPzjAt64Ngcbv9ZKWdYULQ=; b=cSOwzp1n4vZNN0PE8fA4tKTFo AeZ5x9huOfRgUfEnxNNfUTUVoc2c/eYT07SFOMh6Q2Af44d/JXtBF4Qp2ePvou10dQF6yRucOffDn Um/Qz2I9uP4TieejIOkY+URJI1oHSunFR886bIUzRN7R/WJVi+/7RlHaNuSLZAo7k0Ui5WDIMjmDY GWXvtxgFRnlT4HXnuXoE34KpLQ2yORKC4zJNJ7FSRL6mxVIvQ8LKM9yq6Iw1HqrkzVSmmiNgP7x9q S3/ApduVIA21BohZKAyO4oVvCUbe/Qll+CRtFk2/4K6u6MFXm3BzTyRhVFFiDDz41jLy3D5vbb5H/ v59YLESSw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kFfJO-0007nF-NH; Tue, 08 Sep 2020 15:13:34 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kFfJL-0007lY-IC for linux-arm-kernel@lists.infradead.org; Tue, 08 Sep 2020 15:13:32 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DCD5616A3; Tue, 8 Sep 2020 08:13:30 -0700 (PDT) Received: from arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 092AF3F73C; Tue, 8 Sep 2020 08:13:28 -0700 (PDT) Date: Tue, 8 Sep 2020 16:13:26 +0100 From: Dave Martin To: Peter Collingbourne Subject: Re: [PATCH v10 5/7] signal: deduplicate code dealing with common _sigfault fields Message-ID: <20200908151326.GV6642@arm.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200908_111331_694040_D8FEA613 X-CRM114-Status: GOOD ( 26.77 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Linux ARM , linux-parisc@vger.kernel.org, Catalin Marinas , Kevin Brodsky , Oleg Nesterov , "James E.J. Bottomley" , Kostya Serebryany , "Eric W. Biederman" , Andrey Konovalov , David Spickett , Vincenzo Frascino , Will Deacon , Evgenii Stepanov , Richard Henderson Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Aug 21, 2020 at 10:10:15PM -0700, Peter Collingbourne wrote: > We're about to add more common _sigfault fields, so deduplicate the > existing code for initializing _sigfault fields in {send,force}_sig_*, > and for copying _sigfault fields in copy_siginfo_to_external32 and > post_copy_siginfo_from_user32, to reduce the number of places that > will need to be updated by upcoming changes. > > Signed-off-by: Peter Collingbourne > --- > View this change in Gerrit: https://linux-review.googlesource.com/q/I4f56174e1b7b2bf4a3c8139e6879cbfd52750a24 > > include/linux/signal.h | 13 ++++++ > kernel/signal.c | 101 ++++++++++++++++------------------------- > 2 files changed, 53 insertions(+), 61 deletions(-) > > diff --git a/include/linux/signal.h b/include/linux/signal.h > index 6bb1a3f0258c..3edbf54493ee 100644 > --- a/include/linux/signal.h > +++ b/include/linux/signal.h > @@ -50,6 +50,19 @@ enum siginfo_layout { > > enum siginfo_layout siginfo_layout(unsigned sig, int si_code); > > +static inline bool siginfo_layout_is_fault(enum siginfo_layout layout) > +{ > + switch (layout) { > + case SIL_FAULT: > + case SIL_FAULT_MCEERR: > + case SIL_FAULT_BNDERR: > + case SIL_FAULT_PKUERR: > + return true; > + default: > + return false; > + } > +} > + > /* > * Define some primitives to manipulate sigset_t. > */ > diff --git a/kernel/signal.c b/kernel/signal.c > index c80e70bde11d..4ee9dc03f20f 100644 > --- a/kernel/signal.c > +++ b/kernel/signal.c > @@ -1649,6 +1649,15 @@ void force_sigsegv(int sig) > force_sig(SIGSEGV); > } > > +static void set_sigfault_common_fields(struct kernel_siginfo *info, int sig, > + int code, void __user *addr) > +{ > + info->si_signo = sig; > + info->si_errno = 0; > + info->si_code = code; > + info->si_addr = addr; > +} > + > int force_sig_fault_to_task(int sig, int code, void __user *addr > ___ARCH_SI_TRAPNO(int trapno) > ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) > @@ -1657,10 +1666,7 @@ int force_sig_fault_to_task(int sig, int code, void __user *addr > struct kernel_siginfo info; > > clear_siginfo(&info); > - info.si_signo = sig; > - info.si_errno = 0; > - info.si_code = code; > - info.si_addr = addr; > + set_sigfault_common_fields(&info, sig, code, addr); > #ifdef __ARCH_SI_TRAPNO > info.si_trapno = trapno; > #endif > @@ -1689,10 +1695,7 @@ int send_sig_fault(int sig, int code, void __user *addr > struct kernel_siginfo info; > > clear_siginfo(&info); > - info.si_signo = sig; > - info.si_errno = 0; > - info.si_code = code; > - info.si_addr = addr; > + set_sigfault_common_fields(&info, sig, code, addr); > #ifdef __ARCH_SI_TRAPNO > info.si_trapno = trapno; > #endif > @@ -1710,10 +1713,7 @@ int force_sig_mceerr(int code, void __user *addr, short lsb) > > WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); > clear_siginfo(&info); > - info.si_signo = SIGBUS; > - info.si_errno = 0; > - info.si_code = code; > - info.si_addr = addr; > + set_sigfault_common_fields(&info, SIGBUS, code, addr); > info.si_addr_lsb = lsb; > return force_sig_info(&info); > } > @@ -1724,10 +1724,7 @@ int send_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct * > > WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); > clear_siginfo(&info); > - info.si_signo = SIGBUS; > - info.si_errno = 0; > - info.si_code = code; > - info.si_addr = addr; > + set_sigfault_common_fields(&info, SIGBUS, code, addr); > info.si_addr_lsb = lsb; > return send_sig_info(info.si_signo, &info, t); > } > @@ -1738,10 +1735,7 @@ int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) > struct kernel_siginfo info; > > clear_siginfo(&info); > - info.si_signo = SIGSEGV; > - info.si_errno = 0; > - info.si_code = SEGV_BNDERR; > - info.si_addr = addr; > + set_sigfault_common_fields(&info, SIGSEGV, SEGV_BNDERR, addr); > info.si_lower = lower; > info.si_upper = upper; > return force_sig_info(&info); > @@ -1753,10 +1747,7 @@ int force_sig_pkuerr(void __user *addr, u32 pkey) > struct kernel_siginfo info; > > clear_siginfo(&info); > - info.si_signo = SIGSEGV; > - info.si_errno = 0; > - info.si_code = SEGV_PKUERR; > - info.si_addr = addr; > + set_sigfault_common_fields(&info, SIGSEGV, SEGV_PKUERR, addr); > info.si_pkey = pkey; > return force_sig_info(&info); > } > @@ -1770,10 +1761,8 @@ int force_sig_ptrace_errno_trap(int errno, void __user *addr) > struct kernel_siginfo info; > > clear_siginfo(&info); > - info.si_signo = SIGTRAP; > + set_sigfault_common_fields(&info, SIGTRAP, TRAP_HWBKPT, addr); > info.si_errno = errno; > - info.si_code = TRAP_HWBKPT; > - info.si_addr = addr; > return force_sig_info(&info); > } > > @@ -3266,12 +3255,23 @@ int copy_siginfo_from_user(kernel_siginfo_t *to, const siginfo_t __user *from) > void copy_siginfo_to_external32(struct compat_siginfo *to, > const struct kernel_siginfo *from) > { > + enum siginfo_layout layout = > + siginfo_layout(from->si_signo, from->si_code); > + > memset(to, 0, sizeof(*to)); > > to->si_signo = from->si_signo; > to->si_errno = from->si_errno; > to->si_code = from->si_code; > - switch(siginfo_layout(from->si_signo, from->si_code)) { > + > + if (siginfo_layout_is_fault(layout)) { > + to->si_addr = ptr_to_compat(from->si_addr); > +#ifdef __ARCH_SI_TRAPNO > + to->si_trapno = from->si_trapno; > +#endif > + } > + > + switch (layout) { I find the code flow slightly awkward with this change, because the fault signal fields are populated partly in the if() above and partly in the switch(). Previously, only the universal stuff was done outside. Would this be easier on future maintainers if we pulled the common stuff out into a helper and then called it from the appropriate switch cases? The compiler will probably output some duplicated code in that case (depending on how clever it is at undoing the duplication), but the amount of affected code is small. > case SIL_KILL: > to->si_pid = from->si_pid; > to->si_uid = from->si_uid; > @@ -3286,31 +3286,15 @@ void copy_siginfo_to_external32(struct compat_siginfo *to, > to->si_fd = from->si_fd; > break; > case SIL_FAULT: > - to->si_addr = ptr_to_compat(from->si_addr); > -#ifdef __ARCH_SI_TRAPNO > - to->si_trapno = from->si_trapno; > -#endif > break; > case SIL_FAULT_MCEERR: > - to->si_addr = ptr_to_compat(from->si_addr); > -#ifdef __ARCH_SI_TRAPNO > - to->si_trapno = from->si_trapno; > -#endif > to->si_addr_lsb = from->si_addr_lsb; > break; > case SIL_FAULT_BNDERR: > - to->si_addr = ptr_to_compat(from->si_addr); > -#ifdef __ARCH_SI_TRAPNO > - to->si_trapno = from->si_trapno; > -#endif > to->si_lower = ptr_to_compat(from->si_lower); > to->si_upper = ptr_to_compat(from->si_upper); > break; > case SIL_FAULT_PKUERR: > - to->si_addr = ptr_to_compat(from->si_addr); > -#ifdef __ARCH_SI_TRAPNO > - to->si_trapno = from->si_trapno; > -#endif > to->si_pkey = from->si_pkey; > break; > case SIL_CHLD: > @@ -3347,11 +3331,22 @@ int __copy_siginfo_to_user32(struct compat_siginfo __user *to, > static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, > const struct compat_siginfo *from) > { > + enum siginfo_layout layout = > + siginfo_layout(from->si_signo, from->si_code); > + > clear_siginfo(to); > to->si_signo = from->si_signo; > to->si_errno = from->si_errno; > to->si_code = from->si_code; > - switch(siginfo_layout(from->si_signo, from->si_code)) { > + > + if (siginfo_layout_is_fault(layout)) { > + to->si_addr = compat_ptr(from->si_addr); > +#ifdef __ARCH_SI_TRAPNO > + to->si_trapno = from->si_trapno; > +#endif > + } > + > + switch (layout) { Same comment as for copy_siginfo_to_external32()? [...] Otherwise, looks reasonable. Cheers ---Dave _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel