diff options
-rw-r--r-- | fs/nfsd/nfs4state.c | 10 | ||||
-rw-r--r-- | fs/nfsd/nfssvc.c | 19 | ||||
-rw-r--r-- | include/linux/nfsd/nfsd.h | 3 | ||||
-rw-r--r-- | include/linux/sunrpc/svc.h | 2 |
4 files changed, 23 insertions, 11 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 980a216a48c8..2e6a44e3d2fe 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -430,11 +430,11 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan) | |||
430 | else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION) | 430 | else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION) |
431 | fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION; | 431 | fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION; |
432 | 432 | ||
433 | spin_lock(&nfsd_serv->sv_lock); | 433 | spin_lock(&nfsd_drc_lock); |
434 | if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages) | 434 | if (np + nfsd_drc_pages_used > nfsd_drc_max_pages) |
435 | np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used; | 435 | np = nfsd_drc_max_pages - nfsd_drc_pages_used; |
436 | nfsd_serv->sv_drc_pages_used += np; | 436 | nfsd_drc_pages_used += np; |
437 | spin_unlock(&nfsd_serv->sv_lock); | 437 | spin_unlock(&nfsd_drc_lock); |
438 | 438 | ||
439 | if (np <= 0) { | 439 | if (np <= 0) { |
440 | status = nfserr_resource; | 440 | status = nfserr_resource; |
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index d4c9884cd54b..78d8fcd883fb 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -67,6 +67,16 @@ struct timeval nfssvc_boot; | |||
67 | DEFINE_MUTEX(nfsd_mutex); | 67 | DEFINE_MUTEX(nfsd_mutex); |
68 | struct svc_serv *nfsd_serv; | 68 | struct svc_serv *nfsd_serv; |
69 | 69 | ||
70 | /* | ||
71 | * nfsd_drc_lock protects nfsd_drc_max_pages and nfsd_drc_pages_used. | ||
72 | * nfsd_drc_max_pages limits the total amount of memory available for | ||
73 | * version 4.1 DRC caches. | ||
74 | * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage. | ||
75 | */ | ||
76 | spinlock_t nfsd_drc_lock; | ||
77 | unsigned int nfsd_drc_max_pages; | ||
78 | unsigned int nfsd_drc_pages_used; | ||
79 | |||
70 | #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) | 80 | #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) |
71 | static struct svc_stat nfsd_acl_svcstats; | 81 | static struct svc_stat nfsd_acl_svcstats; |
72 | static struct svc_version * nfsd_acl_version[] = { | 82 | static struct svc_version * nfsd_acl_version[] = { |
@@ -238,11 +248,12 @@ static void set_max_drc(void) | |||
238 | { | 248 | { |
239 | /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */ | 249 | /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */ |
240 | #define NFSD_DRC_SIZE_SHIFT 7 | 250 | #define NFSD_DRC_SIZE_SHIFT 7 |
241 | nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages() | 251 | nfsd_drc_max_pages = nr_free_buffer_pages() |
242 | >> NFSD_DRC_SIZE_SHIFT; | 252 | >> NFSD_DRC_SIZE_SHIFT; |
243 | nfsd_serv->sv_drc_pages_used = 0; | 253 | nfsd_drc_pages_used = 0; |
244 | dprintk("%s svc_drc_max_pages %u\n", __func__, | 254 | spin_lock_init(&nfsd_drc_lock); |
245 | nfsd_serv->sv_drc_max_pages); | 255 | dprintk("%s nfsd_drc_max_pages %u\n", __func__, |
256 | nfsd_drc_max_pages); | ||
246 | } | 257 | } |
247 | 258 | ||
248 | int nfsd_create_serv(void) | 259 | int nfsd_create_serv(void) |
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h index 2b49d676d0c9..2571f856908f 100644 --- a/include/linux/nfsd/nfsd.h +++ b/include/linux/nfsd/nfsd.h | |||
@@ -56,6 +56,9 @@ extern struct svc_version nfsd_version2, nfsd_version3, | |||
56 | extern u32 nfsd_supported_minorversion; | 56 | 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; | ||
60 | extern unsigned int nfsd_drc_max_pages; | ||
61 | extern unsigned int nfsd_drc_pages_used; | ||
59 | 62 | ||
60 | extern struct seq_operations nfs_exports_op; | 63 | extern struct seq_operations nfs_exports_op; |
61 | 64 | ||
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index ea8009695c69..52e8cb0a7569 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h | |||
@@ -94,8 +94,6 @@ struct svc_serv { | |||
94 | struct module * sv_module; /* optional module to count when | 94 | struct module * sv_module; /* optional module to count when |
95 | * adding threads */ | 95 | * adding threads */ |
96 | svc_thread_fn sv_function; /* main function for threads */ | 96 | svc_thread_fn sv_function; /* main function for threads */ |
97 | unsigned int sv_drc_max_pages; /* Total pages for DRC */ | ||
98 | unsigned int sv_drc_pages_used;/* DRC pages used */ | ||
99 | #if defined(CONFIG_NFS_V4_1) | 97 | #if defined(CONFIG_NFS_V4_1) |
100 | struct list_head sv_cb_list; /* queue for callback requests | 98 | struct list_head sv_cb_list; /* queue for callback requests |
101 | * that arrive over the same | 99 | * that arrive over the same |