linux/fs/xfs/libxfs
Dave Chinner 89b1f55a29 xfs: collapse AG selection for inode allocation
xfs_dialloc_select_ag() does a lot of repetitive work. It first
calls xfs_ialloc_ag_select() to select the AG to start allocation
attempts in, which can do up to two entire loops across the perags
that inodes can be allocated in. This is simply checking if there is
spce available to allocate inodes in an AG, and it returns when it
finds the first candidate AG.

xfs_dialloc_select_ag() then does it's own iterative walk across
all the perags locking the AGIs and trying to allocate inodes from
the locked AG. It also doesn't limit the search to mp->m_maxagi,
so it will walk all AGs whether they can allocate inodes or not.

Hence if we are really low on inodes, we could do almost 3 entire
walks across the whole perag range before we find an allocation
group we can allocate inodes in or report ENOSPC.

Because xfs_ialloc_ag_select() returns on the first candidate AG it
finds, we can simply do these checks directly in
xfs_dialloc_select_ag() before we lock and try to allocate inodes.
This reduces the inode allocation pass down to 2 perag sweeps at
most - one for aligned inode cluster allocation and if we can't
allocate full, aligned inode clusters anywhere we'll do another pass
trying to do sparse inode cluster allocation.

This also removes a big chunk of duplicate code.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
2021-06-02 10:48:24 +10:00
..
xfs_ag_resv.c xfs: push perags through the ag reservation callouts 2021-06-02 10:48:24 +10:00
xfs_ag_resv.h xfs: move perag structure and setup to libxfs/xfs_ag.[ch] 2021-06-02 10:48:24 +10:00
xfs_ag.c xfs: convert rmap btree cursor to using a perag 2021-06-02 10:48:24 +10:00
xfs_ag.h xfs: pass perags around in fsmap data dev functions 2021-06-02 10:48:24 +10:00
xfs_alloc_btree.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_alloc_btree.h xfs: convert allocbt cursors to use perags 2021-06-02 10:48:24 +10:00
xfs_alloc.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_alloc.h xfs: pass perags through to the busy extent code 2021-06-02 10:48:24 +10:00
xfs_attr_leaf.c xfs: move xfs_perag_get/put to xfs_ag.[ch] 2021-06-02 10:48:24 +10:00
xfs_attr_leaf.h xfs: Add xfs_has_attr and subroutines 2020-07-28 20:24:14 -07:00
xfs_attr_remote.c xfs: remove the redundant crc feature check in xfs_attr3_rmt_verify 2020-09-25 11:34:07 -07:00
xfs_attr_remote.h xfs: Refactor xfs_attr_rmtval_remove 2020-07-28 20:28:11 -07:00
xfs_attr_sf.h xfs: Convert xfs_attr_sf macros to inline functions 2020-09-15 20:52:42 -07:00
xfs_attr.c xfs: remove XFS_IFINLINE 2021-04-15 09:35:51 -07:00
xfs_attr.h xfs: rename and simplify xfs_bmap_one_block 2021-04-15 09:35:50 -07:00
xfs_bit.c xfs: fix missing header includes 2019-11-07 13:00:53 -08:00
xfs_bit.h xfs: Use the correct style for SPDX License Identifier 2020-05-13 15:32:45 -07:00
xfs_bmap_btree.c xfs: move the di_flags field to struct xfs_inode 2021-04-07 14:37:05 -07:00
xfs_bmap_btree.h xfs: Use the correct style for SPDX License Identifier 2020-05-13 15:32:45 -07:00
xfs_bmap.c xfs: move xfs_perag_get/put to xfs_ag.[ch] 2021-06-02 10:48:24 +10:00
xfs_bmap.h xfs: rename and simplify xfs_bmap_one_block 2021-04-15 09:35:50 -07:00
xfs_btree_staging.c xfs: remove XFS_IFBROOT 2021-04-15 09:35:51 -07:00
xfs_btree_staging.h xfs: xfs_btree_staging.h: delete duplicated words 2020-07-28 20:24:14 -07:00
xfs_btree.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_btree.h xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_cksum.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xfs_da_btree.c xfs: move the di_nblocks field to struct xfs_inode 2021-04-07 14:37:03 -07:00
xfs_da_btree.h xfs: Refactor xfs_da_state_alloc() helper 2020-07-28 20:24:14 -07:00
xfs_da_format.h xfs: code cleanup in xfs_attr_leaf_entsize_{remote,local} 2020-09-25 11:34:08 -07:00
xfs_defer.c xfs: only relog deferred intent items if free space in the log gets low 2020-10-07 08:40:29 -07:00
xfs_defer.h xfs: fix an incore inode UAF in xfs_bui_recover 2020-10-07 08:40:28 -07:00
xfs_dir2_block.c xfs: remove XFS_IFINLINE 2021-04-15 09:35:51 -07:00
xfs_dir2_data.c xfs: No need for inode number error injection in __xfs_dir3_data_check 2021-03-25 16:47:51 -07:00
xfs_dir2_leaf.c xfs: move the di_size field to struct xfs_inode 2021-04-07 14:37:03 -07:00
xfs_dir2_node.c xfs: move the di_size field to struct xfs_inode 2021-04-07 14:37:03 -07:00
xfs_dir2_priv.h xfs: reduce debug overhead of dir leaf/node checks 2021-03-25 16:47:51 -07:00
xfs_dir2_sf.c xfs: remove XFS_IFEXTENTS 2021-04-15 09:35:51 -07:00
xfs_dir2.c xfs: move the di_size field to struct xfs_inode 2021-04-07 14:37:03 -07:00
xfs_dir2.h xfs: fix an ABBA deadlock in xfs_rename 2021-01-22 16:54:43 -08:00
xfs_dquot_buf.c xfs: widen ondisk quota expiration timestamps to handle y2038+ 2020-09-15 20:52:41 -07:00
xfs_errortag.h xfs: add error injection for per-AG resv failure 2021-03-25 16:47:53 -07:00
xfs_format.h xfs: move the di_crtime field to struct xfs_inode 2021-04-07 14:37:05 -07:00
xfs_fs.h New code for 5.13: 2021-04-29 10:43:51 -07:00
xfs_health.h xfs: Use the correct style for SPDX License Identifier 2020-05-13 15:32:45 -07:00
xfs_ialloc_btree.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_ialloc_btree.h xfs: use perag for ialloc btree cursors 2021-06-02 10:48:24 +10:00
xfs_ialloc.c xfs: collapse AG selection for inode allocation 2021-06-02 10:48:24 +10:00
xfs_ialloc.h xfs: spilt xfs_dialloc() into 2 functions 2020-12-12 10:48:25 -08:00
xfs_iext_tree.c xfs: prevent metadata files from being inactivated 2021-03-25 16:47:50 -07:00
xfs_inode_buf.c xfs: move the di_crtime field to struct xfs_inode 2021-04-07 14:37:05 -07:00
xfs_inode_buf.h xfs: move the di_crtime field to struct xfs_inode 2021-04-07 14:37:05 -07:00
xfs_inode_fork.c xfs: remove XFS_IFEXTENTS 2021-04-15 09:35:51 -07:00
xfs_inode_fork.h xfs: remove XFS_IFEXTENTS 2021-04-15 09:35:51 -07:00
xfs_log_format.h xfs: rename struct xfs_legacy_ictimestamp 2021-04-22 18:29:25 -07:00
xfs_log_recover.h xfs: remove xlog_recover_iodone 2020-09-15 20:52:39 -07:00
xfs_log_rlimit.c xfs: remove unused header files 2019-06-28 19:30:43 -07:00
xfs_quota_defs.h xfs: widen ondisk quota expiration timestamps to handle y2038+ 2020-09-15 20:52:41 -07:00
xfs_refcount_btree.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_refcount_btree.h xfs: convert refcount btree cursor to use perags 2021-06-02 10:48:24 +10:00
xfs_refcount.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_refcount.h xfs: convert refcount btree cursor to use perags 2021-06-02 10:48:24 +10:00
xfs_rmap_btree.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_rmap_btree.h xfs: convert rmap btree cursor to using a perag 2021-06-02 10:48:24 +10:00
xfs_rmap.c xfs: remove agno from btree cursor 2021-06-02 10:48:24 +10:00
xfs_rmap.h xfs: convert rmap btree cursor to using a perag 2021-06-02 10:48:24 +10:00
xfs_rtbitmap.c xfs: move the di_flags field to struct xfs_inode 2021-04-07 14:37:05 -07:00
xfs_sb.c xfs: convert secondary superblock walk to use perags 2021-06-02 10:48:24 +10:00
xfs_sb.h xfs: move xfs_perag_get/put to xfs_ag.[ch] 2021-06-02 10:48:24 +10:00
xfs_shared.h xfs: precalculate default inode attribute offset 2021-04-07 14:37:07 -07:00
xfs_symlink_remote.c xfs: move the fork format fields into struct xfs_ifork 2020-05-19 09:40:58 -07:00
xfs_trans_inode.c xfs: move the di_crtime field to struct xfs_inode 2021-04-07 14:37:05 -07:00
xfs_trans_resv.c xfs: add a new xfs_sb_version_has_v3inode helper 2020-03-19 08:47:34 -07:00
xfs_trans_resv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_space.h xfs: fix off-by-one in inode alloc block reservation calculation 2020-08-26 14:13:21 -07:00
xfs_types.c xfs: convert raw ag walks to use for_each_perag 2021-06-02 10:48:24 +10:00
xfs_types.h xfs: refactor file range validation 2020-12-09 09:49:38 -08:00