diff options
-rw-r--r-- | fs/nfsd/nfs4state.c | 28 | ||||
-rw-r--r-- | fs/nfsd/nfssvc.c | 13 | ||||
-rw-r--r-- | include/linux/nfsd/nfsd.h | 4 | ||||
-rw-r--r-- | include/linux/nfsd/state.h | 1 |
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 | */ |
424 | static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan) | 423 | static 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 | */ |
76 | spinlock_t nfsd_drc_lock; | 76 | spinlock_t nfsd_drc_lock; |
77 | unsigned int nfsd_drc_max_pages; | 77 | unsigned int nfsd_drc_max_mem; |
78 | unsigned int nfsd_drc_pages_used; | 78 | unsigned 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) |
81 | static struct svc_stat nfsd_acl_svcstats; | 81 | static struct svc_stat nfsd_acl_svcstats; |
@@ -247,12 +247,11 @@ void nfsd_reset_versions(void) | |||
247 | static void set_max_drc(void) | 247 | static 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 | ||
258 | int nfsd_create_serv(void) | 257 | int 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; | |||
57 | extern struct mutex nfsd_mutex; | 57 | extern struct mutex nfsd_mutex; |
58 | extern struct svc_serv *nfsd_serv; | 58 | extern struct svc_serv *nfsd_serv; |
59 | extern spinlock_t nfsd_drc_lock; | 59 | extern spinlock_t nfsd_drc_lock; |
60 | extern unsigned int nfsd_drc_max_pages; | 60 | extern unsigned int nfsd_drc_max_mem; |
61 | extern unsigned int nfsd_drc_pages_used; | 61 | extern unsigned int nfsd_drc_mem_used; |
62 | 62 | ||
63 | extern struct seq_operations nfs_exports_op; | 63 | extern 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 | ||