public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: John Garry <john.g.garry@oracle.com>
Cc: chandan.babu@oracle.com, dchinner@redhat.com, hch@lst.de,
	viro@zeniv.linux.org.uk, brauner@kernel.org, jack@suse.cz,
	linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, catherine.hoang@oracle.com,
	martin.petersen@oracle.com
Subject: Re: [PATCH 05/13] xfs: introduce forced allocation alignment
Date: Fri, 21 Jun 2024 13:37:02 -0700	[thread overview]
Message-ID: <20240621203702.GV3058325@frogsfrogsfrogs> (raw)
In-Reply-To: <20240621100540.2976618-6-john.g.garry@oracle.com>

On Fri, Jun 21, 2024 at 10:05:32AM +0000, John Garry wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> When forced allocation alignment is specified, the extent will
> be aligned to the extent size hint size rather than stripe
> alignment. If aligned allocation cannot be done, then the allocation
> is failed rather than attempting non-aligned fallbacks.
> 
> Note: none of the per-inode force align configuration is present
> yet, so this just triggers off an "always false" wrapper function
> for the moment.
> 
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> Signed-off-by: John Garry <john.g.garry@oracle.com>

Pretty straightfoward!
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  fs/xfs/libxfs/xfs_alloc.h |  1 +
>  fs/xfs/libxfs/xfs_bmap.c  | 29 +++++++++++++++++++++++------
>  fs/xfs/xfs_inode.h        |  5 +++++
>  3 files changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h
> index aa2c103d98f0..7de2e6f64882 100644
> --- a/fs/xfs/libxfs/xfs_alloc.h
> +++ b/fs/xfs/libxfs/xfs_alloc.h
> @@ -66,6 +66,7 @@ typedef struct xfs_alloc_arg {
>  #define XFS_ALLOC_USERDATA		(1 << 0)/* allocation is for user data*/
>  #define XFS_ALLOC_INITIAL_USER_DATA	(1 << 1)/* special case start of file */
>  #define XFS_ALLOC_NOBUSY		(1 << 2)/* Busy extents not allowed */
> +#define XFS_ALLOC_FORCEALIGN		(1 << 3)/* forced extent alignment */
>  
>  /* freespace limit calculations */
>  unsigned int xfs_alloc_set_aside(struct xfs_mount *mp);
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 528e3cd81ee6..9131ba8113a6 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -3401,9 +3401,10 @@ xfs_bmap_alloc_account(
>   * Calculate the extent start alignment and the extent length adjustments that
>   * constrain this allocation.
>   *
> - * Extent start alignment is currently determined by stripe configuration and is
> - * carried in args->alignment, whilst extent length adjustment is determined by
> - * extent size hints and is carried by args->prod and args->mod.
> + * Extent start alignment is currently determined by forced inode alignment or
> + * stripe configuration and is carried in args->alignment, whilst extent length
> + * adjustment is determined by extent size hints and is carried by args->prod
> + * and args->mod.
>   *
>   * Low level allocation code is free to either ignore or override these values
>   * as required.
> @@ -3416,11 +3417,18 @@ xfs_bmap_compute_alignments(
>  	struct xfs_mount	*mp = args->mp;
>  	xfs_extlen_t		align = 0; /* minimum allocation alignment */
>  
> -	/* stripe alignment for allocation is determined by mount parameters */
> -	if (mp->m_swidth && xfs_has_swalloc(mp))
> +	/*
> +	 * Forced inode alignment takes preference over stripe alignment.
> +	 * Stripe alignment for allocation is determined by mount parameters.
> +	 */
> +	if (xfs_inode_has_forcealign(ap->ip)) {
> +		args->alignment = xfs_get_extsz_hint(ap->ip);
> +		args->datatype |= XFS_ALLOC_FORCEALIGN;
> +	} else if (mp->m_swidth && xfs_has_swalloc(mp)) {
>  		args->alignment = mp->m_swidth;
> -	else if (mp->m_dalign)
> +	} else if (mp->m_dalign) {
>  		args->alignment = mp->m_dalign;
> +	}
>  
>  	if (ap->flags & XFS_BMAPI_COWFORK)
>  		align = xfs_get_cowextsz_hint(ap->ip);
> @@ -3607,6 +3615,11 @@ xfs_bmap_btalloc_low_space(
>  {
>  	int			error;
>  
> +	if (args->alignment > 1 && (args->datatype & XFS_ALLOC_FORCEALIGN)) {
> +		args->fsbno = NULLFSBLOCK;
> +		return 0;
> +	}
> +
>  	args->alignment = 1;
>  	if (args->minlen > ap->minlen) {
>  		args->minlen = ap->minlen;
> @@ -3658,6 +3671,8 @@ xfs_bmap_btalloc_filestreams(
>  
>  	/* Attempt non-aligned allocation if we haven't already. */
>  	if (!error && args->fsbno == NULLFSBLOCK && args->alignment > 1)  {
> +		if (args->datatype & XFS_ALLOC_FORCEALIGN)
> +			return error;
>  		args->alignment = 1;
>  		error = xfs_alloc_vextent_near_bno(args, ap->blkno);
>  	}
> @@ -3716,6 +3731,8 @@ xfs_bmap_btalloc_best_length(
>  
>  	/* Attempt non-aligned allocation if we haven't already. */
>  	if (!error && args->fsbno == NULLFSBLOCK && args->alignment > 1)  {
> +		if (args->datatype & XFS_ALLOC_FORCEALIGN)
> +			return error;
>  		args->alignment = 1;
>  		error = xfs_alloc_vextent_start_ag(args, ap->blkno);
>  	}
> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
> index 292b90b5f2ac..42f999c1106c 100644
> --- a/fs/xfs/xfs_inode.h
> +++ b/fs/xfs/xfs_inode.h
> @@ -311,6 +311,11 @@ static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip)
>  	return ip->i_diflags2 & XFS_DIFLAG2_NREXT64;
>  }
>  
> +static inline bool xfs_inode_has_forcealign(struct xfs_inode *ip)
> +{
> +	return false;
> +}
> +
>  /*
>   * Decide if this file is a realtime file whose data allocation unit is larger
>   * than a single filesystem block.
> -- 
> 2.31.1
> 
> 

  reply	other threads:[~2024-06-21 20:37 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-21 10:05 [PATCH 00/13] forcealign for xfs John Garry
2024-06-21 10:05 ` [PATCH 01/13] xfs: only allow minlen allocations when near ENOSPC John Garry
2024-06-21 19:42   ` Darrick J. Wong
2024-06-21 20:04     ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 02/13] xfs: always tail align maxlen allocations John Garry
2024-06-21 19:50   ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 03/13] xfs: simplify extent allocation alignment John Garry
2024-06-21 20:29   ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 04/13] xfs: make EOF allocation simpler John Garry
2024-06-21 20:35   ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 05/13] xfs: introduce forced allocation alignment John Garry
2024-06-21 20:37   ` Darrick J. Wong [this message]
2024-06-21 10:05 ` [PATCH 06/13] xfs: align args->minlen for " John Garry
2024-06-21 20:38   ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 07/13] xfs: Introduce FORCEALIGN inode flag John Garry
2024-06-21 19:07   ` Darrick J. Wong
2024-06-24 14:36     ` John Garry
2024-06-21 10:05 ` [PATCH 08/13] xfs: Do not free EOF blocks for forcealign John Garry
2024-06-21 19:08   ` Darrick J. Wong
2024-06-24 15:04     ` John Garry
2024-06-21 10:05 ` [PATCH 09/13] xfs: Update xfs_inode_alloc_unitsize_fsb() " John Garry
2024-06-21 18:38   ` Darrick J. Wong
2024-06-24  7:34     ` John Garry
2024-06-21 10:05 ` [PATCH 10/13] xfs: Unmap blocks according to forcealign John Garry
2024-06-21 19:12   ` Darrick J. Wong
2024-06-24 15:12     ` John Garry
2024-06-21 10:05 ` [PATCH 11/13] xfs: Only free full extents for forcealign John Garry
2024-06-21 19:13   ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 12/13] xfs: Don't revert allocated offset " John Garry
2024-06-21 19:13   ` Darrick J. Wong
2024-06-21 10:05 ` [PATCH 13/13] xfs: Enable file data forcealign feature John Garry

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=20240621203702.GV3058325@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=brauner@kernel.org \
    --cc=catherine.hoang@oracle.com \
    --cc=chandan.babu@oracle.com \
    --cc=dchinner@redhat.com \
    --cc=hch@lst.de \
    --cc=jack@suse.cz \
    --cc=john.g.garry@oracle.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=viro@zeniv.linux.org.uk \
    /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