Re: [PATCH] xfs: update BDI {io,ra}_pages values based on the RT device limits
Carlos Maiolino <[email protected]>
| Newsgroups | org.kernel.vger.linux-xfs,org.kernel.vger.linux-fsdevel |
|---|---|
| Message-ID | <[email protected]> |
On Mon, Jul 20, 2026 at 04:08:47PM +0200, Christoph Hellwig wrote: > When using XFS with a main device on an SSD that stores metadata and a RT > device to store data on a HDD, we fail to take the I/O sizes for the RT > device into accounting, leading to up to 5% slower read performance when > using an SSD for metadata vs storing data and metadata on the HDD. > > Fix this up by taking the RT settings into account at mount an restoring > the old settings at unmount time, unless the BDI settings have changed > from those set by XFS. > > Reported-by: Filip Blagojevic <[email protected]> > Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Carlos Maiolino <[email protected]> > --- > fs/xfs/xfs_mount.h | 7 ++++++ > fs/xfs/xfs_super.c | 53 +++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 59 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 66a02d1b9ad7..216a38a354e7 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -349,6 +349,13 @@ typedef struct xfs_mount { > > /* Index of uuid record in the uuid xarray. */ > unsigned int m_uuid_table_index; > + > + /* > + * Old io_pages/ra_pages valued in the main bdev BDI, and our initial > + * calculated values. > + */ > + unsigned long m_old_io_pages, m_initial_io_pages; > + unsigned long m_old_ra_pages, m_initial_ra_pages; > } xfs_mount_t; > > #define M_IGEO(mp) (&(mp)->m_ino_geo) > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 8531d526fc44..63c4bcbe6c2b 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -548,6 +548,52 @@ xfs_open_devices( > return error; > } > > +/* > + * When using a RT device some or all data I/O is using the RT device, but > + * the BDI is inherited from the main data device. When the underlying block > + * device for the RT device has larger I/O sizes, the BDI settings might be > + * incorrect, which is especially bad if the main device is a SSD and the > + * RT device is a HDD, as the io_opt fixup in blk_apply_bdi_limits is missing > + * for this case. > + * > + * Update the BDI values to the max of the data and RT device to cover our > + * bases. > + */ > +static void > +xfs_update_bdi_rahead( > + struct xfs_mount *mp) > +{ > + struct backing_dev_info *rt_bdi = > + mp->m_rtdev_targp->bt_bdev->bd_disk->bdi; > + struct backing_dev_info *sb_bdi = mp->m_super->s_bdi; > + > + mp->m_old_io_pages = sb_bdi->io_pages; > + mp->m_old_ra_pages = sb_bdi->ra_pages; > + > + sb_bdi->io_pages = mp->m_initial_io_pages = > + max(sb_bdi->io_pages, rt_bdi->io_pages); > + sb_bdi->ra_pages = mp->m_initial_ra_pages = > + max(sb_bdi->ra_pages, rt_bdi->ra_pages); > +} > + > +static void > +xfs_restore_bdi_rahead( > + struct xfs_mount *mp) > +{ > + struct backing_dev_info *sb_bdi = mp->m_super->s_bdi; > + > + if (sb_bdi->io_pages == mp->m_initial_io_pages) > + sb_bdi->io_pages = mp->m_old_io_pages; > + else > + xfs_info(mp, "io_pages changed from %lu to %lu, not restoring.", > + mp->m_initial_io_pages, sb_bdi->io_pages); > + if (sb_bdi->ra_pages == mp->m_initial_ra_pages) > + sb_bdi->ra_pages = mp->m_old_ra_pages; > + else > + xfs_info(mp, "ra_pages changed from %lu to %lu, not restoring.", > + mp->m_initial_ra_pages, sb_bdi->ra_pages); > +} > + > /* > * Setup xfs_mount buffer target pointers based on superblock > */ > @@ -585,6 +631,7 @@ xfs_setup_devices( > mp->m_sb.sb_sectsize, mp->m_sb.sb_rblocks); > if (error) > return error; > + xfs_update_bdi_rahead(mp); > } > > return 0; > @@ -2283,8 +2330,12 @@ static void > xfs_kill_sb( > struct super_block *sb) > { > + struct xfs_mount *mp = XFS_M(sb); > + > + if (mp->m_rtdev_targp && mp->m_rtdev_targp != mp->m_ddev_targp) > + xfs_restore_bdi_rahead(mp); > kill_block_super(sb); > - xfs_mount_free(XFS_M(sb)); > + xfs_mount_free(mp); > } > > static struct file_system_type xfs_fs_type = { > -- > 2.53.0 > >