From patchwork Tue Jun 14 02:33:23 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Rees X-Patchwork-Id: 877642 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p5E2XMS0031169 for ; Tue, 14 Jun 2011 02:33:26 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754530Ab1FNCdZ (ORCPT ); Mon, 13 Jun 2011 22:33:25 -0400 Received: from merit-proxy01.merit.edu ([207.75.116.193]:48238 "EHLO merit-proxy01.merit.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754484Ab1FNCdZ (ORCPT ); Mon, 13 Jun 2011 22:33:25 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by merit-proxy01.merit.edu (Postfix) with ESMTP id 063BF2039D47; Mon, 13 Jun 2011 22:33:25 -0400 (EDT) X-Virus-Scanned: amavisd-new at merit-proxy01.merit.edu Received: from merit-proxy01.merit.edu ([127.0.0.1]) by localhost (merit-proxy01.merit.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4W4UxvcsjYrq; Mon, 13 Jun 2011 22:33:24 -0400 (EDT) Received: from merit.edu (74-126-0-171.static.123.net [74.126.0.171]) by merit-proxy01.merit.edu (Postfix) with ESMTPSA id 5D8292039CE1; Mon, 13 Jun 2011 22:33:24 -0400 (EDT) X-Mailbox-Line: From 599083a2408045d79d8ef4fb453d5a892f5e9d83 Mon Sep 17 00:00:00 2001 Message-Id: <599083a2408045d79d8ef4fb453d5a892f5e9d83.1308017750.git.rees@umich.edu> In-Reply-To: References: Subject: [PATCH 33/33] pnfsblock DEVONLY: Add configurable prefetch size for layoutget To: Benny Halevy Cc: linux-nfs@vger.kernel.org, peter honeyman Date: Mon, 13 Jun 2011 22:33:23 -0400 From: Jim Rees Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Tue, 14 Jun 2011 02:33:26 +0000 (UTC) From: Peng Tao Do not send upstream. Only for dealing with servers that return small layouts. pnfs_layout_prefetch_kb can be modified via sysctl. default to 0 so no effect if not set via sysctl. Signed-off-by: Peng Tao --- fs/nfs/pnfs.c | 17 +++++++++++++++++ fs/nfs/pnfs.h | 1 + fs/nfs/sysctl.c | 10 ++++++++++ 3 files changed, 28 insertions(+), 0 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 7912635..4f63ebd 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -46,6 +46,11 @@ static DEFINE_SPINLOCK(pnfs_spinlock); */ static LIST_HEAD(pnfs_modules_tbl); +/* + * layoutget prefetch size + */ +unsigned int pnfs_layout_prefetch_kb; + /* Return the registered pnfs layout driver module matching given id */ static struct pnfs_layoutdriver_type * find_pnfs_driver_locked(u32 id) @@ -909,6 +914,16 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo, } /* + * Set layout prefetch length. + */ +static void +pnfs_set_layout_prefetch(struct pnfs_layout_range *range) +{ + if (range->length < (pnfs_layout_prefetch_kb << 10)) + range->length = pnfs_layout_prefetch_kb << 10; +} + +/* * Layout segment is retreived from the server if not cached. * The appropriate layout segment is referenced and returned to the caller. */ @@ -959,6 +974,8 @@ pnfs_update_layout(struct inode *ino, if (pnfs_layoutgets_blocked(lo, NULL, 0)) goto out_unlock; + + pnfs_set_layout_prefetch(&arg); atomic_inc(&lo->plh_outstanding); get_layout_hdr(lo); diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index d7f203b..6718053 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -180,6 +180,7 @@ extern int nfs4_proc_layoutget(struct nfs4_layoutget *lgp); extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp); /* pnfs.c */ +extern unsigned int pnfs_layout_prefetch_kb; void get_layout_hdr(struct pnfs_layout_hdr *lo); void put_lseg(struct pnfs_layout_segment *lseg); diff --git a/fs/nfs/sysctl.c b/fs/nfs/sysctl.c index 978aaeb..79a5134 100644 --- a/fs/nfs/sysctl.c +++ b/fs/nfs/sysctl.c @@ -14,6 +14,7 @@ #include #include "callback.h" +#include "pnfs.h" #ifdef CONFIG_NFS_V4 static const int nfs_set_port_min = 0; @@ -42,6 +43,15 @@ static ctl_table nfs_cb_sysctls[] = { }, #endif /* CONFIG_NFS_USE_NEW_IDMAPPER */ #endif +#ifdef CONFIG_NFS_V4_1 + { + .procname = "pnfs_layout_prefetch_kb", + .data = &pnfs_layout_prefetch_kb, + .maxlen = sizeof(pnfs_layout_prefetch_kb), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +#endif { .procname = "nfs_mountpoint_timeout", .data = &nfs_mountpoint_expiry_timeout,