From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756475AbZDGMCv (ORCPT ); Tue, 7 Apr 2009 08:02:51 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754747AbZDGMA7 (ORCPT ); Tue, 7 Apr 2009 08:00:59 -0400 Received: from mga14.intel.com ([143.182.124.37]:23410 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755384AbZDGMAx (ORCPT ); Tue, 7 Apr 2009 08:00:53 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.39,337,1235980800"; d="scan'208";a="128748908" Message-Id: <20090407115234.313061952@intel.com> References: <20090407115039.780820496@intel.com> User-Agent: quilt/0.46-1 Date: Tue, 07 Apr 2009 19:50:44 +0800 From: Wu Fengguang To: Andrew Morton Cc: Benjamin Herrenschmidt , Wu Fengguang Cc: David Rientjes Cc: Hugh Dickins Cc: Ingo Molnar Cc: Lee Schermerhorn Cc: Mike Waychison Cc: Nick Piggin Cc: Peter Zijlstra Cc: Rohit Seth Cc: Edwin Cc: "H. Peter Anvin" Cc: Ying Han Cc: LKML Cc: Cc: Subject: [PATCH 05/14] readahead: account mmap_miss for VM_FAULT_RETRY Content-Disposition: inline; filename=readahead-mmap_miss-retry.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The VM_FAULT_RETRY case introduced a performance bug that leads to excessive/unconditional mmap readarounds for wild random mmap reads. A retried page fault means a mmap readahead miss(mmap_miss++) followed by a hit(mmap_miss--) on the same page. This sticks mmap_miss, and thus stops mmap readaround from being turned off for wild random reads. Fix it by an extra mmap_miss increament in order to counteract the followed mmap hit. Also make mmap_miss a more robust 'unsigned int', so that if ever mmap_miss goes out of range, it only create _temporary_ performance impacts. Signed-off-by: Wu Fengguang --- include/linux/fs.h | 2 +- mm/filemap.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) --- mm.orig/mm/filemap.c +++ mm/mm/filemap.c @@ -1574,8 +1574,10 @@ retry_find: vmf->pgoff, 1); retry_ret = find_lock_page_retry(mapping, vmf->pgoff, vma, &page, retry_flag); - if (retry_ret == VM_FAULT_RETRY) + if (retry_ret == VM_FAULT_RETRY) { + ra->mmap_miss++; /* counteract the followed retry hit */ return retry_ret; + } if (!page) goto no_cached_page; } @@ -1617,8 +1619,10 @@ retry_find: retry_find_retry: retry_ret = find_lock_page_retry(mapping, vmf->pgoff, vma, &page, retry_flag); - if (retry_ret == VM_FAULT_RETRY) + if (retry_ret == VM_FAULT_RETRY) { + ra->mmap_miss++; /* counteract the followed retry hit */ return retry_ret; + } if (!page) goto no_cached_page; } --- mm.orig/include/linux/fs.h +++ mm/include/linux/fs.h @@ -824,7 +824,7 @@ struct file_ra_state { there are only # of pages ahead */ unsigned int ra_pages; /* Maximum readahead window */ - int mmap_miss; /* Cache miss stat for mmap accesses */ + unsigned int mmap_miss; /* Cache miss stat for mmap accesses */ loff_t prev_pos; /* Cache last read() position */ }; --