From: "Darrick J. Wong" <djwong@kernel.org>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 4/9] xfs: kill XBF_UNMAPPED
Date: Tue, 19 Mar 2024 10:30:46 -0700 [thread overview]
Message-ID: <20240319173046.GQ1927156@frogsfrogsfrogs> (raw)
In-Reply-To: <20240318224715.3367463-5-david@fromorbit.com>
On Tue, Mar 19, 2024 at 09:45:55AM +1100, Dave Chinner wrote:
> From: Christoph Hellwig <hch@lst.de>
>
> Unmapped buffer access is a pain, so kill it. The switch to large
> folios means we rarely pay a vmap penalty for large buffers,
> so this functionality is largely unnecessary now.
What was the original point of unmapped buffers? Was it optimizing for
not using vmalloc space for inode buffers on 32-bit machines?
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> fs/xfs/libxfs/xfs_ialloc.c | 2 +-
> fs/xfs/libxfs/xfs_inode_buf.c | 2 +-
> fs/xfs/scrub/inode_repair.c | 3 +-
> fs/xfs/xfs_buf.c | 62 ++---------------------------------
> fs/xfs/xfs_buf.h | 16 ++++++---
> fs/xfs/xfs_buf_item.c | 2 +-
> fs/xfs/xfs_buf_item_recover.c | 8 +----
> fs/xfs/xfs_inode.c | 3 +-
> 8 files changed, 19 insertions(+), 79 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c
> index e5ac3e5430c4..fa27a50f96ac 100644
> --- a/fs/xfs/libxfs/xfs_ialloc.c
> +++ b/fs/xfs/libxfs/xfs_ialloc.c
> @@ -362,7 +362,7 @@ xfs_ialloc_inode_init(
> (j * M_IGEO(mp)->blocks_per_cluster));
> error = xfs_trans_get_buf(tp, mp->m_ddev_targp, d,
> mp->m_bsize * M_IGEO(mp)->blocks_per_cluster,
> - XBF_UNMAPPED, &fbuf);
> + 0, &fbuf);
> if (error)
> return error;
>
> diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c
> index d0dcce462bf4..68989f4bf793 100644
> --- a/fs/xfs/libxfs/xfs_inode_buf.c
> +++ b/fs/xfs/libxfs/xfs_inode_buf.c
> @@ -136,7 +136,7 @@ xfs_imap_to_bp(
> int error;
>
> error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
> - imap->im_len, XBF_UNMAPPED, bpp, &xfs_inode_buf_ops);
> + imap->im_len, 0, bpp, &xfs_inode_buf_ops);
> if (xfs_metadata_is_sick(error))
> xfs_agno_mark_sick(mp, xfs_daddr_to_agno(mp, imap->im_blkno),
> XFS_SICK_AG_INODES);
> diff --git a/fs/xfs/scrub/inode_repair.c b/fs/xfs/scrub/inode_repair.c
> index eab380e95ef4..7b31f1ad194f 100644
> --- a/fs/xfs/scrub/inode_repair.c
> +++ b/fs/xfs/scrub/inode_repair.c
> @@ -1309,8 +1309,7 @@ xrep_dinode_core(
>
> /* Read the inode cluster buffer. */
> error = xfs_trans_read_buf(sc->mp, sc->tp, sc->mp->m_ddev_targp,
> - ri->imap.im_blkno, ri->imap.im_len, XBF_UNMAPPED, &bp,
> - NULL);
> + ri->imap.im_blkno, ri->imap.im_len, 0, &bp, NULL);
> if (error)
> return error;
>
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index 7d9303497763..2cd3671f3ce3 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -239,7 +239,7 @@ _xfs_buf_alloc(
> * We don't want certain flags to appear in b_flags unless they are
> * specifically set by later operations on the buffer.
> */
> - flags &= ~(XBF_UNMAPPED | XBF_TRYLOCK | XBF_ASYNC | XBF_READ_AHEAD);
> + flags &= ~(XBF_TRYLOCK | XBF_ASYNC | XBF_READ_AHEAD);
>
> atomic_set(&bp->b_hold, 1);
> atomic_set(&bp->b_lru_ref, 1);
> @@ -403,9 +403,7 @@ xfs_buf_alloc_folio(
> *
> * The second type of buffer is the multi-folio buffer. These are *always* made
> * up of single page folios so that they can be fed to vmap_ram() to return a
> - * contiguous memory region we can access the data through, or mark it as
> - * XBF_UNMAPPED and access the data directly through individual folio_address()
> - * calls.
> + * contiguous memory region we can access the data through.
> *
> * We don't use high order folios for this second type of buffer (yet) because
> * having variable size folios makes offset-to-folio indexing and iteration of
> @@ -486,8 +484,6 @@ _xfs_buf_map_folios(
> if (bp->b_folio_count == 1) {
> /* A single folio buffer is always mappable */
> bp->b_addr = folio_address(bp->b_folios[0]);
> - } else if (flags & XBF_UNMAPPED) {
> - bp->b_addr = NULL;
> } else {
> int retried = 0;
> unsigned nofs_flag;
> @@ -1844,60 +1840,6 @@ __xfs_buf_submit(
> return error;
> }
>
> -void *
> -xfs_buf_offset(
> - struct xfs_buf *bp,
> - size_t offset)
> -{
> - struct folio *folio;
> -
> - if (bp->b_addr)
> - return bp->b_addr + offset;
> -
> - /* Single folio buffers may use large folios. */
> - if (bp->b_folio_count == 1) {
> - folio = bp->b_folios[0];
> - return folio_address(folio) + offset_in_folio(folio, offset);
> - }
> -
> - /* Multi-folio buffers always use PAGE_SIZE folios */
> - folio = bp->b_folios[offset >> PAGE_SHIFT];
> - return folio_address(folio) + (offset & (PAGE_SIZE-1));
> -}
> -
> -void
> -xfs_buf_zero(
> - struct xfs_buf *bp,
> - size_t boff,
> - size_t bsize)
> -{
> - size_t bend;
> -
> - bend = boff + bsize;
> - while (boff < bend) {
> - struct folio *folio;
> - int folio_index, folio_offset, csize;
> -
> - /* Single folio buffers may use large folios. */
> - if (bp->b_folio_count == 1) {
> - folio = bp->b_folios[0];
> - folio_offset = offset_in_folio(folio,
> - bp->b_offset + boff);
> - } else {
> - folio_index = (boff + bp->b_offset) >> PAGE_SHIFT;
> - folio_offset = (boff + bp->b_offset) & ~PAGE_MASK;
> - folio = bp->b_folios[folio_index];
> - }
> -
> - csize = min_t(size_t, folio_size(folio) - folio_offset,
> - BBTOB(bp->b_length) - boff);
> - ASSERT((csize + folio_offset) <= folio_size(folio));
> -
> - memset(folio_address(folio) + folio_offset, 0, csize);
> - boff += csize;
> - }
> -}
> -
> /*
> * Log a message about and stale a buffer that a caller has decided is corrupt.
> *
> diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
> index f059ae3d2755..aef7015cf9f3 100644
> --- a/fs/xfs/xfs_buf.h
> +++ b/fs/xfs/xfs_buf.h
> @@ -51,7 +51,6 @@ struct xfs_buf;
> #define XBF_LIVESCAN (1u << 28)
> #define XBF_INCORE (1u << 29)/* lookup only, return if found in cache */
> #define XBF_TRYLOCK (1u << 30)/* lock requested, but do not wait */
> -#define XBF_UNMAPPED (1u << 31)/* do not map the buffer */
>
>
> typedef unsigned int xfs_buf_flags_t;
> @@ -74,8 +73,7 @@ typedef unsigned int xfs_buf_flags_t;
> /* The following interface flags should never be set */ \
> { XBF_LIVESCAN, "LIVESCAN" }, \
> { XBF_INCORE, "INCORE" }, \
> - { XBF_TRYLOCK, "TRYLOCK" }, \
> - { XBF_UNMAPPED, "UNMAPPED" }
> + { XBF_TRYLOCK, "TRYLOCK" }
>
> /*
> * Internal state flags.
> @@ -320,12 +318,20 @@ extern void __xfs_buf_ioerror(struct xfs_buf *bp, int error,
> #define xfs_buf_ioerror(bp, err) __xfs_buf_ioerror((bp), (err), __this_address)
> extern void xfs_buf_ioerror_alert(struct xfs_buf *bp, xfs_failaddr_t fa);
> void xfs_buf_ioend_fail(struct xfs_buf *);
> -void xfs_buf_zero(struct xfs_buf *bp, size_t boff, size_t bsize);
> void __xfs_buf_mark_corrupt(struct xfs_buf *bp, xfs_failaddr_t fa);
> #define xfs_buf_mark_corrupt(bp) __xfs_buf_mark_corrupt((bp), __this_address)
>
> /* Buffer Utility Routines */
> -extern void *xfs_buf_offset(struct xfs_buf *, size_t);
> +static inline void *xfs_buf_offset(struct xfs_buf *bp, size_t offset)
> +{
> + return bp->b_addr + offset;
> +}
> +
> +static inline void xfs_buf_zero(struct xfs_buf *bp, size_t boff, size_t bsize)
> +{
> + memset(bp->b_addr + boff, 0, bsize);
> +}
> +
> extern void xfs_buf_stale(struct xfs_buf *bp);
>
> /* Delayed Write Buffer Routines */
> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
> index d1407cee48d9..7b66d3fe4ecd 100644
> --- a/fs/xfs/xfs_buf_item.c
> +++ b/fs/xfs/xfs_buf_item.c
> @@ -69,7 +69,7 @@ xfs_buf_item_straddle(
> {
> void *first, *last;
>
> - if (bp->b_folio_count == 1 || !(bp->b_flags & XBF_UNMAPPED))
> + if (bp->b_folio_count == 1)
> return false;
>
> first = xfs_buf_offset(bp, offset + (first_bit << XFS_BLF_SHIFT));
> diff --git a/fs/xfs/xfs_buf_item_recover.c b/fs/xfs/xfs_buf_item_recover.c
> index 09e893cf563c..d74bf7bb7794 100644
> --- a/fs/xfs/xfs_buf_item_recover.c
> +++ b/fs/xfs/xfs_buf_item_recover.c
> @@ -891,7 +891,6 @@ xlog_recover_buf_commit_pass2(
> struct xfs_mount *mp = log->l_mp;
> struct xfs_buf *bp;
> int error;
> - uint buf_flags;
> xfs_lsn_t lsn;
>
> /*
> @@ -910,13 +909,8 @@ xlog_recover_buf_commit_pass2(
> }
>
> trace_xfs_log_recover_buf_recover(log, buf_f);
> -
> - buf_flags = 0;
> - if (buf_f->blf_flags & XFS_BLF_INODE_BUF)
> - buf_flags |= XBF_UNMAPPED;
> -
> error = xfs_buf_read(mp->m_ddev_targp, buf_f->blf_blkno, buf_f->blf_len,
> - buf_flags, &bp, NULL);
> + 0, &bp, NULL);
> if (error)
> return error;
>
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index ea48774f6b76..e7a724270423 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -2405,8 +2405,7 @@ xfs_ifree_cluster(
> * to mark all the active inodes on the buffer stale.
> */
> error = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno,
> - mp->m_bsize * igeo->blocks_per_cluster,
> - XBF_UNMAPPED, &bp);
> + mp->m_bsize * igeo->blocks_per_cluster, 0, &bp);
> if (error)
> return error;
>
> --
> 2.43.0
>
>
next prev parent reply other threads:[~2024-03-19 17:30 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-18 22:45 [PATCH v2 0/9] xfs: use large folios for buffers Dave Chinner
2024-03-18 22:45 ` [PATCH 1/9] xfs: unmapped buffer item size straddling mismatch Dave Chinner
2024-03-18 22:45 ` [PATCH 2/9] xfs: use folios in the buffer cache Dave Chinner
2024-03-19 6:38 ` Christoph Hellwig
2024-03-19 6:52 ` Dave Chinner
2024-03-19 6:53 ` Christoph Hellwig
2024-03-19 21:42 ` Dave Chinner
2024-03-19 21:42 ` Dave Chinner
2024-03-19 17:15 ` Darrick J. Wong
2024-03-18 22:45 ` [PATCH 3/9] xfs: convert buffer cache to use high order folios Dave Chinner
2024-03-19 6:55 ` Christoph Hellwig
2024-03-19 17:29 ` Darrick J. Wong
2024-03-19 21:32 ` Christoph Hellwig
2024-03-19 21:38 ` Darrick J. Wong
2024-03-19 21:41 ` Christoph Hellwig
2024-03-19 22:23 ` Dave Chinner
2024-03-21 2:12 ` Darrick J. Wong
2024-03-21 2:40 ` Darrick J. Wong
2024-03-21 21:28 ` Christoph Hellwig
2024-03-21 21:39 ` Darrick J. Wong
2024-03-21 22:02 ` Christoph Hellwig
2024-03-19 21:55 ` Dave Chinner
2024-03-22 8:02 ` Pankaj Raghav (Samsung)
2024-03-22 22:04 ` Dave Chinner
2024-03-25 11:17 ` Pankaj Raghav (Samsung)
2024-03-18 22:45 ` [PATCH 4/9] xfs: kill XBF_UNMAPPED Dave Chinner
2024-03-19 17:30 ` Darrick J. Wong [this message]
2024-03-19 23:36 ` Dave Chinner
2024-03-18 22:45 ` [PATCH 5/9] xfs: buffer items don't straddle pages anymore Dave Chinner
2024-03-19 6:56 ` Christoph Hellwig
2024-03-19 17:31 ` Darrick J. Wong
2024-03-18 22:45 ` [PATCH 6/9] xfs: map buffers in xfs_buf_alloc_folios Dave Chinner
2024-03-19 17:34 ` Darrick J. Wong
2024-03-19 21:32 ` Christoph Hellwig
2024-03-19 21:39 ` Darrick J. Wong
2024-03-19 21:41 ` Christoph Hellwig
2024-03-18 22:45 ` [PATCH 7/9] xfs: walk b_addr for buffer I/O Dave Chinner
2024-03-19 17:42 ` Darrick J. Wong
2024-03-19 21:33 ` Christoph Hellwig
2024-03-18 22:45 ` [PATCH 8/9] xfs: use vmalloc for multi-folio buffers Dave Chinner
2024-03-19 17:48 ` Darrick J. Wong
2024-03-20 0:20 ` Dave Chinner
2024-03-18 22:46 ` [PATCH 9/9] xfs: rename bp->b_folio_count Dave Chinner
2024-03-19 7:37 ` Christoph Hellwig
2024-03-19 23:59 ` Dave Chinner
2024-03-19 0:24 ` [PATCH v2 0/9] xfs: use large folios for buffers Christoph Hellwig
2024-03-19 0:44 ` Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240319173046.GQ1927156@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=david@fromorbit.com \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox