Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp2929811ybx; Fri, 8 Nov 2019 11:24:42 -0800 (PST) X-Google-Smtp-Source: APXvYqy6SMy2lS7dxsO3ZXaR5n9/PyVLLkWLv8MHVOGGbKJS6ai3PsPGHCqIJo+8qa2jNmV8n7bX X-Received: by 2002:a50:cc42:: with SMTP id n2mr12160937edi.289.1573241082645; Fri, 08 Nov 2019 11:24:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573241082; cv=none; d=google.com; s=arc-20160816; b=dqzXGrTqsJKrXk2Adc2J3LhFFwuYN0FuM4tHD6UkfN2789XlUg6FFYw6mgF5t9rAmc +R25ndQ3kQCgZ85CLSh8MJppa7JtpnU3IgC7WMcJSefDmvv9pqQkZSwlHE04Hadw3Cr4 TcIe8XBguZoQtn7RThPzHTqfLj8v+qbuIsBYrP3VokADLk2GSj/wr5a0+qTHG/v90bRf yxo5uSwtkYIqbfxh67Pmpxp0wWj+WQKeV1St5SwoRSRly0pqVLUULup+J6VQEpCluxAZ 2YN2IqzoSy2IjfAqefcZzo+LZjDXRakLljxtIs8K6Yva/c3ilSdMaNHtoGCXml3Bd+VG gLrQ== 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:message-id:date:subject:cc:to :from:dkim-signature; bh=lxYNlhmcaAAV9ll7J6y8BMx1gF3nxD01LMPyDH0Q4UM=; b=WgMDFWb/zrpENhhJ7xkEBO9ASHd6LOgpKDvKjqAsRJ7uOvTAaWKwwlGWCAXVC1YMWc 6vKnqr055+rAGSQxFj2nVBMwCH1ipNcNpaRZnjWXpH0XlRadeAgWI6AxnUaM2yro3Yob aSnxKbrqVZilvGcDZkyhNO5QseltBHI00HIInfFVp80Fr44DEvKeqf9SxlOTbEKNTnSK WGXRtS4K3vd8wvFxELRJxAjSmgmCFJlv++eE/D1yTHjCZyLnEGY6MxIeUwUY3BAl/uOC OyXpnXiQK0Ip+A03QzaTve43RYuMwXqj8387jKwT8UUOobEoNAmmBUWethAeNpplh7f0 HgAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="Ae/QLM+9"; 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 o27si1784954ejg.238.2019.11.08.11.24.19; Fri, 08 Nov 2019 11:24:42 -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=@kernel.org header.s=default header.b="Ae/QLM+9"; 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 S1732532AbfKHSxk (ORCPT + 99 others); Fri, 8 Nov 2019 13:53:40 -0500 Received: from mail.kernel.org ([198.145.29.99]:50382 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732497AbfKHSxj (ORCPT ); Fri, 8 Nov 2019 13:53:39 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 88987218AE; Fri, 8 Nov 2019 18:53:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1573239217; bh=0bQe948ftx6P4hbTLJm624vlLfbcA0R1ysh4srYT92c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ae/QLM+9d39Tx6I3uDaoBuI97gUHNmcGp2P9n78jU0YMqb41nU62MFk+m80uOi8Nh 7733JVnZ00bTyGCg3EEdmfI0fQmfsJp+D0vhjbMpP9oMqRKs9056Y2zjUZ/x6hjRAa 31UM23pvgRFgoOg9gfQmTb1gcwLN6on0dhT0bURA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jing Xiangfeng , Russell King , Sasha Levin Subject: [PATCH 4.4 06/75] ARM: mm: fix alignment handler faults under memory pressure Date: Fri, 8 Nov 2019 19:49:23 +0100 Message-Id: <20191108174713.215864380@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191108174708.135680837@linuxfoundation.org> References: <20191108174708.135680837@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Russell King [ Upstream commit 67e15fa5b487adb9b78a92789eeff2d6ec8f5cee ] When the system has high memory pressure, the page containing the instruction may be paged out. Using probe_kernel_address() means that if the page is swapped out, the resulting page fault will not be handled because page faults are disabled by this function. Use get_user() to read the instruction instead. Reported-by: Jing Xiangfeng Fixes: b255188f90e2 ("ARM: fix scheduling while atomic warning in alignment handling code") Signed-off-by: Russell King Signed-off-by: Sasha Levin --- arch/arm/mm/alignment.c | 44 +++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 7d5f4c736a16b..cd18eda014c24 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -767,6 +767,36 @@ do_alignment_t32_to_handler(unsigned long *pinstr, struct pt_regs *regs, return NULL; } +static int alignment_get_arm(struct pt_regs *regs, u32 *ip, unsigned long *inst) +{ + u32 instr = 0; + int fault; + + if (user_mode(regs)) + fault = get_user(instr, ip); + else + fault = probe_kernel_address(ip, instr); + + *inst = __mem_to_opcode_arm(instr); + + return fault; +} + +static int alignment_get_thumb(struct pt_regs *regs, u16 *ip, u16 *inst) +{ + u16 instr = 0; + int fault; + + if (user_mode(regs)) + fault = get_user(instr, ip); + else + fault = probe_kernel_address(ip, instr); + + *inst = __mem_to_opcode_thumb16(instr); + + return fault; +} + static int do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) { @@ -774,10 +804,10 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) unsigned long instr = 0, instrptr; int (*handler)(unsigned long addr, unsigned long instr, struct pt_regs *regs); unsigned int type; - unsigned int fault; u16 tinstr = 0; int isize = 4; int thumb2_32b = 0; + int fault; if (interrupts_enabled(regs)) local_irq_enable(); @@ -786,15 +816,14 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) if (thumb_mode(regs)) { u16 *ptr = (u16 *)(instrptr & ~1); - fault = probe_kernel_address(ptr, tinstr); - tinstr = __mem_to_opcode_thumb16(tinstr); + + fault = alignment_get_thumb(regs, ptr, &tinstr); if (!fault) { if (cpu_architecture() >= CPU_ARCH_ARMv7 && IS_T32(tinstr)) { /* Thumb-2 32-bit */ - u16 tinst2 = 0; - fault = probe_kernel_address(ptr + 1, tinst2); - tinst2 = __mem_to_opcode_thumb16(tinst2); + u16 tinst2; + fault = alignment_get_thumb(regs, ptr + 1, &tinst2); instr = __opcode_thumb32_compose(tinstr, tinst2); thumb2_32b = 1; } else { @@ -803,8 +832,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) } } } else { - fault = probe_kernel_address((void *)instrptr, instr); - instr = __mem_to_opcode_arm(instr); + fault = alignment_get_arm(regs, (void *)instrptr, &instr); } if (fault) { -- 2.20.1