mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-07 13:53:24 +00:00
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
@ -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 New Issue
Block a user