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
					
				
			
		
					 4 changed files with 22 additions and 24 deletions
				
			
		| 
						 | 
					@ -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
 | 
					 * If we run out of reserved DRC memory we should (up to a point) re-negotiate
 | 
				
			||||||
 * should (up to a point) re-negotiate active sessions and reduce their
 | 
					 * active sessions and reduce their slot usage to make rooom for new
 | 
				
			||||||
 * slot usage to make rooom for new connections. For now we just fail the
 | 
					 * connections. For now we just fail the create session.
 | 
				
			||||||
 * 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)
 | 
						if (mem + nfsd_drc_mem_used > nfsd_drc_max_mem)
 | 
				
			||||||
		np = nfsd_drc_max_pages - nfsd_drc_pages_used;
 | 
							mem = ((nfsd_drc_max_mem - nfsd_drc_mem_used) /
 | 
				
			||||||
	nfsd_drc_pages_used += np;
 | 
									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
 | 
						session_fchan->maxresp_cached = NFSD_SLOT_CACHE_SIZE;
 | 
				
			||||||
	 * a multiple of PAGE_SIZE and small */
 | 
					 | 
				
			||||||
	session_fchan->maxresp_cached = NFSD_PAGES_PER_SLOT * PAGE_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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,8 +74,8 @@ struct svc_serv 		*nfsd_serv;
 | 
				
			||||||
 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
 | 
					 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
spinlock_t	nfsd_drc_lock;
 | 
					spinlock_t	nfsd_drc_lock;
 | 
				
			||||||
unsigned int	nfsd_drc_max_pages;
 | 
					unsigned int	nfsd_drc_max_mem;
 | 
				
			||||||
unsigned int	nfsd_drc_pages_used;
 | 
					unsigned int	nfsd_drc_mem_used;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 | 
					#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 | 
				
			||||||
static struct svc_stat	nfsd_acl_svcstats;
 | 
					static struct svc_stat	nfsd_acl_svcstats;
 | 
				
			||||||
| 
						 | 
					@ -247,12 +247,11 @@ void nfsd_reset_versions(void)
 | 
				
			||||||
static void set_max_drc(void)
 | 
					static void set_max_drc(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	#define NFSD_DRC_SIZE_SHIFT	10
 | 
						#define NFSD_DRC_SIZE_SHIFT	10
 | 
				
			||||||
	nfsd_drc_max_pages = nr_free_buffer_pages()
 | 
						nfsd_drc_max_mem = (nr_free_buffer_pages()
 | 
				
			||||||
						>> NFSD_DRC_SIZE_SHIFT;
 | 
										>> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
 | 
				
			||||||
	nfsd_drc_pages_used = 0;
 | 
						nfsd_drc_mem_used = 0;
 | 
				
			||||||
	spin_lock_init(&nfsd_drc_lock);
 | 
						spin_lock_init(&nfsd_drc_lock);
 | 
				
			||||||
	dprintk("%s nfsd_drc_max_pages %u\n", __func__,
 | 
						dprintk("%s nfsd_drc_max_mem %u \n", __func__, nfsd_drc_max_mem);
 | 
				
			||||||
		nfsd_drc_max_pages);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int nfsd_create_serv(void)
 | 
					int nfsd_create_serv(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,8 +57,8 @@ extern u32			nfsd_supported_minorversion;
 | 
				
			||||||
extern struct mutex		nfsd_mutex;
 | 
					extern struct mutex		nfsd_mutex;
 | 
				
			||||||
extern struct svc_serv		*nfsd_serv;
 | 
					extern struct svc_serv		*nfsd_serv;
 | 
				
			||||||
extern spinlock_t		nfsd_drc_lock;
 | 
					extern spinlock_t		nfsd_drc_lock;
 | 
				
			||||||
extern unsigned int		nfsd_drc_max_pages;
 | 
					extern unsigned int		nfsd_drc_max_mem;
 | 
				
			||||||
extern unsigned int		nfsd_drc_pages_used;
 | 
					extern unsigned int		nfsd_drc_mem_used;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct seq_operations nfs_exports_op;
 | 
					extern struct seq_operations nfs_exports_op;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,6 +96,7 @@ struct nfs4_cb_conn {
 | 
				
			||||||
#define NFSD_MAX_SLOTS_PER_SESSION	128
 | 
					#define NFSD_MAX_SLOTS_PER_SESSION	128
 | 
				
			||||||
/* Maximum number of pages per slot cache entry */
 | 
					/* Maximum number of pages per slot cache entry */
 | 
				
			||||||
#define NFSD_PAGES_PER_SLOT	1
 | 
					#define NFSD_PAGES_PER_SLOT	1
 | 
				
			||||||
 | 
					#define NFSD_SLOT_CACHE_SIZE		PAGE_SIZE
 | 
				
			||||||
/* Maximum number of operations per session compound */
 | 
					/* Maximum number of operations per session compound */
 | 
				
			||||||
#define NFSD_MAX_OPS_PER_COMPOUND	16
 | 
					#define NFSD_MAX_OPS_PER_COMPOUND	16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue