All of lore.kernel.org
 help / color / mirror / Atom feed
From: andros@netapp.com
To: bfields@fieldses.org
Cc: pnfs@linux-nfs.org, linux-nfs@vger.kernel.org,
	Andy Adamson <andros@netapp.com>
Subject: [PATCH 09/31] nfsd41: change from page to memory based drc limits
Date: Tue, 28 Apr 2009 12:59:43 -0400	[thread overview]
Message-ID: <1240938005-23778-9-git-send-email-andros@netapp.com> (raw)
In-Reply-To: <1240938005-23778-8-git-send-email-andros@netapp.com>

From: Andy Adamson <andros@netapp.com>

NFSD_SLOT_CACHE_SIZE is the size of all encoded operation responses (excluding
the sequence operation) that we want to cache.

Adjust NFSD_DRC_SIZE_SHIFT to reflect using 512 bytes instead of PAGE_SIZE.

Signed-off-by: Andy Adamson <andros@netapp.com>
---
 fs/nfsd/nfs4state.c        |   29 +++++++++++++++--------------
 fs/nfsd/nfssvc.c           |   13 +++++++------
 include/linux/nfsd/state.h |    1 +
 include/linux/sunrpc/svc.h |    4 ++--
 4 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 59b601b..d12220c 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -418,33 +418,34 @@ gen_sessionid(struct nfsd4_session *ses)
  * Give the client the number of slots it requests bound by
  * NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages.
  *
- * If we run out of pages (sv_drc_pages_used == sv_drc_max_pages) we
- * should (up to a point) re-negotiate active sessions and reduce their
- * slot usage to make rooom for new connections. For now we just fail the
- * create session.
+ * If we run out of reserved DRC memory we should (up to a point) re-negotiate
+ * active sessions and reduce their slot usage to make rooom for new
+ * connections. For now we just fail the create session.
  */
 static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
 {
-	int status = 0, np = fchan->maxreqs * NFSD_PAGES_PER_SLOT;
+	int mem;
 
 	if (fchan->maxreqs < 1)
 		return nfserr_inval;
 	else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
 		fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
 
+	mem = fchan->maxreqs * NFSD_SLOT_CACHE_SIZE;
+
 	spin_lock(&nfsd_serv->sv_lock);
-	if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages)
-		np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used;
-	nfsd_serv->sv_drc_pages_used += np;
+	if (mem + nfsd_serv->sv_drc_mem_used > nfsd_serv->sv_drc_max_mem)
+		mem = nfsd_serv->sv_drc_max_mem - nfsd_serv->sv_drc_mem_used;
+	nfsd_serv->sv_drc_mem_used += mem;
 	spin_unlock(&nfsd_serv->sv_lock);
 
-	if (np <= 0) {
-		status = nfserr_resource;
+	if (mem < NFSD_SLOT_CACHE_SIZE) {
 		fchan->maxreqs = 0;
-	} else
-		fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
-
-	return status;
+		return nfserr_resource;
+	} else {
+		fchan->maxreqs = mem / NFSD_SLOT_CACHE_SIZE;
+		return 0;
+	}
 }
 
 /*
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index cbba4a9..80588cc 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -237,12 +237,13 @@ void nfsd_reset_versions(void)
 static void set_max_drc(void)
 {
 	/* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
-	#define NFSD_DRC_SIZE_SHIFT	7
-	nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages()
-						>> NFSD_DRC_SIZE_SHIFT;
-	nfsd_serv->sv_drc_pages_used = 0;
-	dprintk("%s svc_drc_max_pages %u\n", __func__,
-		nfsd_serv->sv_drc_max_pages);
+	#define NFSD_DRC_SIZE_SHIFT	10
+	nfsd_serv->sv_drc_max_mem = (nr_free_buffer_pages()
+					>> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
+	nfsd_serv->sv_drc_mem_used = 0;
+	dprintk("%s svc_drc_max_mem %u [in pages %lu]\n", __func__,
+		nfsd_serv->sv_drc_max_mem,
+		nfsd_serv->sv_drc_max_mem / PAGE_SIZE);
 }
 
 int nfsd_create_serv(void)
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index bc34876..3580d55 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -109,6 +109,7 @@ struct nfs4_callback {
 #define NFSD_MAX_SLOTS_PER_SESSION	128
 /* Maximum number of pages per slot cache entry */
 #define NFSD_PAGES_PER_SLOT	1
+#define NFSD_SLOT_CACHE_SIZE		512
 /* Maximum number of operations per session compound */
 #define NFSD_MAX_OPS_PER_COMPOUND	16
 
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 2a30775..243508e 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -94,8 +94,8 @@ struct svc_serv {
 	struct module *		sv_module;	/* optional module to count when
 						 * adding threads */
 	svc_thread_fn		sv_function;	/* main function for threads */
-	unsigned int		sv_drc_max_pages; /* Total pages for DRC */
-	unsigned int		sv_drc_pages_used;/* DRC pages used */
+	unsigned int		sv_drc_max_mem; /* Total pages for DRC */
+	unsigned int		sv_drc_mem_used;/* DRC pages used */
 };
 
 /*
-- 
1.5.4.3


  reply	other threads:[~2009-04-28 17:01 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-28 16:59 [PATCH 01/31] nfsd41: slots are freed with session andros
2009-04-28 16:59 ` [PATCH 02/31] nfsd41: change check_slot_seqid parameters andros
2009-04-28 16:59   ` [PATCH 03/31] nfsd41: turn off create session caching andros
2009-04-28 16:59     ` [PATCH 04/31] nfsd41: separate clientid slot from session slot andros
2009-04-28 16:59       ` [PATCH 05/31] nfsd41: encode create_session result into cache andros
2009-04-28 16:59         ` [PATCH 06/31] nfsd41: create_session check replay first andros
2009-04-28 16:59           ` [PATCH 07/31] nfsd41: replay solo and embedded create session andros
2009-04-28 16:59             ` [PATCH 08/31] nfsd41: sanity check client drc maxreqs andros
2009-04-28 16:59               ` andros [this message]
2009-04-28 16:59                 ` [PATCH 10/31] nfsd41: use globals for DRC memory use management andros
2009-04-28 16:59                   ` [PATCH 11/31] nfsd41: set the session maximum response size cached andros
2009-04-28 16:59                     ` [PATCH 12/31] nfsd41: use static buffers for sessions DRC andros
2009-04-28 16:59                       ` [PATCH 13/31] nfsd41: replace ce_cachethis with nfsd4_slot field andros
2009-04-28 16:59                         ` [PATCH 14/31] nfsd41: replace ce_opcnt " andros
2009-04-28 16:59                           ` [PATCH 15/31] nfsd41: nfsd41: replace ce_status " andros
2009-04-28 16:59                             ` [PATCH 16/31] nfsd41: obliterate nfsd4_copy_pages andros
2009-04-28 16:59                               ` [PATCH 17/31] nfsd41: obliterate nfsd41_copy_replay_data andros
2009-04-28 16:59                                 ` [PATCH 18/31] nfsd41: obliterate nfsd4_release_respages andros
2009-04-28 16:59                                   ` [PATCH 19/31] nfsd41: remove iovlen field from nfsd4_compound_state andros
2009-04-28 16:59                                     ` [PATCH 20/31] nfsd41: remove struct nfsd4_cache_entry andros
2009-04-28 16:59                                       ` [PATCH 21/31] nfsd41: obliterate nfsd4_set_statp andros
2009-04-28 16:59                                         ` [PATCH 22/31] nfsd41: rename nfsd4_enc_uncached_replay andros
2009-04-28 16:59                                           ` [PATCH 23/31] nfsd41: encode replay sequence from the slot values andros
2009-04-28 16:59                                             ` [PATCH 24/31] nfsd41: fix nfsd4_replay_cache_entry comments andros
2009-04-28 16:59                                               ` [PATCH 25/31] nfsd41: fix nfsd4_store_cache_entry comments andros
2009-04-28 17:00                                                 ` [PATCH 26/31] nfsd41: support 16 slots per session andros
2009-04-28 17:00                                                   ` [PATCH 27/31] nfsd41: use the maximum operations per compound in nfsd4_compoundargs andros
2009-04-28 17:00                                                     ` [PATCH 28/31] nfsd41: fix nfsd4_store_cache_entry dprintk andros
2009-04-28 17:00                                                       ` [PATCH 29/31] nfsd41: add test for failed sequence operation andros
2009-04-28 17:00                                                         ` [PATCH 30/31] nfsd41: remove redundant failed sequence check andros
2009-04-28 17:00                                                           ` [PATCH 31/31] nfsd41: only reference the session on non-replay sequence andros
2009-04-30 23:08                   ` [PATCH 10/31] nfsd41: use globals for DRC memory use management Benny Halevy
2009-05-01 14:39                     ` Andy Adamson
2009-04-30 17:34               ` [PATCH 08/31] nfsd41: sanity check client drc maxreqs Benny Halevy
2009-04-30 18:43                 ` Trond Myklebust
2009-05-15 23:08             ` [PATCH 07/31] nfsd41: replay solo and embedded create session J. Bruce Fields
2009-05-18 14:02               ` [pnfs] " William A. (Andy) Adamson
     [not found]                 ` <89c397150905180702x6cecb802md9fed2f7f81e9aa1-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-05-18 14:23                   ` J. Bruce Fields
2009-05-18 14:42                     ` William A. (Andy) Adamson
2009-05-15 23:05         ` [PATCH 05/31] nfsd41: encode create_session result into cache J. Bruce Fields
2009-05-18 13:54           ` [pnfs] " William A. (Andy) Adamson
2009-04-30 17:35   ` [PATCH 02/31] nfsd41: change check_slot_seqid parameters Benny Halevy
2009-04-30 19:34     ` Andy Adamson
2009-04-30  9:12 ` [PATCH 01/31] nfsd41: slots are freed with session Benny Halevy
2009-04-30 13:13   ` Andy Adamson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1240938005-23778-9-git-send-email-andros@netapp.com \
    --to=andros@netapp.com \
    --cc=bfields@fieldses.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=pnfs@linux-nfs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.