|
@@ -414,31 +414,31 @@ gen_sessionid(struct nfsd4_session *ses)
|
|
|
|
|
|
/*
|
|
/*
|
|
* Give the client the number of slots it requests bound by
|
|
* 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)
|
|
static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
|
|
{
|
|
{
|
|
- int np;
|
|
|
|
|
|
+ int mem;
|
|
|
|
|
|
if (fchan->maxreqs < 1)
|
|
if (fchan->maxreqs < 1)
|
|
return nfserr_inval;
|
|
return nfserr_inval;
|
|
else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
|
|
else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
|
|
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);
|
|
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);
|
|
spin_unlock(&nfsd_drc_lock);
|
|
|
|
|
|
- fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
|
|
|
|
|
|
+ fchan->maxreqs = mem / NFSD_SLOT_CACHE_SIZE;
|
|
if (fchan->maxreqs == 0)
|
|
if (fchan->maxreqs == 0)
|
|
return nfserr_resource;
|
|
return nfserr_resource;
|
|
return 0;
|
|
return 0;
|
|
@@ -465,9 +465,7 @@ static int init_forechannel_attrs(struct svc_rqst *rqstp,
|
|
fchan->maxresp_sz = maxcount;
|
|
fchan->maxresp_sz = maxcount;
|
|
session_fchan->maxresp_sz = fchan->maxresp_sz;
|
|
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;
|
|
fchan->maxresp_cached = session_fchan->maxresp_cached;
|
|
|
|
|
|
/* Use the client's maxops if possible */
|
|
/* 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);
|
|
nfsd4_release_respages(e->ce_respages, e->ce_resused);
|
|
}
|
|
}
|
|
spin_lock(&nfsd_drc_lock);
|
|
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);
|
|
spin_unlock(&nfsd_drc_lock);
|
|
kfree(ses);
|
|
kfree(ses);
|
|
}
|
|
}
|