]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
nfsd41: hard page limit for DRC
authorAndy Adamson <andros@netapp.com>
Fri, 3 Apr 2009 05:28:18 +0000 (08:28 +0300)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Sat, 4 Apr 2009 00:41:17 +0000 (17:41 -0700)
Use no more than 1/128th of the number of free pages at nfsd startup for the
v4.1 DRC.

This is an arbitrary default which should probably end up under the control
of an administrator.

Signed-off-by: Andy Adamson <andros@netapp.com>
[moved added fields in struct svc_serv under CONFIG_NFSD_V4_1]
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[fix set_max_drc calculation of sv_drc_max_pages]
[moved NFSD_DRC_SIZE_SHIFT's declaration up in header file]
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfssvc.c
include/linux/nfsd/nfsd.h
include/linux/sunrpc/svc.h

index b5168d1898ecf1efd976b478a1b8c19f8448751d..b53a098e97a4d3b52195dccc5b856c46e3ef1cf5 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/freezer.h>
 #include <linux/fs_struct.h>
 #include <linux/kthread.h>
+#include <linux/swap.h>
 
 #include <linux/sunrpc/types.h>
 #include <linux/sunrpc/stats.h>
@@ -197,6 +198,26 @@ void nfsd_reset_versions(void)
        }
 }
 
+/*
+ * Each session guarantees a negotiated per slot memory cache for replies
+ * which in turn consumes memory beyond the v2/v3/v4.0 server. A dedicated
+ * NFSv4.1 server might want to use more memory for a DRC than a machine
+ * with mutiple services.
+ *
+ * Impose a hard limit on the number of pages for the DRC which varies
+ * according to the machines free pages. This is of course only a default.
+ *
+ * For now this is a #defined shift which could be under admin control
+ * in the future.
+ */
+static void set_max_drc(void)
+{
+       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);
+}
 
 int nfsd_create_serv(void)
 {
@@ -229,6 +250,8 @@ int nfsd_create_serv(void)
                                      nfsd_last_thread, nfsd, THIS_MODULE);
        if (nfsd_serv == NULL)
                err = -ENOMEM;
+       else
+               set_max_drc();
 
        do_gettimeofday(&nfssvc_boot);          /* record boot time */
        return err;
index ab9616d09204df994b37370ec1b90387f01cc6bc..1f063d495159801d29e587a692ca14d79cc155b3 100644 (file)
@@ -331,6 +331,9 @@ extern struct timeval       nfssvc_boot;
 #define NFSD_LEASE_TIME                 (nfs4_lease_time())
 #define NFSD_LAUNDROMAT_MINTIMEOUT      10   /* seconds */
 
+/* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
+#define NFSD_DRC_SIZE_SHIFT    7
+
 /*
  * The following attributes are currently not supported by the NFSv4 server:
  *    ARCHIVE       (deprecated anyway)
index 815dd589d4db7c57dfce52a311bca82269c7b75a..d209c630a4a120c7a87bc053e09dc56ebab0f2cd 100644 (file)
@@ -95,6 +95,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 */
 };
 
 /*