]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: convert perag lookup to xarray
authorChristoph Hellwig <hch@lst.de>
Mon, 21 Oct 2024 00:10:45 +0000 (17:10 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 31 Oct 2024 22:45:03 +0000 (15:45 -0700)
Source kernel commit: 32fa4059fe6776d7db1e9058f360e06b36c9f2ce

Convert the perag lookup from the legacy radix tree to the xarray,
which allows for much nicer iteration and bulk lookup semantics.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
include/xfs_mount.h
libxfs/init.c
libxfs/xfs_ag.c

index 7571df12fba3f80082414b63fe2e1241c50df346..e2add8a648f88754cd58c7af205e281e9ab86338 100644 (file)
@@ -91,7 +91,7 @@ typedef struct xfs_mount {
        xfs_extlen_t            m_ag_prealloc_blocks; /* reserved ag blocks */
        uint                    m_alloc_set_aside; /* space we can't use */
        uint                    m_ag_max_usable; /* max space per AG */
-       struct radix_tree_root  m_perag_tree;
+       struct xarray           m_perags;
        uint64_t                m_features;     /* active filesystem features */
        uint64_t                m_low_space[XFS_LOWSP_MAX];
        uint64_t                m_rtxblkmask;   /* rt extent block mask */
index 6ab5ef54bb69cb59df75cddddcf960dc30be8322..1e45f091dbb5bfb23b8a1812d8178af49aa2d11d 100644 (file)
@@ -662,7 +662,7 @@ libxfs_mount(
        mp->m_finobt_nores = true;
        xfs_set_inode32(mp);
        mp->m_sb = *sb;
-       INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL);
+       xa_init(&mp->m_perags);
        sbp = &mp->m_sb;
        spin_lock_init(&mp->m_sb_lock);
        spin_lock_init(&mp->m_agirotor_lock);
index a63d9c0dc6fe44a53ff0c9213f6cc6e136d7c497..516c76790cc0d8e0daedc69a5e47dd6a96e9144d 100644 (file)
@@ -44,7 +44,7 @@ xfs_perag_get(
        struct xfs_perag        *pag;
 
        rcu_read_lock();
-       pag = radix_tree_lookup(&mp->m_perag_tree, agno);
+       pag = xa_load(&mp->m_perags, agno);
        if (pag) {
                trace_xfs_perag_get(pag, _RET_IP_);
                ASSERT(atomic_read(&pag->pag_ref) >= 0);
@@ -90,7 +90,7 @@ xfs_perag_grab(
        struct xfs_perag        *pag;
 
        rcu_read_lock();
-       pag = radix_tree_lookup(&mp->m_perag_tree, agno);
+       pag = xa_load(&mp->m_perags, agno);
        if (pag) {
                trace_xfs_perag_grab(pag, _RET_IP_);
                if (!atomic_inc_not_zero(&pag->pag_active_ref))
@@ -193,9 +193,7 @@ xfs_free_perag(
        xfs_agnumber_t          agno;
 
        for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
-               spin_lock(&mp->m_perag_lock);
-               pag = radix_tree_delete(&mp->m_perag_tree, agno);
-               spin_unlock(&mp->m_perag_lock);
+               pag = xa_erase(&mp->m_perags, agno);
                ASSERT(pag);
                XFS_IS_CORRUPT(pag->pag_mount, atomic_read(&pag->pag_ref) != 0);
                xfs_defer_drain_free(&pag->pag_intents_drain);
@@ -284,9 +282,7 @@ xfs_free_unused_perag_range(
        xfs_agnumber_t          index;
 
        for (index = agstart; index < agend; index++) {
-               spin_lock(&mp->m_perag_lock);
-               pag = radix_tree_delete(&mp->m_perag_tree, index);
-               spin_unlock(&mp->m_perag_lock);
+               pag = xa_erase(&mp->m_perags, index);
                if (!pag)
                        break;
                xfs_buf_cache_destroy(&pag->pag_bcache);
@@ -327,20 +323,11 @@ xfs_initialize_perag(
                pag->pag_agno = index;
                pag->pag_mount = mp;
 
-               error = radix_tree_preload(GFP_KERNEL | __GFP_RETRY_MAYFAIL);
-               if (error)
-                       goto out_free_pag;
-
-               spin_lock(&mp->m_perag_lock);
-               if (radix_tree_insert(&mp->m_perag_tree, index, pag)) {
-                       WARN_ON_ONCE(1);
-                       spin_unlock(&mp->m_perag_lock);
-                       radix_tree_preload_end();
-                       error = -EEXIST;
+               error = xa_insert(&mp->m_perags, index, pag, GFP_KERNEL);
+               if (error) {
+                       WARN_ON_ONCE(error == -EBUSY);
                        goto out_free_pag;
                }
-               spin_unlock(&mp->m_perag_lock);
-               radix_tree_preload_end();
 
 #ifdef __KERNEL__
                /* Place kernel structure only init below this point. */
@@ -388,9 +375,7 @@ xfs_initialize_perag(
 
 out_remove_pag:
        xfs_defer_drain_free(&pag->pag_intents_drain);
-       spin_lock(&mp->m_perag_lock);
-       radix_tree_delete(&mp->m_perag_tree, index);
-       spin_unlock(&mp->m_perag_lock);
+       pag = xa_erase(&mp->m_perags, index);
 out_free_pag:
        kfree(pag);
 out_unwind_new_pags: