Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4543104imu; Tue, 8 Jan 2019 01:59:15 -0800 (PST) X-Google-Smtp-Source: ALg8bN5SIUCxNzQAiRIMYjkXezUmTESBh+mLuqPQG2gj2cowtjww3Bl2UlVAAAeSXnbkyudAP1ea X-Received: by 2002:a62:546:: with SMTP id 67mr1030496pff.99.1546941555060; Tue, 08 Jan 2019 01:59:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546941555; cv=none; d=google.com; s=arc-20160816; b=0ESwU9375FRmfGh1HwyitObI1bhXsPLg+2I/sNqqYYOEA+jwT2MVsEL2WyAnvET24L +bS2AP73/5W0M5CSfiw1v6uwSOFXNZ2z4lAnma8csE92v6K6TK1spWIBTz0ghMHJs5M8 VH8DXMXu8BpqJQZ9PqFDANAgHrt4DO62M53nvEO57BOMnm2wQ0JYAlMxmt7kCsjKZ322 m2RXNbwQZahSZT9/rP8pFO71UviwM7/PPUqyHMAv3rzHYeeZMSo9Cm+jAiIMoIFqz90D Wacz4V8CW4YCoA4aZDlwF+WCWPXkvGP8yIBbHYLlcgmqzXQipaJ3G+fOatvBfMil2DSz M0ew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id:dkim-signature; bh=8NgReACofGr4pfsVek1KnbG548/6VAg+JiRF3ljMJik=; b=D5P60FkIQUerv0T15pOvkgXkqw9dF7w0LUcPya3GH29AceAJNPNVqqt9jj6a/2eyV/ Mzd780Dg6cztpq5d+FUXscykay9fwIWFqgYV8LargoEjLkVxN7GbWvEi/lOfqA6t9crJ fiJd+zQs11MkEjzmrdiVph64ctoSKShOr//00zpz3+i2AYB7C2AN2waUmyHdvnSMrmza QWDFAaqzvaWHVevT+LxhdTnZvxKjflRUIeWZVAC4aIq+d5ftlAoAYN9VvKtcHBG0qPmw hdujgIy6781KMrlbVVoz7fIY787n1u59PBrgx5GfQQ9PIXB4ScVg+wfpXYzA9dq4NgBk pnpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b="mQ2L/56S"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 30si18013615pgv.191.2019.01.08.01.58.59; Tue, 08 Jan 2019 01:59:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b="mQ2L/56S"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728340AbfAHJ5h (ORCPT + 99 others); Tue, 8 Jan 2019 04:57:37 -0500 Received: from wout2-smtp.messagingengine.com ([64.147.123.25]:54607 "EHLO wout2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727001AbfAHJ5h (ORCPT ); Tue, 8 Jan 2019 04:57:37 -0500 Received: from compute6.internal (compute6.nyi.internal [10.202.2.46]) by mailout.west.internal (Postfix) with ESMTP id 2AF1B1372; Tue, 8 Jan 2019 04:57:33 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute6.internal (MEProxy); Tue, 08 Jan 2019 04:57:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; bh=8NgReACofGr4pfsVek1KnbG548/6VAg+JiRF3ljMJ ik=; b=mQ2L/56S+ov7BImttVK3klS4q7x3z3cfmxwjxB0oew76lugkXWSKxd301 jhx3z2uBMhRyc8VYpUDl8I39v1dxiQPBESWlGKwvypRH80sXLpShjyi63ZTzokHW LplagP37FIZU/ZEJ4OhaIYWmNQruEFc3w8fbouwPTSfrpLe46VX2kakNC4FKQakq iNWvA0FHQajxJ/z2MO8Nks3KEe+mwoHGpfEWx1bH+WqpbXf/WhStegRE+7/5fZzp kFk6G4tHvFV+6A9vrU0Q7mM0mEneEI1N6wlZ5FRHH1+hhnbbqCPgm2vtpRlBrLYE Aos5x9n7zVOj3rybFGBe/lfyS6ygg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedtledrvdelgddtkeculddtuddrgedtkedrtddtmd cutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfhuthen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne gfrhhlucfvnfffucdlfedtmdenucfjughrpefkuffhvfffjghftggfggfgsehtkeertddt reejnecuhfhrohhmpeftuhhsshgvlhhlucevuhhrrhgvhicuoehruhhstghurhesrhhush hsvghllhdrtggtqeenucfkphepuddrudehjedrudelgedrudelkeenucfrrghrrghmpehm rghilhhfrhhomheprhhushgtuhhrsehruhhsshgvlhhlrdgttgenucevlhhushhtvghruf hiiigvpedt X-ME-Proxy: Received: from crackle.ozlabs.ibm.com (unknown [1.157.194.198]) by mail.messagingengine.com (Postfix) with ESMTPA id BFF3D10087; Tue, 8 Jan 2019 04:57:27 -0500 (EST) Message-ID: <9c1097982d424c0c96459899e36f7f4c9345be73.camel@russell.cc> Subject: Re: [PATCH v2 2/2] powerpc: use probe_user_read() From: Russell Currey To: Christophe Leroy , Michael Ellerman Cc: Kees Cook , Andrew Morton , Benjamin Herrenschmidt , Paul Mackerras , Mike Rapoport , linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Date: Tue, 08 Jan 2019 20:58:37 +1100 In-Reply-To: <293a653c-52aa-6326-4022-73fb25590354@c-s.fr> References: <0b0db24e18063076e9d9f4e376994af83da05456.1546932949.git.christophe.leroy@c-s.fr> <293a653c-52aa-6326-4022-73fb25590354@c-s.fr> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.30.3 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 2019-01-08 at 10:37 +0100, Christophe Leroy wrote: > Hi Michael and Russell, > > Any idea why: > - checkpatch reports missing Signed-off-by: > - Snowpatch build fails on PPC64 (it seems unrelated to the patch, > something wrong in lib/genalloc.c) Upstream kernel broke for powerpc (snowpatch applies patches on top of powerpc/next), it was fixed in commit 35004f2e55807a1a1491db24ab512dd2f770a130 which I believe is in powerpc/next now. I will look at rerunning tests for all the patches that this impacted. As for the S-o-b, no clue, I'll have a look. Thanks for the report! - Russell > > Thanks > Christophe > > Le 08/01/2019 à 08:37, Christophe Leroy a écrit : > > Instead of opencoding, use probe_user_read() to failessly > > read a user location. > > > > Signed-off-by: Christophe Leroy > > --- > > v2: Using probe_user_read() instead of probe_user_address() > > > > arch/powerpc/kernel/process.c | 12 +----------- > > arch/powerpc/mm/fault.c | 6 +----- > > arch/powerpc/perf/callchain.c | 20 +++----------------- > > arch/powerpc/perf/core-book3s.c | 8 +------- > > arch/powerpc/sysdev/fsl_pci.c | 10 ++++------ > > 5 files changed, 10 insertions(+), 46 deletions(-) > > > > diff --git a/arch/powerpc/kernel/process.c > > b/arch/powerpc/kernel/process.c > > index ce393df243aa..6a4b59d574c2 100644 > > --- a/arch/powerpc/kernel/process.c > > +++ b/arch/powerpc/kernel/process.c > > @@ -1298,16 +1298,6 @@ void show_user_instructions(struct pt_regs > > *regs) > > > > pc = regs->nip - (NR_INSN_TO_PRINT * 3 / 4 * sizeof(int)); > > > > - /* > > - * Make sure the NIP points at userspace, not kernel text/data > > or > > - * elsewhere. > > - */ > > - if (!__access_ok(pc, NR_INSN_TO_PRINT * sizeof(int), USER_DS)) > > { > > - pr_info("%s[%d]: Bad NIP, not dumping instructions.\n", > > - current->comm, current->pid); > > - return; > > - } > > - > > seq_buf_init(&s, buf, sizeof(buf)); > > > > while (n) { > > @@ -1318,7 +1308,7 @@ void show_user_instructions(struct pt_regs > > *regs) > > for (i = 0; i < 8 && n; i++, n--, pc += sizeof(int)) { > > int instr; > > > > - if (probe_kernel_address((const void *)pc, > > instr)) { > > + if (probe_user_read(&instr, (void __user *)pc, > > sizeof(instr))) { > > seq_buf_printf(&s, "XXXXXXXX "); > > continue; > > } > > diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c > > index 887f11bcf330..ec74305fa330 100644 > > --- a/arch/powerpc/mm/fault.c > > +++ b/arch/powerpc/mm/fault.c > > @@ -276,12 +276,8 @@ static bool bad_stack_expansion(struct pt_regs > > *regs, unsigned long address, > > if ((flags & FAULT_FLAG_WRITE) && (flags & > > FAULT_FLAG_USER) && > > access_ok(nip, sizeof(*nip))) { > > unsigned int inst; > > - int res; > > > > - pagefault_disable(); > > - res = __get_user_inatomic(inst, nip); > > - pagefault_enable(); > > - if (!res) > > + if (!probe_user_read(&inst, nip, sizeof(inst))) > > return !store_updates_sp(inst); > > *must_retry = true; > > } > > diff --git a/arch/powerpc/perf/callchain.c > > b/arch/powerpc/perf/callchain.c > > index 0af051a1974e..0680efb2237b 100644 > > --- a/arch/powerpc/perf/callchain.c > > +++ b/arch/powerpc/perf/callchain.c > > @@ -159,12 +159,8 @@ static int read_user_stack_64(unsigned long > > __user *ptr, unsigned long *ret) > > ((unsigned long)ptr & 7)) > > return -EFAULT; > > > > - pagefault_disable(); > > - if (!__get_user_inatomic(*ret, ptr)) { > > - pagefault_enable(); > > + if (!probe_user_read(ret, ptr, sizeof(*ret))) > > return 0; > > - } > > - pagefault_enable(); > > > > return read_user_stack_slow(ptr, ret, 8); > > } > > @@ -175,12 +171,8 @@ static int read_user_stack_32(unsigned int > > __user *ptr, unsigned int *ret) > > ((unsigned long)ptr & 3)) > > return -EFAULT; > > > > - pagefault_disable(); > > - if (!__get_user_inatomic(*ret, ptr)) { > > - pagefault_enable(); > > + if (!probe_user_read(ret, ptr, sizeof(*ret))) > > return 0; > > - } > > - pagefault_enable(); > > > > return read_user_stack_slow(ptr, ret, 4); > > } > > @@ -307,17 +299,11 @@ static inline int current_is_64bit(void) > > */ > > static int read_user_stack_32(unsigned int __user *ptr, unsigned > > int *ret) > > { > > - int rc; > > - > > if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) || > > ((unsigned long)ptr & 3)) > > return -EFAULT; > > > > - pagefault_disable(); > > - rc = __get_user_inatomic(*ret, ptr); > > - pagefault_enable(); > > - > > - return rc; > > + return probe_user_read(ret, ptr, sizeof(*ret)); > > } > > > > static inline void perf_callchain_user_64(struct > > perf_callchain_entry_ctx *entry, > > diff --git a/arch/powerpc/perf/core-book3s.c > > b/arch/powerpc/perf/core-book3s.c > > index b0723002a396..4b64ddf0db68 100644 > > --- a/arch/powerpc/perf/core-book3s.c > > +++ b/arch/powerpc/perf/core-book3s.c > > @@ -416,7 +416,6 @@ static void power_pmu_sched_task(struct > > perf_event_context *ctx, bool sched_in) > > static __u64 power_pmu_bhrb_to(u64 addr) > > { > > unsigned int instr; > > - int ret; > > __u64 target; > > > > if (is_kernel_addr(addr)) { > > @@ -427,13 +426,8 @@ static __u64 power_pmu_bhrb_to(u64 addr) > > } > > > > /* Userspace: need copy instruction here then translate it */ > > - pagefault_disable(); > > - ret = __get_user_inatomic(instr, (unsigned int __user *)addr); > > - if (ret) { > > - pagefault_enable(); > > + if (probe_user_read(&instr, (unsigned int __user *)addr, > > sizeof(instr))) > > return 0; > > - } > > - pagefault_enable(); > > > > target = branch_target(&instr); > > if ((!target) || (instr & BRANCH_ABSOLUTE)) > > diff --git a/arch/powerpc/sysdev/fsl_pci.c > > b/arch/powerpc/sysdev/fsl_pci.c > > index 918be816b097..c8a1b26489f5 100644 > > --- a/arch/powerpc/sysdev/fsl_pci.c > > +++ b/arch/powerpc/sysdev/fsl_pci.c > > @@ -1068,13 +1068,11 @@ int fsl_pci_mcheck_exception(struct pt_regs > > *regs) > > addr += mfspr(SPRN_MCAR); > > > > if (is_in_pci_mem_space(addr)) { > > - if (user_mode(regs)) { > > - pagefault_disable(); > > - ret = get_user(inst, (__u32 __user *)regs- > > >nip); > > - pagefault_enable(); > > - } else { > > + if (user_mode(regs)) > > + ret = probe_user_read(&inst, (void __user > > *)regs->nip, > > + sizeof(inst)); > > + else > > ret = probe_kernel_address((void *)regs->nip, > > inst); > > - } > > > > if (!ret && mcheck_handle_load(regs, inst)) { > > regs->nip += 4; > >