forked from Minki/linux
nfsd41: hange from page to memory based drc limits
NFSD_SLOT_CACHE_SIZE is the size of all encoded operation responses (excluding the sequence operation) that we want to cache. For now, keep NFSD_SLOT_CACHE_SIZE at PAGE_SIZE. It will be reduced when the DRC is changed from page based to memory based. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
6a14dd1a4f
commit
0c193054a4
@ -414,31 +414,31 @@ gen_sessionid(struct nfsd4_session *ses)
|
||||
|
||||
/*
|
||||
* Give the client the number of slots it requests bound by
|
||||
* NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages.
|
||||
* NFSD_MAX_SLOTS_PER_SESSION and by nfsd_drc_max_mem.
|
||||
*
|
||||
* If we run out of pages (sv_drc_pages_used == sv_drc_max_pages) we
|
||||
* should (up to a point) re-negotiate active sessions and reduce their
|
||||
* slot usage to make rooom for new connections. For now we just fail the
|
||||
* create session.
|
||||
* If we run out of reserved DRC memory we should (up to a point) re-negotiate
|
||||
* active sessions and reduce their slot usage to make rooom for new
|
||||
* connections. For now we just fail the create session.
|
||||
*/
|
||||
static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
|
||||
{
|
||||
int np;
|
||||
int mem;
|
||||
|
||||
if (fchan->maxreqs < 1)
|
||||
return nfserr_inval;
|
||||
else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
|
||||
fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
|
||||
|
||||
np = fchan->maxreqs * NFSD_PAGES_PER_SLOT;
|
||||
mem = fchan->maxreqs * NFSD_SLOT_CACHE_SIZE;
|
||||
|
||||
spin_lock(&nfsd_drc_lock);
|
||||
if (np + nfsd_drc_pages_used > nfsd_drc_max_pages)
|
||||
np = nfsd_drc_max_pages - nfsd_drc_pages_used;
|
||||
nfsd_drc_pages_used += np;
|
||||
if (mem + nfsd_drc_mem_used > nfsd_drc_max_mem)
|
||||
mem = ((nfsd_drc_max_mem - nfsd_drc_mem_used) /
|
||||
NFSD_SLOT_CACHE_SIZE) * NFSD_SLOT_CACHE_SIZE;
|
||||
nfsd_drc_mem_used += mem;
|
||||
spin_unlock(&nfsd_drc_lock);
|
||||
|
||||
fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
|
||||
fchan->maxreqs = mem / NFSD_SLOT_CACHE_SIZE;
|
||||
if (fchan->maxreqs == 0)
|
||||
return nfserr_resource;
|
||||
return 0;
|
||||
@ -465,9 +465,7 @@ static int init_forechannel_attrs(struct svc_rqst *rqstp,
|
||||
fchan->maxresp_sz = maxcount;
|
||||
session_fchan->maxresp_sz = fchan->maxresp_sz;
|
||||
|
||||
/* Set the max response cached size our default which is
|
||||
* a multiple of PAGE_SIZE and small */
|
||||
session_fchan->maxresp_cached = NFSD_PAGES_PER_SLOT * PAGE_SIZE;
|
||||
session_fchan->maxresp_cached = NFSD_SLOT_CACHE_SIZE;
|
||||
fchan->maxresp_cached = session_fchan->maxresp_cached;
|
||||
|
||||
/* Use the client's maxops if possible */
|
||||
@ -585,7 +583,7 @@ free_session(struct kref *kref)
|
||||
nfsd4_release_respages(e->ce_respages, e->ce_resused);
|
||||
}
|
||||
spin_lock(&nfsd_drc_lock);
|
||||
nfsd_drc_pages_used -= ses->se_fchannel.maxreqs * NFSD_PAGES_PER_SLOT;
|
||||
nfsd_drc_mem_used -= ses->se_fchannel.maxreqs * NFSD_SLOT_CACHE_SIZE;
|
||||
spin_unlock(&nfsd_drc_lock);
|
||||
kfree(ses);
|
||||
}
|
||||
|
@ -74,8 +74,8 @@ struct svc_serv *nfsd_serv;
|
||||
* nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
|
||||
*/
|
||||
spinlock_t nfsd_drc_lock;
|
||||
unsigned int nfsd_drc_max_pages;
|
||||
unsigned int nfsd_drc_pages_used;
|
||||
unsigned int nfsd_drc_max_mem;
|
||||
unsigned int nfsd_drc_mem_used;
|
||||
|
||||
#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
|
||||
static struct svc_stat nfsd_acl_svcstats;
|
||||
@ -247,12 +247,11 @@ void nfsd_reset_versions(void)
|
||||
static void set_max_drc(void)
|
||||
{
|
||||
#define NFSD_DRC_SIZE_SHIFT 10
|
||||
nfsd_drc_max_pages = nr_free_buffer_pages()
|
||||
>> NFSD_DRC_SIZE_SHIFT;
|
||||
nfsd_drc_pages_used = 0;
|
||||
nfsd_drc_max_mem = (nr_free_buffer_pages()
|
||||
>> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
|
||||
nfsd_drc_mem_used = 0;
|
||||
spin_lock_init(&nfsd_drc_lock);
|
||||
dprintk("%s nfsd_drc_max_pages %u\n", __func__,
|
||||
nfsd_drc_max_pages);
|
||||
dprintk("%s nfsd_drc_max_mem %u \n", __func__, nfsd_drc_max_mem);
|
||||
}
|
||||
|
||||
int nfsd_create_serv(void)
|
||||
|
@ -57,8 +57,8 @@ extern u32 nfsd_supported_minorversion;
|
||||
extern struct mutex nfsd_mutex;
|
||||
extern struct svc_serv *nfsd_serv;
|
||||
extern spinlock_t nfsd_drc_lock;
|
||||
extern unsigned int nfsd_drc_max_pages;
|
||||
extern unsigned int nfsd_drc_pages_used;
|
||||
extern unsigned int nfsd_drc_max_mem;
|
||||
extern unsigned int nfsd_drc_mem_used;
|
||||
|
||||
extern struct seq_operations nfs_exports_op;
|
||||
|
||||
|
@ -96,6 +96,7 @@ struct nfs4_cb_conn {
|
||||
#define NFSD_MAX_SLOTS_PER_SESSION 128
|
||||
/* Maximum number of pages per slot cache entry */
|
||||
#define NFSD_PAGES_PER_SLOT 1
|
||||
#define NFSD_SLOT_CACHE_SIZE PAGE_SIZE
|
||||
/* Maximum number of operations per session compound */
|
||||
#define NFSD_MAX_OPS_PER_COMPOUND 16
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user