public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Ben Myers <bpm@sgi.com>
Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com
Subject: Re: [patch 11/12] xfs: share code for grant head availability checks
Date: Fri, 17 Feb 2012 13:41:40 +1100	[thread overview]
Message-ID: <20120217024140.GF14132@dastard> (raw)
In-Reply-To: <20120216212506.GZ7762@sgi.com>

On Thu, Feb 16, 2012 at 03:25:06PM -0600, Ben Myers wrote:
> Add xlog_grant_head_check() to replace sections of
> xlog_regrant_write_log_space() and xlog_grant_log_space().
> 
> On Mon, Dec 12, 2011 at 09:13:58AM -0500, Christoph Hellwig wrote:
> > Signed-off-by: Christoph Hellwig <hch@lst.de>
> > 
.....
> >  xlog_grant_log_space(
> >  	struct log		*log,
> >  	struct xlog_ticket	*tic)
> >  {
> > -	int			free_bytes, need_bytes;
> > +	int			need_bytes;
> >  	int			error = 0;
> >  
> > -	ASSERT(!(log->l_flags & XLOG_ACTIVE_RECOVERY));
> > -
> >  	trace_xfs_log_grant_enter(log, tic);
> >  
> > -	/*
> > -	 * If there are other waiters on the queue then give them a chance at
> > -	 * logspace before us.  Wake up the first waiters, if we do not wake
> > -	 * up all the waiters then go to sleep waiting for more free space,
> > -	 * otherwise try to get some space for this transaction.
> > -	 */
> > -	need_bytes = tic->t_unit_res;
> > -	if (tic->t_flags & XFS_LOG_PERM_RESERV)
> > -		need_bytes *= tic->t_ocnt;
> 				     ^
> Here the calculation was done with tic->t_ocnt.
> 
> You don't see it in this patch, but xlog_ticket_reservation is using
> t_cnt.  I haven't looked into which is correct.

Good question, Ben.

Basically, a permanent log transaction is a transaction with larger
initial reservation on both the reserve and write heads so that
further reservations are not needed for most simple operations that
involving rolling commits. For operations that require long rolling
transactions, t_cnt reaches zero after a few dup/commit/reserve
loops and then it goes back to blocking to regrant log space. IOWs,
it's an optimisation to minimise blocking on log space for the
common case while keeping log reservation sizes somewhat sane.

A good example of this is that inode allocation can involve two
commits - one for allocating a new inode chunk, the second for
allocating an inode out of the new chunk. The "count" passed in to
the initial xfs_trans_reserve() call is 2. Hence the permanent log
reservation means that the initial transaction reservation can
reserve enough reserve and write head space for both commits without
needing to block in the second xfs_trans_reserve() call after
commiting the inode chunk allocation transaction.

For permanent transactions, in the current code,
xlog_grant_log_space() is called it is only for the first
transaction reservation of the series (i.e. no ticket yet exists).
That means tic->t_ocnt = tic->t_cnt because the ticket was just
initialised.  IOWs, for xlog_grant_log_space() it doesn't matter if
we use t_ocnt or t_cnt for the initial reservation and we don't use
t_ocnt anywhere else.

In subsequent rolling permanent transactions (i.e. the duplicated
transaction needing a new reservation), the ticket already exists
and we go down the path of xlog_regrant_write_log_space() instead.
That only reserves more write grant space if the t_cnt has reached
zero, and only does a single transaction reservation at a time. i.e.
t_ocnt is not used for these reservations at all.

Looking at Christophs new code, everything works the same, except
for making use of the observation that when we come through
xlog_ticket_reservation() for the reserve head, t_ocnt = t_cnt and
so we can use t_cnt for that case as well. That makes the code
generic for use with al the other places that do the same
calculation with t_cnt after it may have been modified due to
rolling transaction commits.....

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2012-02-17  2:41 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-12 14:13 [patch 00/12] log grant code cleanups Christoph Hellwig
2011-12-12 14:13 ` [patch 01/12] xfs: split tail_lsn assignments from log space wakeups Christoph Hellwig
2012-01-17 18:48   ` Mark Tinguely
2012-01-25 16:09     ` Christoph Hellwig
2012-02-16 18:21   ` Ben Myers
2012-02-17 19:21     ` Christoph Hellwig
2011-12-12 14:13 ` [patch 02/12] xfs: do exact log space wakeups in xlog_ungrant_log_space Christoph Hellwig
2012-01-17 22:42   ` Mark Tinguely
2012-02-16 18:36   ` Ben Myers
2011-12-12 14:13 ` [patch 03/12] xfs: remove xfs_trans_unlocked_item Christoph Hellwig
2012-01-23 14:31   ` Mark Tinguely
2012-02-16 18:51     ` Ben Myers
2011-12-12 14:13 ` [patch 04/12] xfs: cleanup xfs_log_space_wake Christoph Hellwig
2012-01-23 19:22   ` Mark Tinguely
2012-01-25 16:10     ` Christoph Hellwig
2012-01-25 19:09       ` Mark Tinguely
2012-01-26 16:13         ` Mark Tinguely
2012-01-26 22:12         ` Dave Chinner
2012-02-16 19:06   ` Ben Myers
2011-12-12 14:13 ` [patch 05/12] xfs: remove log space waitqueues Christoph Hellwig
2012-01-23 21:58   ` Mark Tinguely
2011-12-12 14:13 ` [patch 06/12] xfs: add the xlog_grant_head structure Christoph Hellwig
2012-01-24 15:35   ` Mark Tinguely
2012-02-16 20:23   ` Ben Myers
2011-12-12 14:13 ` [patch 07/12] xfs: add xlog_grant_head_init Christoph Hellwig
2012-01-24 15:43   ` Mark Tinguely
2012-02-16 20:29   ` Ben Myers
2011-12-12 14:13 ` [patch 08/12] xfs: add xlog_grant_head_wake_all Christoph Hellwig
2012-01-24 15:46   ` Mark Tinguely
2012-02-16 20:44   ` Ben Myers
2011-12-12 14:13 ` [patch 09/12] xfs: share code for grant head waiting Christoph Hellwig
2012-01-24 18:10   ` Mark Tinguely
2012-02-16 20:51   ` Ben Myers
2011-12-12 14:13 ` [patch 10/12] xfs: shared code for grant head wakeups Christoph Hellwig
2012-01-24 18:37   ` Mark Tinguely
2012-02-16 21:08   ` Ben Myers
2011-12-12 14:13 ` [patch 11/12] xfs: share code for grant head availability checks Christoph Hellwig
2012-01-24 18:53   ` Mark Tinguely
2012-02-16 21:25   ` Ben Myers
2012-02-17  2:41     ` Dave Chinner [this message]
2011-12-12 14:13 ` [patch 12/12] xfs: split and cleanup xfs_log_reserve Christoph Hellwig
2012-02-16 21:36   ` Ben Myers
2012-02-19 21:16     ` Christoph Hellwig
2012-02-16  6:16 ` [patch 00/12] log grant code cleanups Dave Chinner
2012-02-17 18:00   ` Christoph Hellwig
2012-02-16 21:46 ` Ben Myers
2012-02-19 21:17   ` Christoph Hellwig
2012-02-20 21:59     ` Ben Myers
  -- strict thread matches above, loose matches on Subject: below --
2012-02-20  2:31 [PATCH 00/12] log grant code cleanups V2 Christoph Hellwig
2012-02-20  2:31 ` [PATCH 11/12] xfs: share code for grant head availability checks Christoph Hellwig

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=20120217024140.GF14132@dastard \
    --to=david@fromorbit.com \
    --cc=bpm@sgi.com \
    --cc=hch@infradead.org \
    --cc=xfs@oss.sgi.com \
    /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