forked from mirrors/linux
		
	xfs: convert xfs_ialloc_next_ag() to an atomic
This is currently a spinlock lock protected rotor which can be implemented with a single atomic operation. Change it to be more efficient and get rid of the m_agirotor_lock. Noticed while converting the inode allocation AG selection loop to active perag references. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Allison Henderson <allison.henderson@oracle.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
		
							parent
							
								
									bab8b79518
								
							
						
					
					
						commit
						20a5eab49d
					
				
					 4 changed files with 4 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -1576,21 +1576,6 @@ xfs_dialloc_roll(
 | 
			
		|||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static xfs_agnumber_t
 | 
			
		||||
xfs_ialloc_next_ag(
 | 
			
		||||
	xfs_mount_t	*mp)
 | 
			
		||||
{
 | 
			
		||||
	xfs_agnumber_t	agno;
 | 
			
		||||
 | 
			
		||||
	spin_lock(&mp->m_agirotor_lock);
 | 
			
		||||
	agno = mp->m_agirotor;
 | 
			
		||||
	if (++mp->m_agirotor >= mp->m_maxagi)
 | 
			
		||||
		mp->m_agirotor = 0;
 | 
			
		||||
	spin_unlock(&mp->m_agirotor_lock);
 | 
			
		||||
 | 
			
		||||
	return agno;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
xfs_dialloc_good_ag(
 | 
			
		||||
	struct xfs_perag	*pag,
 | 
			
		||||
| 
						 | 
				
			
			@ -1748,7 +1733,7 @@ xfs_dialloc(
 | 
			
		|||
	 * an AG has enough space for file creation.
 | 
			
		||||
	 */
 | 
			
		||||
	if (S_ISDIR(mode))
 | 
			
		||||
		start_agno = xfs_ialloc_next_ag(mp);
 | 
			
		||||
		start_agno = atomic_inc_return(&mp->m_agirotor) % mp->m_maxagi;
 | 
			
		||||
	else {
 | 
			
		||||
		start_agno = XFS_INO_TO_AGNO(mp, parent);
 | 
			
		||||
		if (start_agno >= mp->m_maxagi)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -909,7 +909,8 @@ xfs_sb_mount_common(
 | 
			
		|||
	struct xfs_mount	*mp,
 | 
			
		||||
	struct xfs_sb		*sbp)
 | 
			
		||||
{
 | 
			
		||||
	mp->m_agfrotor = mp->m_agirotor = 0;
 | 
			
		||||
	mp->m_agfrotor = 0;
 | 
			
		||||
	atomic_set(&mp->m_agirotor, 0);
 | 
			
		||||
	mp->m_maxagi = mp->m_sb.sb_agcount;
 | 
			
		||||
	mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG;
 | 
			
		||||
	mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,8 +210,7 @@ typedef struct xfs_mount {
 | 
			
		|||
	struct xfs_error_cfg	m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX];
 | 
			
		||||
	struct xstats		m_stats;	/* per-fs stats */
 | 
			
		||||
	xfs_agnumber_t		m_agfrotor;	/* last ag where space found */
 | 
			
		||||
	xfs_agnumber_t		m_agirotor;	/* last ag dir inode alloced */
 | 
			
		||||
	spinlock_t		m_agirotor_lock;/* .. and lock protecting it */
 | 
			
		||||
	atomic_t		m_agirotor;	/* last ag dir inode alloced */
 | 
			
		||||
 | 
			
		||||
	/* Memory shrinker to throttle and reprioritize inodegc */
 | 
			
		||||
	struct shrinker		m_inodegc_shrinker;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1922,7 +1922,6 @@ static int xfs_init_fs_context(
 | 
			
		|||
		return -ENOMEM;
 | 
			
		||||
 | 
			
		||||
	spin_lock_init(&mp->m_sb_lock);
 | 
			
		||||
	spin_lock_init(&mp->m_agirotor_lock);
 | 
			
		||||
	INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC);
 | 
			
		||||
	spin_lock_init(&mp->m_perag_lock);
 | 
			
		||||
	mutex_init(&mp->m_growlock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue