All of lore.kernel.org
 help / color / mirror / Atom feed
* reflink log reservations
@ 2016-02-04  7:46 Christoph Hellwig
  2016-02-04  8:16 ` Darrick J. Wong
  0 siblings, 1 reply; 5+ messages in thread
From: Christoph Hellwig @ 2016-02-04  7:46 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: xfs

Hi Darrick,

I'm running into the following log reservation assert after a few
xfstests runs over NFS.  I'll try to understand the reservation
calculations, but in case this is still fresh in your head here's
a headsup:

generic/167 11s ...
[  640.924891] XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 315
[  640.925750] ------------[ cut here ]------------
[  640.926164] kernel BUG at fs/xfs/xfs_message.c:113!
[  640.926583] invalid opcode: 0000 [#1] SMP 
[  640.926995] Modules linked in:
[  640.927385] CPU: 3 PID: 3719 Comm: nfsd Not tainted 4.5.0-rc2+ #424
[  640.928036] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_083030-gandalf 04/01/2014
[  640.928098] task: ffff88007b614380 ti: ffff880077cd4000 task.ti: ffff880077cd4000
[  640.928098] RIP: 0010:[<ffffffff814cdd1d>]  [<ffffffff814cdd1d>] assfail+0x1d/0x20
[  640.928098] RSP: 0018:ffff880077cd72e0  EFLAGS: 00010282
[  640.928098] RAX: 00000000ffffffea RBX: ffff88007afc9130 RCX: 0000000000000021
[  640.928098] RDX: ffff880077cd7208 RSI: 000000000000000a RDI: ffffffff81fdc510
[  640.928098] RBP: ffff880077cd72e0 R08: 0000000000000000 R09: 0000000000000000
[  640.928098] R10: 000000000000000a R11: f000000000000000 R12: ffffffffffffffff
[  640.928098] R13: ffff88007b2cd000 R14: 00000000000a0000 R15: 0000000000000001
[  640.928098] FS:  0000000000000000(0000) GS:ffff88007fd80000(0000) knlGS:0000000000000000
[  640.928098] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[  640.928098] CR2: 00000000013e10f8 CR3: 0000000075b18000 CR4: 00000000000006e0
[  640.928098] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  640.928098] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[  640.928098] Stack:
[  640.928098]  ffff880077cd7308 ffffffff814d7d00 ffff880077cd7390 0000000000000001
[  640.928098]  ffff880077cd7390 ffff880077cd7328 ffffffff8146059d ffff88007b2cd000
[  640.928098]  0000000000000020 ffff880077cd7378 ffffffff814617cd ffff880077cd7378
[  640.928098] Call Trace:
[  640.928098]  [<ffffffff814d7d00>] xfs_trans_mod_sb+0x250/0x290
[  640.928098]  [<ffffffff8146059d>] xfs_alloc_ag_vextent+0x28d/0x330
[  640.928098]  [<ffffffff814617cd>] xfs_alloc_vextent+0x70d/0x800
[  640.928098]  [<ffffffff814a7a51>] xfs_refcountbt_alloc_block+0xd1/0x1a0
[  640.928098]  [<ffffffff81480aa6>] __xfs_btree_split+0xb6/0xbd0
[  640.928098]  [<ffffffff814eb6e6>] ? xfs_trans_read_buf_map+0x1e6/0x370
[  640.928098]  [<ffffffff814816a4>] xfs_btree_split+0x34/0xc0
[  640.928098]  [<ffffffff8148287f>] xfs_btree_make_block_unfull+0xef/0x170
[  640.928098]  [<ffffffff814832f9>] xfs_btree_insrec+0x9f9/0xc50
[  640.928098]  [<ffffffff8147d6f4>] ? xfs_btree_read_buf_block+0xa4/0xd0
[  640.928098]  [<ffffffff814ebe1f>] ? xfs_trans_log_buf+0x15f/0x1b0
[  640.928098]  [<ffffffff814835b9>] xfs_btree_insert+0x69/0x1d0
[  640.928098]  [<ffffffff814a509e>] xfs_refcountbt_insert+0x4e/0x90
[  640.928098]  [<ffffffff814a58af>] try_split_right_rcextent+0x17f/0x200
[  640.928098]  [<ffffffff814a6afc>] xfs_refcountbt_adjust_refcount+0x4c/0x100
[  640.928098]  [<ffffffff814a6cac>] xfs_refcount_decrease+0x5c/0xa0
[  640.928098]  [<ffffffff814a6d73>] xfs_refcount_put_extent+0x83/0xb0
[  640.928098]  [<ffffffff8147706f>] xfs_bmap_del_extent+0x57f/0x1160
[  640.928098]  [<ffffffff814d965b>] ? kmem_zone_alloc+0x7b/0x120
[  640.928098]  [<ffffffff814d965b>] ? kmem_zone_alloc+0x7b/0x120
[  640.928098]  [<ffffffff8147b8ef>] ? xfs_bmbt_init_cursor+0x5f/0x190
[  640.928098]  [<ffffffff81478bf5>] xfs_bunmapi+0x845/0x10d0
[  640.928098]  [<ffffffff814c8ad8>] xfs_itruncate_extents+0x218/0x3e0
[  640.928098]  [<ffffffff814c8e8d>] xfs_inactive_truncate+0xbd/0x130
[  640.928098]  [<ffffffff814ca6db>] xfs_inactive+0x1ab/0x1e0
[  640.928098]  [<ffffffff814d3a49>] xfs_fs_evict_inode+0x109/0x160
[  640.928098]  [<ffffffff811d79db>] evict+0xbb/0x180
[  640.928098]  [<ffffffff811d8314>] iput+0x174/0x1e0
[  640.928098]  [<ffffffff811d39be>] d_delete+0x11e/0x160
[  640.928098]  [<ffffffff811ca203>] vfs_unlink+0x133/0x160
[  640.928098]  [<ffffffff811ca74a>] ? lookup_one_len+0xca/0x120
[  640.928098]  [<ffffffff81359897>] nfsd_unlink+0x127/0x210
[  640.928098]  [<ffffffff81364d69>] nfsd4_remove+0x49/0x130
[  640.928098]  [<ffffffff8136593a>] nfsd4_proc_compound+0x31a/0x570
[  640.928098]  [<ffffffff813549d9>] nfsd_dispatch+0x89/0x170
[  640.928098]  [<ffffffff81b9968a>] svc_process_common+0x39a/0x520
[  640.928098]  [<ffffffff81b99960>] svc_process+0x150/0x1a0
[  640.928098]  [<ffffffff8135446a>] nfsd+0xea/0x150
[  640.928098]  [<ffffffff81354380>] ? nfsd_destroy+0x60/0x60
[  640.928098]  [<ffffffff810dedf6>] kthread+0xd6/0xf0
[  640.928098]  [<ffffffff810ded20>] ? kthread_create_on_node+0x170/0x170
[  640.928098]  [<ffffffff81bc8a8f>] ret_from_fork+0x3f/0x70
[  640.928098]  [<ffffffff810ded20>] ? kthread_create_on_node+0x170/0x170


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

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: reflink log reservations
  2016-02-04  7:46 reflink log reservations Christoph Hellwig
@ 2016-02-04  8:16 ` Darrick J. Wong
  2016-02-04 13:31   ` Christoph Hellwig
  0 siblings, 1 reply; 5+ messages in thread
From: Darrick J. Wong @ 2016-02-04  8:16 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: xfs

On Thu, Feb 04, 2016 at 08:46:17AM +0100, Christoph Hellwig wrote:
> Hi Darrick,
> 
> I'm running into the following log reservation assert after a few
> xfstests runs over NFS.  I'll try to understand the reservation
> calculations, but in case this is still fresh in your head here's
> a headsup:

Hmm, interesting, I haven't seen /that/ one... my guess is that the
block reservation needs to be bumped up for the refcount tree.

--D

> 
> generic/167 11s ...
> [  640.924891] XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 315
> [  640.925750] ------------[ cut here ]------------
> [  640.926164] kernel BUG at fs/xfs/xfs_message.c:113!
> [  640.926583] invalid opcode: 0000 [#1] SMP 
> [  640.926995] Modules linked in:
> [  640.927385] CPU: 3 PID: 3719 Comm: nfsd Not tainted 4.5.0-rc2+ #424
> [  640.928036] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_083030-gandalf 04/01/2014
> [  640.928098] task: ffff88007b614380 ti: ffff880077cd4000 task.ti: ffff880077cd4000
> [  640.928098] RIP: 0010:[<ffffffff814cdd1d>]  [<ffffffff814cdd1d>] assfail+0x1d/0x20
> [  640.928098] RSP: 0018:ffff880077cd72e0  EFLAGS: 00010282
> [  640.928098] RAX: 00000000ffffffea RBX: ffff88007afc9130 RCX: 0000000000000021
> [  640.928098] RDX: ffff880077cd7208 RSI: 000000000000000a RDI: ffffffff81fdc510
> [  640.928098] RBP: ffff880077cd72e0 R08: 0000000000000000 R09: 0000000000000000
> [  640.928098] R10: 000000000000000a R11: f000000000000000 R12: ffffffffffffffff
> [  640.928098] R13: ffff88007b2cd000 R14: 00000000000a0000 R15: 0000000000000001
> [  640.928098] FS:  0000000000000000(0000) GS:ffff88007fd80000(0000) knlGS:0000000000000000
> [  640.928098] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> [  640.928098] CR2: 00000000013e10f8 CR3: 0000000075b18000 CR4: 00000000000006e0
> [  640.928098] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [  640.928098] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> [  640.928098] Stack:
> [  640.928098]  ffff880077cd7308 ffffffff814d7d00 ffff880077cd7390 0000000000000001
> [  640.928098]  ffff880077cd7390 ffff880077cd7328 ffffffff8146059d ffff88007b2cd000
> [  640.928098]  0000000000000020 ffff880077cd7378 ffffffff814617cd ffff880077cd7378
> [  640.928098] Call Trace:
> [  640.928098]  [<ffffffff814d7d00>] xfs_trans_mod_sb+0x250/0x290
> [  640.928098]  [<ffffffff8146059d>] xfs_alloc_ag_vextent+0x28d/0x330
> [  640.928098]  [<ffffffff814617cd>] xfs_alloc_vextent+0x70d/0x800
> [  640.928098]  [<ffffffff814a7a51>] xfs_refcountbt_alloc_block+0xd1/0x1a0
> [  640.928098]  [<ffffffff81480aa6>] __xfs_btree_split+0xb6/0xbd0
> [  640.928098]  [<ffffffff814eb6e6>] ? xfs_trans_read_buf_map+0x1e6/0x370
> [  640.928098]  [<ffffffff814816a4>] xfs_btree_split+0x34/0xc0
> [  640.928098]  [<ffffffff8148287f>] xfs_btree_make_block_unfull+0xef/0x170
> [  640.928098]  [<ffffffff814832f9>] xfs_btree_insrec+0x9f9/0xc50
> [  640.928098]  [<ffffffff8147d6f4>] ? xfs_btree_read_buf_block+0xa4/0xd0
> [  640.928098]  [<ffffffff814ebe1f>] ? xfs_trans_log_buf+0x15f/0x1b0
> [  640.928098]  [<ffffffff814835b9>] xfs_btree_insert+0x69/0x1d0
> [  640.928098]  [<ffffffff814a509e>] xfs_refcountbt_insert+0x4e/0x90
> [  640.928098]  [<ffffffff814a58af>] try_split_right_rcextent+0x17f/0x200
> [  640.928098]  [<ffffffff814a6afc>] xfs_refcountbt_adjust_refcount+0x4c/0x100
> [  640.928098]  [<ffffffff814a6cac>] xfs_refcount_decrease+0x5c/0xa0
> [  640.928098]  [<ffffffff814a6d73>] xfs_refcount_put_extent+0x83/0xb0
> [  640.928098]  [<ffffffff8147706f>] xfs_bmap_del_extent+0x57f/0x1160
> [  640.928098]  [<ffffffff814d965b>] ? kmem_zone_alloc+0x7b/0x120
> [  640.928098]  [<ffffffff814d965b>] ? kmem_zone_alloc+0x7b/0x120
> [  640.928098]  [<ffffffff8147b8ef>] ? xfs_bmbt_init_cursor+0x5f/0x190
> [  640.928098]  [<ffffffff81478bf5>] xfs_bunmapi+0x845/0x10d0
> [  640.928098]  [<ffffffff814c8ad8>] xfs_itruncate_extents+0x218/0x3e0
> [  640.928098]  [<ffffffff814c8e8d>] xfs_inactive_truncate+0xbd/0x130
> [  640.928098]  [<ffffffff814ca6db>] xfs_inactive+0x1ab/0x1e0
> [  640.928098]  [<ffffffff814d3a49>] xfs_fs_evict_inode+0x109/0x160
> [  640.928098]  [<ffffffff811d79db>] evict+0xbb/0x180
> [  640.928098]  [<ffffffff811d8314>] iput+0x174/0x1e0
> [  640.928098]  [<ffffffff811d39be>] d_delete+0x11e/0x160
> [  640.928098]  [<ffffffff811ca203>] vfs_unlink+0x133/0x160
> [  640.928098]  [<ffffffff811ca74a>] ? lookup_one_len+0xca/0x120
> [  640.928098]  [<ffffffff81359897>] nfsd_unlink+0x127/0x210
> [  640.928098]  [<ffffffff81364d69>] nfsd4_remove+0x49/0x130
> [  640.928098]  [<ffffffff8136593a>] nfsd4_proc_compound+0x31a/0x570
> [  640.928098]  [<ffffffff813549d9>] nfsd_dispatch+0x89/0x170
> [  640.928098]  [<ffffffff81b9968a>] svc_process_common+0x39a/0x520
> [  640.928098]  [<ffffffff81b99960>] svc_process+0x150/0x1a0
> [  640.928098]  [<ffffffff8135446a>] nfsd+0xea/0x150
> [  640.928098]  [<ffffffff81354380>] ? nfsd_destroy+0x60/0x60
> [  640.928098]  [<ffffffff810dedf6>] kthread+0xd6/0xf0
> [  640.928098]  [<ffffffff810ded20>] ? kthread_create_on_node+0x170/0x170
> [  640.928098]  [<ffffffff81bc8a8f>] ret_from_fork+0x3f/0x70
> [  640.928098]  [<ffffffff810ded20>] ? kthread_create_on_node+0x170/0x170
> 
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

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

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: reflink log reservations
  2016-02-04  8:16 ` Darrick J. Wong
@ 2016-02-04 13:31   ` Christoph Hellwig
  2016-02-04 18:05     ` Darrick J. Wong
  0 siblings, 1 reply; 5+ messages in thread
From: Christoph Hellwig @ 2016-02-04 13:31 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: Christoph Hellwig, xfs

On Thu, Feb 04, 2016 at 12:16:20AM -0800, Darrick J. Wong wrote:
> On Thu, Feb 04, 2016 at 08:46:17AM +0100, Christoph Hellwig wrote:
> > Hi Darrick,
> > 
> > I'm running into the following log reservation assert after a few
> > xfstests runs over NFS.  I'll try to understand the reservation
> > calculations, but in case this is still fresh in your head here's
> > a headsup:
> 
> Hmm, interesting, I haven't seen /that/ one... my guess is that the
> block reservation needs to be bumped up for the refcount tree.

This seems to fix it for me:

---
>From 6e27eb42ece3a25f610690487b403a0091cafa26 Mon Sep 17 00:00:00 2001
From: Christoph Hellwig <hch@lst.de>
Date: Thu, 4 Feb 2016 13:50:16 +0100
Subject: xfs: account for the refcount btree in the alloc/free log reservation

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/libxfs/xfs_trans_resv.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c
index d495f82..f4c2648 100644
--- a/fs/xfs/libxfs/xfs_trans_resv.c
+++ b/fs/xfs/libxfs/xfs_trans_resv.c
@@ -65,12 +65,15 @@ xfs_calc_buf_res(
 
 /*
  * Per-extent log reservation for the allocation btree changes
- * involved in freeing or allocating an extent. When rmap is not enabled,
- * there are only two trees that will be modified (free space trees), and when
- * rmap is enabled there will be three (freespace + rmap trees). The number of
- * blocks reserved is based on the formula:
+ * involved in freeing or allocating an extent.
  *
- * num trees * ((2 blocks/level * max depth) - 1)
+ * There are at least two trees that will be modified (free space trees), when
+ * rmap is enabled there will be an additional rmap tree, and when reflinks
+ * are enabled there will be a refcount btree as well
+ *
+ * The number of  blocks reserved is based on the formula:
+ *
+ *     num trees * ((2 blocks/level * max depth) - 1)
  */
 static uint
 xfs_allocfree_log_count(
@@ -81,6 +84,8 @@ xfs_allocfree_log_count(
 
 	if (xfs_sb_version_hasrmapbt(&mp->m_sb))
 		num_trees++;
+	if (xfs_sb_version_hasreflink(&mp->m_sb))
+		num_trees++;
 
 	return num_ops * num_trees * (2 * mp->m_ag_maxlevels - 1);
 }
-- 
2.1.4

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

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: reflink log reservations
  2016-02-04 13:31   ` Christoph Hellwig
@ 2016-02-04 18:05     ` Darrick J. Wong
  2016-02-09 16:31       ` Christoph Hellwig
  0 siblings, 1 reply; 5+ messages in thread
From: Darrick J. Wong @ 2016-02-04 18:05 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: xfs

On Thu, Feb 04, 2016 at 02:31:33PM +0100, Christoph Hellwig wrote:
> On Thu, Feb 04, 2016 at 12:16:20AM -0800, Darrick J. Wong wrote:
> > On Thu, Feb 04, 2016 at 08:46:17AM +0100, Christoph Hellwig wrote:
> > > Hi Darrick,
> > > 
> > > I'm running into the following log reservation assert after a few
> > > xfstests runs over NFS.  I'll try to understand the reservation
> > > calculations, but in case this is still fresh in your head here's
> > > a headsup:
> > 
> > Hmm, interesting, I haven't seen /that/ one... my guess is that the
> > block reservation needs to be bumped up for the refcount tree.
> 
> This seems to fix it for me:
> 
> ---
> From 6e27eb42ece3a25f610690487b403a0091cafa26 Mon Sep 17 00:00:00 2001
> From: Christoph Hellwig <hch@lst.de>
> Date: Thu, 4 Feb 2016 13:50:16 +0100
> Subject: xfs: account for the refcount btree in the alloc/free log reservation
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/xfs/libxfs/xfs_trans_resv.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c
> index d495f82..f4c2648 100644
> --- a/fs/xfs/libxfs/xfs_trans_resv.c
> +++ b/fs/xfs/libxfs/xfs_trans_resv.c
> @@ -65,12 +65,15 @@ xfs_calc_buf_res(
>  
>  /*
>   * Per-extent log reservation for the allocation btree changes
> - * involved in freeing or allocating an extent. When rmap is not enabled,
> - * there are only two trees that will be modified (free space trees), and when
> - * rmap is enabled there will be three (freespace + rmap trees). The number of
> - * blocks reserved is based on the formula:
> + * involved in freeing or allocating an extent.
>   *
> - * num trees * ((2 blocks/level * max depth) - 1)
> + * There are at least two trees that will be modified (free space trees), when
> + * rmap is enabled there will be an additional rmap tree, and when reflinks
> + * are enabled there will be a refcount btree as well
> + *
> + * The number of  blocks reserved is based on the formula:
> + *
> + *     num trees * ((2 blocks/level * max depth) - 1)

Huh, could've sworn I used to have a patch that does this... but I can't find
it, so it clearly fell out.  Thanks for the patch.

--D

>   */
>  static uint
>  xfs_allocfree_log_count(
> @@ -81,6 +84,8 @@ xfs_allocfree_log_count(
>  
>  	if (xfs_sb_version_hasrmapbt(&mp->m_sb))
>  		num_trees++;
> +	if (xfs_sb_version_hasreflink(&mp->m_sb))
> +		num_trees++;
>  
>  	return num_ops * num_trees * (2 * mp->m_ag_maxlevels - 1);
>  }
> -- 
> 2.1.4
> 

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

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: reflink log reservations
  2016-02-04 18:05     ` Darrick J. Wong
@ 2016-02-09 16:31       ` Christoph Hellwig
  0 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2016-02-09 16:31 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: xfs

I've still seen the assert a couple of times with the fix, and
with yesterdays tree update they are back reproducibly (always in
generic/168 over NFS).

I suspect the problem is that xfs_refcountbt_alloc_block fully
recurses into the allocator and thus could basically double
the log reservation.

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

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-02-09 16:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-04  7:46 reflink log reservations Christoph Hellwig
2016-02-04  8:16 ` Darrick J. Wong
2016-02-04 13:31   ` Christoph Hellwig
2016-02-04 18:05     ` Darrick J. Wong
2016-02-09 16:31       ` Christoph Hellwig

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.