Re: [PATCH] xfs: avoid double deferrals for RWF_DONTCACHE writes

"Darrick J. Wong" <[email protected]>
Newsgroups org.kernel.vger.linux-kernel,org.kernel.vger.linux-block,org.kernel.vger.linux-xfs
Message-ID <20260810183341.GZ3556460@frogsfrogsfrogs>
On Mon, Aug 10, 2026 at 12:39:19PM -0400, Tal Zussman wrote:
> XFS already defers some writes to a workqueue when transactions are
> needed to process the I/O completion. Disable the block layer bio task
> completion in this case to avoid a major performance drop.
> 
> Fixes: efbde6f9f449 ("iomap: use BIO_COMPLETE_IN_TASK for dropbehind writeback")

What commit is this?

(If we're fixing something that's not in Linus' tree then I think the
fixes tags aren't required)

> Link: https://lore.kernel.org/all/[email protected]/
> Signed-off-by: Tal Zussman <[email protected]>
> ---
> Follow-up fix for the RWF_DONTCACHE task-completion series. This is
> targeting the block tree. [1]
> 
> [1]: https://lore.kernel.org/linux-block/[email protected]/
> ---
>  fs/xfs/xfs_aops.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
> index cd8de8c82d78..74a6089abadf 100644
> --- a/fs/xfs/xfs_aops.c
> +++ b/fs/xfs/xfs_aops.c
> @@ -549,10 +549,14 @@ xfs_writeback_submit(
>  	}
>  
>  	/*
> -	 * Send ioends that might require a transaction to the completion wq.
> +	 * Send ioends that might require a transaction to the completion wq,
> +	 * and disable the block layer task completion for them as there is no
> +	 * need to defer twice.
>  	 */
> -	if (xfs_ioend_needs_wq_completion(ioend))
> +	if (xfs_ioend_needs_wq_completion(ioend)) {
>  		ioend->io_bio.bi_end_io = xfs_end_bio;
> +		bio_clear_flag(&ioend->io_bio, BIO_COMPLETE_IN_TASK);
> +	}
>  
>  	return iomap_ioend_writeback_submit(wpc, error);
>  }
> @@ -663,7 +667,14 @@ xfs_zoned_writeback_submit(
>  {
>  	struct iomap_ioend		*ioend = wpc->wb_ctx;
>  
> +	/*
> +	 * Defer all completions to our workqueue as all zoned writes require a
> +	 * transaction to be persisted. This also means we never need the block
> +	 * layer in-task completion for a task context.
> +	 */
>  	ioend->io_bio.bi_end_io = xfs_end_bio;
> +	bio_clear_flag(&ioend->io_bio, BIO_COMPLETE_IN_TASK);

This makes sense to me;
Reviewed-by: "Darrick J. Wong" <[email protected]>

--D

> +
>  	if (error) {
>  		ioend->io_bio.bi_status = errno_to_blk_status(error);
>  		bio_endio(&ioend->io_bio);
> 
> ---
> base-commit: 30df3ab3c92d0e7854c54df6ae66f4aa6eb5b3d2
> change-id: 20260810-xfs-dontcache-double-defer-ae3fa50ba02c
> 
> Best regards,
> -- 
> Tal Zussman <[email protected]>
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.