]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
nfsd41: use globals for DRC limits
authorAndy Adamson <andros@netapp.com>
Wed, 24 Jun 2009 19:37:45 +0000 (15:37 -0400)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 14 Jul 2009 21:52:40 +0000 (17:52 -0400)
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>
fs/nfsd/nfs4state.c
fs/nfsd/nfssvc.c
include/linux/nfsd/nfsd.h
include/linux/sunrpc/svc.h

index 980a216a48c8da9c13ed10fe3713f9a6064e8af8..2e6a44e3d2fe21d935dede6d6906392514c97b21 100644 (file)
@@ -430,11 +430,11 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
        else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
                fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
 
-       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;
-       spin_unlock(&nfsd_serv->sv_lock);
+       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;
+       spin_unlock(&nfsd_drc_lock);
 
        if (np <= 0) {
                status = nfserr_resource;
index d4c9884cd54b2bf680cc2360eaa1a9f20dec8b55..78d8fcd883fb0cf11ea3631c939ce9761ecdb268 100644 (file)
@@ -67,6 +67,16 @@ struct timeval                       nfssvc_boot;
 DEFINE_MUTEX(nfsd_mutex);
 struct svc_serv                *nfsd_serv;
 
+/*
+ * nfsd_drc_lock protects nfsd_drc_max_pages and nfsd_drc_pages_used.
+ * nfsd_drc_max_pages limits the total amount of memory available for
+ * version 4.1 DRC caches.
+ * 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;
+
 #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 static struct svc_stat nfsd_acl_svcstats;
 static struct svc_version *    nfsd_acl_version[] = {
@@ -238,11 +248,12 @@ 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_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);
+       nfsd_drc_pages_used = 0;
+       spin_lock_init(&nfsd_drc_lock);
+       dprintk("%s nfsd_drc_max_pages %u\n", __func__,
+               nfsd_drc_max_pages);
 }
 
 int nfsd_create_serv(void)
index 2b49d676d0c9a9e7ef39fd4de53cfbb4d5f32bb2..2571f856908f385d6ed61ca7f32673a1d729acec 100644 (file)
@@ -56,6 +56,9 @@ extern struct svc_version     nfsd_version2, nfsd_version3,
 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 struct seq_operations nfs_exports_op;
 
index ea8009695c69b1ea437b255fd0a141ebf21feaa7..52e8cb0a756993e0f095372b9e200d663d9da1ab 100644 (file)
@@ -94,8 +94,6 @@ 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 */
 #if defined(CONFIG_NFS_V4_1)
        struct list_head        sv_cb_list;     /* queue for callback requests
                                                 * that arrive over the same