From: "J. Bruce Fields" <bfields@fieldses.org>
To: andros@netapp.com
Cc: linux-nfs@vger.kernel.org, pnfs@linux-nfs.org
Subject: Re: [pnfs] [PATCH 2/5] nfsd41: change from page to memory based drc limits
Date: Thu, 16 Jul 2009 10:24:13 -0400 [thread overview]
Message-ID: <20090716142413.GE30477@fieldses.org> (raw)
In-Reply-To: <1245872278-18743-3-git-send-email-andros@netapp.com>
On Wed, Jun 24, 2009 at 03:37:46PM -0400, andros@netapp.com wrote:
> 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 | 30 ++++++++++++++----------------
> fs/nfsd/nfssvc.c | 17 +++++++++--------
> include/linux/nfsd/nfsd.h | 4 ++--
> include/linux/nfsd/state.h | 1 +
> 4 files changed, 26 insertions(+), 26 deletions(-)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 2e6a44e..b4a536d 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -414,35 +414,33 @@ 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.
> + * NFSD_MAX_SLOTS_PER_SESSION and by nfsd_drc_max_mem.
> *
> - * 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_drc_lock);
> - if (np + nfsd_drc_pages_used > nfsd_drc_max_pages)
> - np = nfsd_drc_max_pages - nfsd_drc_pages_used;
> - nfsd_drc_pages_used += np;
> + if (mem + nfsd_drc_mem_used > nfsd_drc_max_mem)
> + mem = nfsd_drc_max_mem - nfsd_drc_mem_used;
> + nfsd_drc_mem_used += mem;
> spin_unlock(&nfsd_drc_lock);
>
> - if (np <= 0) {
> - status = nfserr_resource;
> - fchan->maxreqs = 0;
> - } else
> - fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
> -
> - return status;
> + fchan->maxreqs = mem / NFSD_SLOT_CACHE_SIZE;
> + if (fchan->maxreqs == 0)
> + return nfserr_resource;
> + return 0;
> }
>
> /*
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index 78d8fcd..1793dba 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -74,8 +74,8 @@ struct svc_serv *nfsd_serv;
> * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
> */
> spinlock_t nfsd_drc_lock;
> -unsigned int nfsd_drc_max_pages;
> -unsigned int nfsd_drc_pages_used;
> +unsigned int nfsd_drc_max_mem;
> +unsigned int nfsd_drc_mem_used;
>
> #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
> static struct svc_stat nfsd_acl_svcstats;
> @@ -247,13 +247,14 @@ 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
Not really a "percent". Let's just let the calculation speak for
itself.
--b.
> - nfsd_drc_max_pages = nr_free_buffer_pages()
> - >> NFSD_DRC_SIZE_SHIFT;
> - nfsd_drc_pages_used = 0;
> + #define NFSD_DRC_SIZE_SHIFT 10
> + nfsd_drc_max_mem = (nr_free_buffer_pages()
> + >> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
> + nfsd_drc_mem_used = 0;
> spin_lock_init(&nfsd_drc_lock);
> - dprintk("%s nfsd_drc_max_pages %u\n", __func__,
> - nfsd_drc_max_pages);
> + dprintk("%s nfsd_drc_max_mem %u [in pages %lu]\n", __func__,
> + nfsd_drc_max_mem,
> + nfsd_drc_max_mem / PAGE_SIZE);
> }
>
> int nfsd_create_serv(void)
> diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
> index 2571f85..2812ed5 100644
> --- a/include/linux/nfsd/nfsd.h
> +++ b/include/linux/nfsd/nfsd.h
> @@ -57,8 +57,8 @@ extern u32 nfsd_supported_minorversion;
> extern struct mutex nfsd_mutex;
> extern struct svc_serv *nfsd_serv;
> extern spinlock_t nfsd_drc_lock;
> -extern unsigned int nfsd_drc_max_pages;
> -extern unsigned int nfsd_drc_pages_used;
> +extern unsigned int nfsd_drc_max_mem;
> +extern unsigned int nfsd_drc_mem_used;
>
> extern struct seq_operations nfs_exports_op;
>
> diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
> index f5a95fd..10b6b30 100644
> --- a/include/linux/nfsd/state.h
> +++ b/include/linux/nfsd/state.h
> @@ -98,6 +98,7 @@ struct nfs4_cb_conn {
> /* Maximum number of pages per slot cache entry */
> #define NFSD_PAGES_PER_SLOT 1
> /* Maximum number of operations per session compound */
> +#define NFSD_SLOT_CACHE_SIZE 512
> #define NFSD_MAX_OPS_PER_COMPOUND 16
>
> struct nfsd4_cache_entry {
> --
> 1.5.4.3
>
> _______________________________________________
> pNFS mailing list
> pNFS@linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
next prev parent reply other threads:[~2009-07-16 14:24 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-24 19:37 [PATCH 0/14] NFSv4.1 Server DRC rewrite Version 4 andros
2009-06-24 19:37 ` [PATCH 1/5] nfsd41: use globals for DRC limits andros
2009-06-24 19:37 ` [PATCH 2/5] nfsd41: change from page to memory based drc limits andros
2009-06-24 19:37 ` [PATCH 3/5] nfsd41: reclaim DRC memory on session free andros
2009-06-24 19:37 ` [PATCH 4/5] nfsd41: set the session maximum response size cached andros
2009-06-24 19:37 ` [PATCH 5/5] nfsd41: remove redundant forechannel max requests check andros
2009-06-24 19:37 ` [PATCH 06/14] nfsd41: change check_slot_seqid parameters andros
2009-06-24 19:37 ` [PATCH 07/14] nfsd41: replace create_session DRC with xdr structure andros
2009-06-24 19:37 ` [PATCH 08/14] nfsd41: replace page based DRC with buffer based DRC andros
2009-06-24 19:37 ` [PATCH 09/14] nfsd41: rename nfsd4_enc_uncached_replay andros
2009-06-24 19:37 ` [PATCH 10/14] nfsd41: encode replay sequence from the slot values andros
2009-06-24 19:37 ` [PATCH 11/14] nfsd41: fix nfsd4_replay_cache_entry comments andros
2009-06-24 19:37 ` [PATCH 12/14] nfsd41: support 16 slots per session andros
2009-06-24 19:37 ` [PATCH 13/14] nfsd41: add test for failed sequence operation andros
2009-06-24 19:37 ` [PATCH 14/14] nfsd41: remove redundant failed sequence check andros
2009-07-01 23:09 ` [pnfs] [PATCH 4/5] nfsd41: set the session maximum response sizecached Alexandros Batsakis
2009-07-06 19:27 ` Andy Adamson
2009-07-06 21:48 ` J. Bruce Fields
2009-07-16 14:18 ` [pnfs] [PATCH 3/5] nfsd41: reclaim DRC memory on session free J. Bruce Fields
2009-07-16 15:49 ` William A. (Andy) Adamson
2009-07-27 22:57 ` J. Bruce Fields
2009-07-31 8:38 ` Andy Adamson
2009-07-16 14:17 ` [pnfs] [PATCH 2/5] nfsd41: change from page to memory based drc limits J. Bruce Fields
2009-07-16 18:50 ` J. Bruce Fields
2009-07-16 14:24 ` J. Bruce Fields [this message]
2009-06-28 16:01 ` [pnfs] [PATCH 0/14] NFSv4.1 Server DRC rewrite Version 4 Benny Halevy
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=20090716142413.GE30477@fieldses.org \
--to=bfields@fieldses.org \
--cc=andros@netapp.com \
--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.