From patchwork Tue Mar 20 13:28:24 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kautuk Consul X-Patchwork-Id: 147790 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 38564B6EEA for ; Wed, 21 Mar 2012 00:28:46 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759732Ab2CTN2l (ORCPT ); Tue, 20 Mar 2012 09:28:41 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:62490 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759660Ab2CTN2k (ORCPT ); Tue, 20 Mar 2012 09:28:40 -0400 Received: by pbcun15 with SMTP id un15so94256pbc.19 for ; Tue, 20 Mar 2012 06:28:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=qDRwYO4owGK04hlg6EHuRQdY1+jW0upMom/LiOZBgGo=; b=U1NJhcAOQTUT2bkwH43IbcU/MPj+MnW+w6WBWRYBZkNFx0JMLKXSJHbhSZdkIK0KMf UoD6cxpDoj7qAxZXPZLm04KfiD+8cB4n8HgnCT/b+8rRlAg9bBXRNwMy9k+UL93D/w4h AW2D7tsf9zoLCqTIhN1TXq/kS8sPYVbsLtNPpPh4EOhbRyqp8IloanDOuAFRNmNGF+9+ bbwBNqq39Pk/tz/S/7es8iTITAbVESs1acwGf8s+6vhVH5jy+7uJLQhqTAz9WOHsUdca ol/DpnE8eG3NoaXCZbRby2fh5FoP0S/Fldesd2XBfPjXbPxcuB/xi+N/ItWvIIR6j3yY PgdA== Received: by 10.68.228.67 with SMTP id sg3mr1406832pbc.17.1332250119856; Tue, 20 Mar 2012 06:28:39 -0700 (PDT) Received: from localhost.localdomain ([122.176.229.161]) by mx.google.com with ESMTPS id b10sm1314209pbr.46.2012.03.20.06.28.35 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 20 Mar 2012 06:28:38 -0700 (PDT) From: Kautuk Consul To: davem@davemloft.net, Paul Gortmaker , Ingo Molnar , Joe Perches , Peter Zijlstra Cc: sparclinux@vger.kernel.org, linux-kernel@vger.kernel.org, Kautuk Consul Subject: [PATCH 20/20] sparc/mm/fault_64.c: Port OOM changes to do_sparc64_fault Date: Tue, 20 Mar 2012 09:28:24 -0400 Message-Id: <1332250104-3352-1-git-send-email-consul.kautuk@gmail.com> X-Mailer: git-send-email 1.7.5.4 Sender: sparclinux-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: sparclinux@vger.kernel.org Commit d065bd810b6deb67d4897a14bfe21f8eb526ba99 (mm: retry page fault when blocking on disk transfer) and commit 37b23e0525d393d48a7d59f870b3bc061a30ccdb (x86,mm: make pagefault killable) The above commits introduced changes into the x86 pagefault handler for making the page fault handler retryable as well as killable. These changes reduce the mmap_sem hold time, which is crucial during OOM killer invocation. Port these changes to 64-bit sparc. Signed-off-by: Kautuk Consul --- arch/sparc/mm/fault_64.c | 38 +++++++++++++++++++++++++++++++------- 1 files changed, 31 insertions(+), 7 deletions(-) diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 504c062..899585b 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c @@ -279,6 +279,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) unsigned int insn = 0; int si_code, fault_code, fault; unsigned long address, mm_rss; + unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; fault_code = get_thread_fault_code(); @@ -333,6 +334,8 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) insn = get_fault_insn(regs, insn); goto handle_kernel_fault; } + +retry: down_read(&mm->mmap_sem); } @@ -423,7 +426,12 @@ good_area: goto bad_area; } - fault = handle_mm_fault(mm, vma, address, (fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0); + fault = handle_mm_fault(mm, vma, address, + flags | ((fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0); + + if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) + return; + if (unlikely(fault & VM_FAULT_ERROR)) { if (fault & VM_FAULT_OOM) goto out_of_memory; @@ -431,12 +439,28 @@ good_area: goto do_sigbus; BUG(); } - if (fault & VM_FAULT_MAJOR) { - current->maj_flt++; - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address); - } else { - current->min_flt++; - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address); + + if (flags & FAULT_FLAG_ALLOW_RETRY) { + if (fault & VM_FAULT_MAJOR) { + current->maj_flt++; + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, + 1, regs, address); + } else { + current->min_flt++; + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, + 1, regs, address); + } + if (fault & VM_FAULT_RETRY) { + flags &= ~FAULT_FLAG_ALLOW_RETRY; + + /* + * No need to up_read(&mm->mmap_sem) as we would + * have already released it in __lock_page_or_retry + * in mm/filemap.c. + */ + + goto retry; + } } up_read(&mm->mmap_sem);