Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1219379imm; Fri, 29 Jun 2018 13:42:31 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdN+S0lEBRysz3QNclWA+iBHA1JKcukk2RJClAAVdcmHCcir8NsBmtNJqNRv70s4CKxfPLm X-Received: by 2002:a17:902:8f86:: with SMTP id z6-v6mr11864641plo.38.1530304951535; Fri, 29 Jun 2018 13:42:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530304951; cv=none; d=google.com; s=arc-20160816; b=S05GrNzfq6UkWLW/3vhy5VXQ7CUFISSf7y/ZJGB5/bHXp/o/zcDCdYLIBF26SrcpRD awkFa+gcQpoqKmDvvaKxvd6QcBpGp4NgNwBDH4ImDLZT3MucPirTpGMU8TA/Jqsg88US 9FyVSbFVfXLeyuGN579HDuL3j8KCQNhd8r+qUYbzW7+dMsphFJXZ1YEtUuxeh5YR4b2r otM4+vm0BbK6EQ/Ug8jx3McWRPpEr3syE17RkpColjm0HFaBKcA+jL3Y2LlpIr3wXxO3 TxIyCBuSRvrD2C1NsQhHpt1O9FkZQ39E4b5jSO5x4GXnVWtLf/EZMI5sBdxrA6OsjKMN Q8kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=MGgTGE6L31MAHm/Da8xfzDVZF8SSJ1Eh0pxYqkZaX2M=; b=UmSE1VCrKJrljOSUwknwn5RFk6L8p0gq4CAuuifzFRFbuAEh3OpqZzDzoUwFJbYFGz xo2C6Rkp0lyq7iUBFThFOLsfqDwEF1952GdwsQxMBkFWq19rlhiLch6EH7U+UQaI0QXo 9SbsZy3ZNCkKZ+gFXJDGn7PqQdFGUoUfOv7lGVO1v6D2wo3sPO7rnzJqgZAeJhdouShA fVsNsL8ovNCpT/Ey2roTYNlgVkcTgScFuLDCzXHhVw7AXPOHxZxn7JHysOKR1Q/8jUgr /za55rEqgsVLwumd7MGIjtwaoUP/2h9E5NKJNaCkRWg7Jqnb+srEGR7B3kWSSk4Ebe3F PTbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@synopsys.com header.s=mail header.b=mZtNydWi; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t123-v6si9937184pfd.13.2018.06.29.13.42.17; Fri, 29 Jun 2018 13:42:31 -0700 (PDT) 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=@synopsys.com header.s=mail header.b=mZtNydWi; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755282AbeF2SUH (ORCPT + 99 others); Fri, 29 Jun 2018 14:20:07 -0400 Received: from us01smtprelay-2.synopsys.com ([198.182.47.9]:53337 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753986AbeF2SUG (ORCPT ); Fri, 29 Jun 2018 14:20:06 -0400 Received: from mailhost.synopsys.com (mailhost2.synopsys.com [10.13.184.66]) by smtprelay.synopsys.com (Postfix) with ESMTP id 6A3C624E09A8; Fri, 29 Jun 2018 11:20:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1530296406; bh=KCm8HG6HhE6dU3GZSW4gdapqL4xYaaELj6oQgAphV9g=; h=From:To:Cc:Subject:Date:From; b=mZtNydWinR3/3a9jfUd10oEHRyxDFOXm1CW/OMUXRREuzux0JeUmeg55vHKuHObxY egRTm6LsavPfMvgCyP2wUl6tgwt0cpT+5gtK3kKWIjM0LHn7QH7V9ASy4GRk2Wfmy9 HXdUZsIvQdoIwUOHvJcAmwEGTdU2mBZaBqWfbhQ8LZAhnkLJSCxvPRMNmtwTCqQvWJ 6+kj8VzMi5RR4unawpb+bKmZOKgmBR4lnuC1vddqQIQd9jf6DvTkRopuJJXjPG0JMB wgPxNoPMzQsMy4JgV+MCh5HHNOTu9v5IYRS4vTrPvEJGj5wfOgvlc472NYMZWZoSbn 14kvVtCgf+hnQ== Received: from abrodkin-7480l.internal.synopsys.com (abrodkin-7480l.internal.synopsys.com [10.9.128.133]) by mailhost.synopsys.com (Postfix) with ESMTP id 54B4039E5; Fri, 29 Jun 2018 11:20:06 -0700 (PDT) From: Alexey Brodkin To: linux-snps-arc@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Vineet Gupta , Alexey Brodkin Subject: [PATCH] ARC: Improve handling of fatal signals in do_page_fault() Date: Fri, 29 Jun 2018 11:20:05 -0700 Message-Id: <20180629182005.10243-1-abrodkin@synopsys.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This was triggered by investigation of a deadlock after OOM killer invocation, see [1] for more details. Looks like our handling of fatal signal in do_page_fault() has some issues: 1. We only want to do special (read "early") handling of fatal signal if handle_mm_fault() returned VM_FAULT_RETRY so that we don't loop in retry loop endlessly, otherwise we'll handle that signal normally on exit from exception handler. 2. up_read() is not needed as indeed it will be done in __lock_page_or_retry() in mm/filemap.c. With above comments in mind simplified version should be like that: ------------------------------->8--------------------------- if (fatal_signal_pending(current) if (fault & VM_FAULT_RETRY) if (user_mode(regs)) return; ------------------------------->8--------------------------- But looks like there's a room for improvement, see [2]. Instead of proceeding forward and then inevitably hitting retry path we short-cut right to kernel fix-up code in no_context. [1] http://lists.infradead.org/pipermail/linux-snps-arc/2018-February/003403.html [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=746a272e44141af24a02f6c9b0f65f4c4598ed42 Signed-off-by: Alexey Brodkin --- arch/arc/mm/fault.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index a0b7bd6d030d..17ed78e2f5eb 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c @@ -139,12 +139,16 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) */ fault = handle_mm_fault(vma, address, flags); - /* If Pagefault was interrupted by SIGKILL, exit page fault "early" */ + /* If we need to retry but a fatal signal is pending, handle the + * signal first. We do not need to release the mmap_sem because + * it would already be released in __lock_page_or_retry in + * mm/filemap.c. */ if (unlikely(fatal_signal_pending(current))) { - if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY)) - up_read(&mm->mmap_sem); - if (user_mode(regs)) + if (fault & VM_FAULT_RETRY) { + if (!user_mode(regs)) + goto no_context; return; + } } perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); -- 2.17.1