aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfssvc.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index b5168d1898e..b53a098e97a 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -22,6 +22,7 @@
22#include <linux/freezer.h> 22#include <linux/freezer.h>
23#include <linux/fs_struct.h> 23#include <linux/fs_struct.h>
24#include <linux/kthread.h> 24#include <linux/kthread.h>
25#include <linux/swap.h>
25 26
26#include <linux/sunrpc/types.h> 27#include <linux/sunrpc/types.h>
27#include <linux/sunrpc/stats.h> 28#include <linux/sunrpc/stats.h>
@@ -197,6 +198,26 @@ void nfsd_reset_versions(void)
197 } 198 }
198} 199}
199 200
201/*
202 * Each session guarantees a negotiated per slot memory cache for replies
203 * which in turn consumes memory beyond the v2/v3/v4.0 server. A dedicated
204 * NFSv4.1 server might want to use more memory for a DRC than a machine
205 * with mutiple services.
206 *
207 * Impose a hard limit on the number of pages for the DRC which varies
208 * according to the machines free pages. This is of course only a default.
209 *
210 * For now this is a #defined shift which could be under admin control
211 * in the future.
212 */
213static void set_max_drc(void)
214{
215 nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages()
216 >> NFSD_DRC_SIZE_SHIFT;
217 nfsd_serv->sv_drc_pages_used = 0;
218 dprintk("%s svc_drc_max_pages %u\n", __func__,
219 nfsd_serv->sv_drc_max_pages);
220}
200 221
201int nfsd_create_serv(void) 222int nfsd_create_serv(void)
202{ 223{
@@ -229,6 +250,8 @@ int nfsd_create_serv(void)
229 nfsd_last_thread, nfsd, THIS_MODULE); 250 nfsd_last_thread, nfsd, THIS_MODULE);
230 if (nfsd_serv == NULL) 251 if (nfsd_serv == NULL)
231 err = -ENOMEM; 252 err = -ENOMEM;
253 else
254 set_max_drc();
232 255
233 do_gettimeofday(&nfssvc_boot); /* record boot time */ 256 do_gettimeofday(&nfssvc_boot); /* record boot time */
234 return err; 257 return err;