From patchwork Mon Mar 26 16:40:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kautuk Consul X-Patchwork-Id: 148779 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 9CA6DB6EE8 for ; Tue, 27 Mar 2012 03:41:24 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932758Ab2CZQlG (ORCPT ); Mon, 26 Mar 2012 12:41:06 -0400 Received: from mail-gy0-f174.google.com ([209.85.160.174]:34831 "EHLO mail-gy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932738Ab2CZQlF (ORCPT ); Mon, 26 Mar 2012 12:41:05 -0400 Received: by ghrr11 with SMTP id r11so3980052ghr.19 for ; Mon, 26 Mar 2012 09:41:05 -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=0r3heVFeLiaXybRKGtZ2VFRtQK6A9VT1b9+ewjmYJr4=; b=CyjSX39Naso5Gc4uDinopOYVBd6qc0OA9XLX4SQyBsh1PdRXsq4SVtyXP6YwfffLVX jFx+fwbbrTQz2hBqoJUp5Swbm2Gyl2XvmY/NE5HJnkrNj8uapFCa+UbyeaOoaFPQr8+Q wa+0rS+BDfu59QKPtFeUtNM3lVj1CIGQGG2SJUN+vjrDVL5uuKquPBB84a+km7FQ73mu dGGF2NovE6BPfICB/Z+xdHBjKVYEZqa+/w6hGeqi8iSNpG4Dn22fF5yn4l9SGy5MfcA1 dQzUQ6llipGLtkwYLt63GngTDALb+wyO4pPJLl/XlHCjiMwke9FzNXHGOWoHpbu3tYF/ GkXg== Received: by 10.68.230.70 with SMTP id sw6mr15961756pbc.101.1332780064923; Mon, 26 Mar 2012 09:41:04 -0700 (PDT) Received: from localhost.localdomain ([122.176.135.239]) by mx.google.com with ESMTPS id jm4sm12839450pbc.73.2012.03.26.09.41.01 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 26 Mar 2012 09:41:04 -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 v4] sparc/mm/fault_64.c: Port OOM changes to do_sparc64_fault Date: Mon, 26 Mar 2012 12:40:49 -0400 Message-Id: <1332780049-2777-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 Acked-by: David S. Miller --- arch/sparc/mm/fault_64.c | 37 ++++++++++++++++++++++++++++++------- 1 files changed, 30 insertions(+), 7 deletions(-) diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 504c062..d8692e4 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); + flags |= ((fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0); + fault = handle_mm_fault(mm, vma, address, flags); + + 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,27 @@ 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);