OSDN Git Service

xfs: convert xfs_ialloc_next_ag() to an atomic
authorDave Chinner <dchinner@redhat.com>
Sun, 12 Feb 2023 22:14:52 +0000 (09:14 +1100)
committerDave Chinner <dchinner@redhat.com>
Sun, 12 Feb 2023 22:14:52 +0000 (09:14 +1100)
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>
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_sb.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_super.c

index c8b31c0..86b7adc 100644 (file)
@@ -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)
index 1eeecf2..99cc03a 100644 (file)
@@ -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;
index 8aca2cc..f3269c0 100644 (file)
@@ -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;
index 0c4b73e..96375b5 100644 (file)
@@ -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);