Skip to contentSkip to conversation

btrfs: trace: Add trace points for unused block groups

PATCH In review Qu Wenruo 2 participants 2 messages Apr 26, 2018

Subsystems (2)
lore
Share & tools
lore

Qu Wenruo

author
#0 lore raw

PATCH 1/1 btrfs: trace: Add trace points for unused block groups

This patch will add the following trace events:
1) btrfs_remove_block_group
For btrfs_remove_block_group() function. Triggered when a block group is really removed.

2) btrfs_add_unused_block_group
Triggered which block group is added to unused_bgs list.

3) btrfs_skip_unused_block_group
Triggered which unused block group is not deleted.

These trace events is pretty handy to debug case related to block group auto remove.

---
 fs/btrfs/extent-tree.c       |  4 ++++
 fs/btrfs/scrub.c             |  1 +
 include/trace/events/btrfs.h | 41 ++++++++++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+)
fs/btrfs/extent-tree.c +4 -0
index bf30be868f7a..5a0c7fcf01fb 100644
@@ -6352,6 +6352,7 @@ static int update_block_group(struct btrfs_trans_handle *trans,
 			spin_lock(&info->unused_bgs_lock);
 			if (list_empty(&cache->bg_list)) {
 				btrfs_get_block_group(cache);
+				trace_btrfs_add_unused_block_group(cache);
 				list_add_tail(&cache->bg_list,
 					      &info->unused_bgs);
 			}
@@ -10206,6 +10207,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)
 			/* Should always be true but just in case. */
 			if (list_empty(&cache->bg_list)) {
 				btrfs_get_block_group(cache);
+				trace_btrfs_add_unused_block_group(cache);
 				list_add_tail(&cache->bg_list,
 					      &info->unused_bgs);
 			}
@@ -10393,6 +10395,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
 	BUG_ON(!block_group);
 	BUG_ON(!block_group->ro);
 
+	trace_btrfs_remove_block_group(block_group);
 	/*
 	 * Free the reserved super bytes from this block group before
 	 * remove it.
@@ -10757,6 +10760,7 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
 			 * the ro check in case balance is currently acting on
 			 * this block group.
 			 */
+			trace_btrfs_skip_unused_block_group(block_group);
 			spin_unlock(&block_group->lock);
 			up_write(&space_info->groups_sem);
 			goto next;
fs/btrfs/scrub.c +1 -0
index 52b39a0924e9..a59005862010 100644
@@ -3984,6 +3984,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
 			spin_lock(&fs_info->unused_bgs_lock);
 			if (list_empty(&cache->bg_list)) {
 				btrfs_get_block_group(cache);
+				trace_btrfs_add_unused_block_group(cache);
 				list_add_tail(&cache->bg_list,
 					      &fs_info->unused_bgs);
 			}
include/trace/events/btrfs.h +41 -0

47 lines not on this page · raw message

Signature · 1 line
2.17.0
Reviewed-by on v1 1/1
#1 lore raw
Quoted 5 lines · Qu Wenruo

This patch will add the following trace events:
1) btrfs_remove_block_group
For btrfs_remove_block_group() function. Triggered when a block group is really removed.

Quoted 8 lines

2) btrfs_add_unused_block_group
Triggered which block group is added to unused_bgs list.

3) btrfs_skip_unused_block_group
Triggered which unused block group is not deleted.

These trace events is pretty handy to debug case related to block group auto remove.

Sounds useful.

Quoted 14 lines
include/trace/events/btrfs.h +12 -0
+DECLARE_EVENT_CLASS(btrfs__block_group,
+	TP_PROTO(const struct btrfs_block_group_cache *bg_cache),
+
+	TP_ARGS(bg_cache),
+
+	TP_STRUCT__entry_btrfs(
+		__field(	u64,	bytenr		)
+		__field(	u64,	flags		)
+		__field(	u64,	len		)
+		__field(	u64,	used		)
+	),
+

include/trace/events/btrfs.h TRACE_EVENT(btrfs_inode_mod_outstanding_extents, · line 1829

Quoted 10 lines
include/trace/events/btrfs.h +10 -0
+	TP_fast_assign_btrfs(bg_cache->fs_info,
+		__entry->bytenr = bg_cache->key.objectid,
+		__entry->len	= bg_cache->key.offset,
+		__entry->flags	= bg_cache->flags;
+		__entry->used	= btrfs_block_group_used(&bg_cache->item);
+	),
+
+	TP_printk_btrfs("bg bytenr=%llu len=%llu used=%llu flags=%llu(%s)",
+		__entry->bytenr, __entry->len, __entry->used, __entry->flags,
+		__print_flags(__entry->flags, "|", BTRFS_GROUP_FLAGS))

I've reorered the fields so they're sorted the same way in all 3 sections, as defined in the printk (bytenr, len, used, flags).