aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfsd/nfs4state.c28
-rw-r--r--fs/nfsd/nfssvc.c13
-rw-r--r--include/linux/nfsd/nfsd.h4
-rw-r--r--include/linux/nfsd/state.h1
4 files changed, 22 insertions, 24 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 70cba3fbfa6..e2b11b1b515 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -414,31 +414,31 @@ gen_sessionid(struct nfsd4_session *ses)
414 414
415/* 415/*
416 * Give the client the number of slots it requests bound by 416 * Give the client the number of slots it requests bound by
417 * NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages. 417 * NFSD_MAX_SLOTS_PER_SESSION and by nfsd_drc_max_mem.
418 * 418 *
419 * If we run out of pages (sv_drc_pages_used == sv_drc_max_pages) we 419 * If we run out of reserved DRC memory we should (up to a point) re-negotiate
420 * should (up to a point) re-negotiate active sessions and reduce their 420 * active sessions and reduce their slot usage to make rooom for new
421 * slot usage to make rooom for new connections. For now we just fail the 421 * connections. For now we just fail the create session.
422 * create session.
423 */ 422 */
424static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan) 423static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
425{ 424{
426 int np; 425 int mem;
427 426
428 if (fchan->maxreqs < 1) 427 if (fchan->maxreqs < 1)
429 return nfserr_inval; 428 return nfserr_inval;
430 else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION) 429 else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
431 fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION; 430 fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
432 431
433 np = fchan->maxreqs * NFSD_PAGES_PER_SLOT; 432 mem = fchan->maxreqs * NFSD_SLOT_CACHE_SIZE;
434 433
435 spin_lock(&nfsd_drc_lock); 434 spin_lock(&nfsd_drc_lock);
436 if (np + nfsd_drc_pages_used > nfsd_drc_max_pages) 435 if (mem + nfsd_drc_mem_used > nfsd_drc_max_mem)
437 np = nfsd_drc_max_pages - nfsd_drc_pages_used; 436 mem = ((nfsd_drc_max_mem - nfsd_drc_mem_used) /
438 nfsd_drc_pages_used += np; 437 NFSD_SLOT_CACHE_SIZE) * NFSD_SLOT_CACHE_SIZE;
438 nfsd_drc_mem_used += mem;
439 spin_unlock(&nfsd_drc_lock); 439 spin_unlock(&nfsd_drc_lock);
440 440
441 fchan->maxreqs = np / NFSD_PAGES_PER_SLOT; 441 fchan->maxreqs = mem / NFSD_SLOT_CACHE_SIZE;
442 if (fchan->maxreqs == 0) 442 if (fchan->maxreqs == 0)
443 return nfserr_resource; 443 return nfserr_resource;
444 return 0; 444 return 0;
@@ -465,9 +465,7 @@ static int init_forechannel_attrs(struct svc_rqst *rqstp,
465 fchan->maxresp_sz = maxcount; 465 fchan->maxresp_sz = maxcount;
466 session_fchan->maxresp_sz = fchan->maxresp_sz; 466 session_fchan->maxresp_sz = fchan->maxresp_sz;
467 467
468 /* Set the max response cached size our default which is 468 session_fchan->maxresp_cached = NFSD_SLOT_CACHE_SIZE;
469 * a multiple of PAGE_SIZE and small */
470 session_fchan->maxresp_cached = NFSD_PAGES_PER_SLOT * PAGE_SIZE;
471 fchan->maxresp_cached = session_fchan->maxresp_cached; 469 fchan->maxresp_cached = session_fchan->maxresp_cached;
472 470
473 /* Use the client's maxops if possible */ 471 /* Use the client's maxops if possible */
@@ -585,7 +583,7 @@ free_session(struct kref *kref)
585 nfsd4_release_respages(e->ce_respages, e->ce_resused); 583 nfsd4_release_respages(e->ce_respages, e->ce_resused);
586 } 584 }
587 spin_lock(&nfsd_drc_lock); 585 spin_lock(&nfsd_drc_lock);
588 nfsd_drc_pages_used -= ses->se_fchannel.maxreqs * NFSD_PAGES_PER_SLOT; 586 nfsd_drc_mem_used -= ses->se_fchannel.maxreqs * NFSD_SLOT_CACHE_SIZE;
589 spin_unlock(&nfsd_drc_lock); 587 spin_unlock(&nfsd_drc_lock);
590 kfree(ses); 588 kfree(ses);
591} 589}
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 9be2a1932f8..5a280a9cb54 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -74,8 +74,8 @@ struct svc_serv *nfsd_serv;
74 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage. 74 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
75 */ 75 */
76spinlock_t nfsd_drc_lock; 76spinlock_t nfsd_drc_lock;
77unsigned int nfsd_drc_max_pages; 77unsigned int nfsd_drc_max_mem;
78unsigned int nfsd_drc_pages_used; 78unsigned int nfsd_drc_mem_used;
79 79
80#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) 80#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
81static struct svc_stat nfsd_acl_svcstats; 81static struct svc_stat nfsd_acl_svcstats;
@@ -247,12 +247,11 @@ void nfsd_reset_versions(void)
247static void set_max_drc(void) 247static void set_max_drc(void)
248{ 248{
249 #define NFSD_DRC_SIZE_SHIFT 10 249 #define NFSD_DRC_SIZE_SHIFT 10
250 nfsd_drc_max_pages = nr_free_buffer_pages() 250 nfsd_drc_max_mem = (nr_free_buffer_pages()
251 >> NFSD_DRC_SIZE_SHIFT; 251 >> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
252 nfsd_drc_pages_used = 0; 252 nfsd_drc_mem_used = 0;
253 spin_lock_init(&nfsd_drc_lock); 253 spin_lock_init(&nfsd_drc_lock);
254 dprintk("%s nfsd_drc_max_pages %u\n", __func__, 254 dprintk("%s nfsd_drc_max_mem %u \n", __func__, nfsd_drc_max_mem);
255 nfsd_drc_max_pages);
256} 255}
257 256
258int nfsd_create_serv(void) 257int nfsd_create_serv(void)
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
index 2571f856908..2812ed52669 100644
--- a/include/linux/nfsd/nfsd.h
+++ b/include/linux/nfsd/nfsd.h
@@ -57,8 +57,8 @@ extern 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; 59extern spinlock_t nfsd_drc_lock;
60extern unsigned int nfsd_drc_max_pages; 60extern unsigned int nfsd_drc_max_mem;
61extern unsigned int nfsd_drc_pages_used; 61extern unsigned int nfsd_drc_mem_used;
62 62
63extern struct seq_operations nfs_exports_op; 63extern struct seq_operations nfs_exports_op;
64 64
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 57ab2ed0845..a6c87d62389 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -96,6 +96,7 @@ struct nfs4_cb_conn {
96#define NFSD_MAX_SLOTS_PER_SESSION 128 96#define NFSD_MAX_SLOTS_PER_SESSION 128
97/* Maximum number of pages per slot cache entry */ 97/* Maximum number of pages per slot cache entry */
98#define NFSD_PAGES_PER_SLOT 1 98#define NFSD_PAGES_PER_SLOT 1
99#define NFSD_SLOT_CACHE_SIZE PAGE_SIZE
99/* Maximum number of operations per session compound */ 100/* Maximum number of operations per session compound */
100#define NFSD_MAX_OPS_PER_COMPOUND 16 101#define NFSD_MAX_OPS_PER_COMPOUND 16
101 102