diff options
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index b5168d1898ec..b53a098e97a4 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 | */ | ||
213 | static 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 | ||
201 | int nfsd_create_serv(void) | 222 | int 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; |