Commit e5ad49e2 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: add a trace class for dumping the current ENOSPC state

Often when I'm debugging ENOSPC related issues I have to resort to
printing the entire ENOSPC state with trace_printk() in different spots.
This gets pretty annoying, so add a trace state that does this for us.
Then add a trace point at the end of preemptive flushing so you can see
the state of the space_info when we decide to exit preemptive flushing.
This helped me figure out we weren't kicking in the preemptive flushing
soon enough.
Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 4b02b00f
......@@ -1140,6 +1140,7 @@ static void btrfs_preempt_reclaim_metadata_space(struct work_struct *work)
/* We only went through once, back off our clamping. */
if (loops == 1 && !space_info->reclaim_size)
space_info->clamp = max(1, space_info->clamp - 1);
trace_btrfs_done_preemptive_reclaim(fs_info, space_info);
spin_unlock(&space_info->lock);
}
......
......@@ -2029,6 +2029,68 @@ TRACE_EVENT(btrfs_convert_extent_bit,
__print_flags(__entry->clear_bits, "|", EXTENT_FLAGS))
);
DECLARE_EVENT_CLASS(btrfs_dump_space_info,
TP_PROTO(const struct btrfs_fs_info *fs_info,
const struct btrfs_space_info *sinfo),
TP_ARGS(fs_info, sinfo),
TP_STRUCT__entry_btrfs(
__field( u64, flags )
__field( u64, total_bytes )
__field( u64, bytes_used )
__field( u64, bytes_pinned )
__field( u64, bytes_reserved )
__field( u64, bytes_may_use )
__field( u64, bytes_readonly )
__field( u64, reclaim_size )
__field( int, clamp )
__field( u64, global_reserved )
__field( u64, trans_reserved )
__field( u64, delayed_refs_reserved )
__field( u64, delayed_reserved )
__field( u64, free_chunk_space )
),
TP_fast_assign_btrfs(fs_info,
__entry->flags = sinfo->flags;
__entry->total_bytes = sinfo->total_bytes;
__entry->bytes_used = sinfo->bytes_used;
__entry->bytes_pinned = sinfo->bytes_pinned;
__entry->bytes_reserved = sinfo->bytes_reserved;
__entry->bytes_may_use = sinfo->bytes_may_use;
__entry->bytes_readonly = sinfo->bytes_readonly;
__entry->reclaim_size = sinfo->reclaim_size;
__entry->clamp = sinfo->clamp;
__entry->global_reserved = fs_info->global_block_rsv.reserved;
__entry->trans_reserved = fs_info->trans_block_rsv.reserved;
__entry->delayed_refs_reserved = fs_info->delayed_refs_rsv.reserved;
__entry->delayed_reserved = fs_info->delayed_block_rsv.reserved;
__entry->free_chunk_space = atomic64_read(&fs_info->free_chunk_space);
),
TP_printk_btrfs("flags=%s total_bytes=%llu bytes_used=%llu "
"bytes_pinned=%llu bytes_reserved=%llu "
"bytes_may_use=%llu bytes_readonly=%llu "
"reclaim_size=%llu clamp=%d global_reserved=%llu "
"trans_reserved=%llu delayed_refs_reserved=%llu "
"delayed_reserved=%llu chunk_free_space=%llu",
__print_flags(__entry->flags, "|", BTRFS_GROUP_FLAGS),
__entry->total_bytes, __entry->bytes_used,
__entry->bytes_pinned, __entry->bytes_reserved,
__entry->bytes_may_use, __entry->bytes_readonly,
__entry->reclaim_size, __entry->clamp,
__entry->global_reserved, __entry->trans_reserved,
__entry->delayed_refs_reserved,
__entry->delayed_reserved, __entry->free_chunk_space)
);
DEFINE_EVENT(btrfs_dump_space_info, btrfs_done_preemptive_reclaim,
TP_PROTO(const struct btrfs_fs_info *fs_info,
const struct btrfs_space_info *sinfo),
TP_ARGS(fs_info, sinfo)
);
TRACE_EVENT(btrfs_reserve_ticket,
TP_PROTO(const struct btrfs_fs_info *fs_info, u64 flags, u64 bytes,
u64 start_ns, int flush, int error),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment