All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 5/8] xfs: factor out log write ordering from xlog_cil_push_work()
Date: Thu, 17 Jun 2021 12:59:04 -0700	[thread overview]
Message-ID: <20210617195904.GW158209@locust> (raw)
In-Reply-To: <20210617082617.971602-6-david@fromorbit.com>

On Thu, Jun 17, 2021 at 06:26:14PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> So we can use it for start record ordering as well as commit record
> ordering in future.
> 
> Signed-off-by: Dave Chinner <dchinner@redhat.com>

This tricked me for a second until I realized that xlog_cil_order_write
is the chunk of code just prior to the xlog_cil_write_commit_record
call.

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

--D

> ---
>  fs/xfs/xfs_log_cil.c | 89 ++++++++++++++++++++++++++------------------
>  1 file changed, 52 insertions(+), 37 deletions(-)
> 
> diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c
> index 35fc3e57d870..f993ec69fc97 100644
> --- a/fs/xfs/xfs_log_cil.c
> +++ b/fs/xfs/xfs_log_cil.c
> @@ -784,9 +784,54 @@ xlog_cil_build_trans_hdr(
>  }
>  
>  /*
> - * Write out the commit record of a checkpoint transaction associated with the
> - * given ticket to close off a running log write. Return the lsn of the commit
> - * record.
> + * Ensure that the order of log writes follows checkpoint sequence order. This
> + * relies on the context LSN being zero until the log write has guaranteed the
> + * LSN that the log write will start at via xlog_state_get_iclog_space().
> + */
> +static int
> +xlog_cil_order_write(
> +	struct xfs_cil		*cil,
> +	xfs_csn_t		sequence)
> +{
> +	struct xfs_cil_ctx	*ctx;
> +
> +restart:
> +	spin_lock(&cil->xc_push_lock);
> +	list_for_each_entry(ctx, &cil->xc_committing, committing) {
> +		/*
> +		 * Avoid getting stuck in this loop because we were woken by the
> +		 * shutdown, but then went back to sleep once already in the
> +		 * shutdown state.
> +		 */
> +		if (XLOG_FORCED_SHUTDOWN(cil->xc_log)) {
> +			spin_unlock(&cil->xc_push_lock);
> +			return -EIO;
> +		}
> +
> +		/*
> +		 * Higher sequences will wait for this one so skip them.
> +		 * Don't wait for our own sequence, either.
> +		 */
> +		if (ctx->sequence >= sequence)
> +			continue;
> +		if (!ctx->commit_lsn) {
> +			/*
> +			 * It is still being pushed! Wait for the push to
> +			 * complete, then start again from the beginning.
> +			 */
> +			xlog_wait(&cil->xc_commit_wait, &cil->xc_push_lock);
> +			goto restart;
> +		}
> +	}
> +	spin_unlock(&cil->xc_push_lock);
> +	return 0;
> +}
> +
> +/*
> + * Write out the commit record of a checkpoint transaction to close off a
> + * running log write. These commit records are strictly ordered in ascending CIL
> + * sequence order so that log recovery will always replay the checkpoints in the
> + * correct order.
>   */
>  int
>  xlog_cil_write_commit_record(
> @@ -816,6 +861,10 @@ xlog_cil_write_commit_record(
>  	if (XLOG_FORCED_SHUTDOWN(log))
>  		return -EIO;
>  
> +	error = xlog_cil_order_write(ctx->cil, ctx->sequence);
> +	if (error)
> +		return error;
> +
>  	/* account for space used by record data */
>  	ctx->ticket->t_curr_res -= reg.i_len;
>  	error = xlog_write(log, ctx, &lv_chain, ctx->ticket, iclog, reg.i_len);
> @@ -1048,40 +1097,6 @@ xlog_cil_push_work(
>  	if (error)
>  		goto out_abort_free_ticket;
>  
> -	/*
> -	 * now that we've written the checkpoint into the log, strictly
> -	 * order the commit records so replay will get them in the right order.
> -	 */
> -restart:
> -	spin_lock(&cil->xc_push_lock);
> -	list_for_each_entry(new_ctx, &cil->xc_committing, committing) {
> -		/*
> -		 * Avoid getting stuck in this loop because we were woken by the
> -		 * shutdown, but then went back to sleep once already in the
> -		 * shutdown state.
> -		 */
> -		if (XLOG_FORCED_SHUTDOWN(log)) {
> -			spin_unlock(&cil->xc_push_lock);
> -			goto out_abort_free_ticket;
> -		}
> -
> -		/*
> -		 * Higher sequences will wait for this one so skip them.
> -		 * Don't wait for our own sequence, either.
> -		 */
> -		if (new_ctx->sequence >= ctx->sequence)
> -			continue;
> -		if (!new_ctx->commit_lsn) {
> -			/*
> -			 * It is still being pushed! Wait for the push to
> -			 * complete, then start again from the beginning.
> -			 */
> -			xlog_wait(&cil->xc_commit_wait, &cil->xc_push_lock);
> -			goto restart;
> -		}
> -	}
> -	spin_unlock(&cil->xc_push_lock);
> -
>  	error = xlog_cil_write_commit_record(ctx, &commit_iclog);
>  	if (error)
>  		goto out_abort_free_ticket;
> -- 
> 2.31.1
> 

  reply	other threads:[~2021-06-17 19:59 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-17  8:26 [PATCH 0/8 V2] xfs: log fixes for for-next Dave Chinner
2021-06-17  8:26 ` [PATCH 1/8] xfs: add iclog state trace events Dave Chinner
2021-06-17 16:45   ` Darrick J. Wong
2021-06-18 14:09   ` Christoph Hellwig
2021-06-17  8:26 ` [PATCH 2/8] xfs: don't wait on future iclogs when pushing the CIL Dave Chinner
2021-06-17 17:49   ` Darrick J. Wong
2021-06-17 21:55     ` Dave Chinner
2021-06-17  8:26 ` [PATCH 3/8] xfs: move xlog_commit_record to xfs_log_cil.c Dave Chinner
2021-06-17 12:57   ` kernel test robot
2021-06-17 12:57     ` kernel test robot
2021-06-17 17:50   ` Darrick J. Wong
2021-06-17 21:56     ` Dave Chinner
2021-06-18 14:16   ` Christoph Hellwig
2021-06-17  8:26 ` [PATCH 4/8] xfs: pass a CIL context to xlog_write() Dave Chinner
2021-06-17 14:46   ` kernel test robot
2021-06-17 14:46     ` kernel test robot
2021-06-17 20:24   ` Darrick J. Wong
2021-06-17 22:03     ` Dave Chinner
2021-06-17 22:18       ` Darrick J. Wong
2021-06-18 14:23   ` Christoph Hellwig
2021-06-17  8:26 ` [PATCH 5/8] xfs: factor out log write ordering from xlog_cil_push_work() Dave Chinner
2021-06-17 19:59   ` Darrick J. Wong [this message]
2021-06-18 14:27     ` Christoph Hellwig
2021-06-18 22:34       ` Dave Chinner
2021-06-17  8:26 ` [PATCH 6/8] xfs: separate out setting CIL context LSNs from xlog_write Dave Chinner
2021-06-17 20:28   ` Darrick J. Wong
2021-06-17 22:10     ` Dave Chinner
2021-06-17  8:26 ` [PATCH 7/8] xfs: attached iclog callbacks in xlog_cil_set_ctx_write_state() Dave Chinner
2021-06-17 20:55   ` Darrick J. Wong
2021-06-17 22:20     ` Dave Chinner
2021-06-17  8:26 ` [PATCH 8/8] xfs: order CIL checkpoint start records Dave Chinner
2021-06-17 21:31   ` Darrick J. Wong
2021-06-17 22:49     ` Dave Chinner
2021-06-17 18:32 ` [PATCH 0/8 V2] xfs: log fixes for for-next Brian Foster
2021-06-17 19:05   ` Darrick J. Wong
2021-06-17 20:06     ` Brian Foster
2021-06-17 20:26       ` Darrick J. Wong
2021-06-17 23:31         ` Brian Foster
2021-06-17 23:43     ` Dave Chinner
2021-06-18 13:08       ` Brian Foster
2021-06-18 13:55         ` Christoph Hellwig
2021-06-18 14:02           ` Christoph Hellwig
2021-06-18 22:28           ` Dave Chinner
2021-06-18 22:15         ` Dave Chinner
2021-06-18 22:48 ` Dave Chinner
2021-06-19 20:22   ` Darrick J. Wong
2021-06-20 22:18     ` Dave Chinner
  -- strict thread matches above, loose matches on Subject: below --
2021-06-26 23:10 [PATCH 4/8] xfs: pass a CIL context to xlog_write() kernel test robot
2021-06-28  8:58 ` Dan Carpenter
2021-06-28  8:58 ` Dan Carpenter

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=20210617195904.GW158209@locust \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.