aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Adamson <andros@netapp.com>2009-06-24 15:37:45 -0400
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-07-14 17:52:40 -0400
commit4bd9b0f4afc76cf972578c702e1bc1b6f2d10ba5 (patch)
treeec7289f1c24ef1ff75c2fdd3cfb2c7ef66f8c44d
parent7702ce40bc84a02e88aa20f95333df8cff5f9d37 (diff)
nfsd41: use globals for DRC limits
The version 4.1 DRC memory limit and tracking variables are server wide and session specific. Replace struct svc_serv fields with globals. Stop using the svc_serv sv_lock. Add a spinlock to serialize access to the DRC limit management variables which change on session creation and deletion (usage counter) or (future) administrative action to adjust the total DRC memory limit. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
-rw-r--r--fs/nfsd/nfs4state.c10
-rw-r--r--fs/nfsd/nfssvc.c19
-rw-r--r--include/linux/nfsd/nfsd.h3
-rw-r--r--include/linux/sunrpc/svc.h2
4 files changed, 23 insertions, 11 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 980a216a48c8..2e6a44e3d2fe 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -430,11 +430,11 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
430 else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION) 430 else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
431 fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION; 431 fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
432 432
433 spin_lock(&nfsd_serv->sv_lock); 433 spin_lock(&nfsd_drc_lock);
434 if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages) 434 if (np + nfsd_drc_pages_used > nfsd_drc_max_pages)
435 np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used; 435 np = nfsd_drc_max_pages - nfsd_drc_pages_used;
436 nfsd_serv->sv_drc_pages_used += np; 436 nfsd_drc_pages_used += np;
437 spin_unlock(&nfsd_serv->sv_lock); 437 spin_unlock(&nfsd_drc_lock);
438 438
439 if (np <= 0) { 439 if (np <= 0) {
440 status = nfserr_resource; 440 status = nfserr_resource;
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index d4c9884cd54b..78d8fcd883fb 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -67,6 +67,16 @@ struct timeval nfssvc_boot;
67DEFINE_MUTEX(nfsd_mutex); 67DEFINE_MUTEX(nfsd_mutex);
68struct svc_serv *nfsd_serv; 68struct svc_serv *nfsd_serv;
69 69
70/*
71 * nfsd_drc_lock protects nfsd_drc_max_pages and nfsd_drc_pages_used.
72 * nfsd_drc_max_pages limits the total amount of memory available for
73 * version 4.1 DRC caches.
74 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
75 */
76spinlock_t nfsd_drc_lock;
77unsigned int nfsd_drc_max_pages;
78unsigned int nfsd_drc_pages_used;
79
70#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) 80#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
71static struct svc_stat nfsd_acl_svcstats; 81static struct svc_stat nfsd_acl_svcstats;
72static struct svc_version * nfsd_acl_version[] = { 82static struct svc_version * nfsd_acl_version[] = {
@@ -238,11 +248,12 @@ static void set_max_drc(void)
238{ 248{
239 /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */ 249 /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
240 #define NFSD_DRC_SIZE_SHIFT 7 250 #define NFSD_DRC_SIZE_SHIFT 7
241 nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages() 251 nfsd_drc_max_pages = nr_free_buffer_pages()
242 >> NFSD_DRC_SIZE_SHIFT; 252 >> NFSD_DRC_SIZE_SHIFT;
243 nfsd_serv->sv_drc_pages_used = 0; 253 nfsd_drc_pages_used = 0;
244 dprintk("%s svc_drc_max_pages %u\n", __func__, 254 spin_lock_init(&nfsd_drc_lock);
245 nfsd_serv->sv_drc_max_pages); 255 dprintk("%s nfsd_drc_max_pages %u\n", __func__,
256 nfsd_drc_max_pages);
246} 257}
247 258
248int nfsd_create_serv(void) 259int nfsd_create_serv(void)
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
index 2b49d676d0c9..2571f856908f 100644
--- a/include/linux/nfsd/nfsd.h
+++ b/include/linux/nfsd/nfsd.h
@@ -56,6 +56,9 @@ extern struct svc_version nfsd_version2, nfsd_version3,
56extern u32 nfsd_supported_minorversion; 56extern u32 nfsd_supported_minorversion;
57extern struct mutex nfsd_mutex; 57extern struct mutex nfsd_mutex;
58extern struct svc_serv *nfsd_serv; 58extern struct svc_serv *nfsd_serv;
59extern spinlock_t nfsd_drc_lock;
60extern unsigned int nfsd_drc_max_pages;
61extern unsigned int nfsd_drc_pages_used;
59 62
60extern struct seq_operations nfs_exports_op; 63extern struct seq_operations nfs_exports_op;
61 64
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index ea8009695c69..52e8cb0a7569 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -94,8 +94,6 @@ struct svc_serv {
94 struct module * sv_module; /* optional module to count when 94 struct module * sv_module; /* optional module to count when
95 * adding threads */ 95 * adding threads */
96 svc_thread_fn sv_function; /* main function for threads */ 96 svc_thread_fn sv_function; /* main function for threads */
97 unsigned int sv_drc_max_pages; /* Total pages for DRC */
98 unsigned int sv_drc_pages_used;/* DRC pages used */
99#if defined(CONFIG_NFS_V4_1) 97#if defined(CONFIG_NFS_V4_1)
100 struct list_head sv_cb_list; /* queue for callback requests 98 struct list_head sv_cb_list; /* queue for callback requests
101 * that arrive over the same 99 * that arrive over the same