On Fri, Oct 09, 2020 at 09:28:28AM -0400, Josef Bacik wrote:
> Since we have normal ticketed flushing and preemptive flushing, adjust
> the tracepoint so that we know the source of the flushing action to make
> it easier to debug problems.
>
> Reviewed-by: Nikolay Borisov <[email protected]>
> Signed-off-by: Josef Bacik <[email protected]>
> ---
> fs/btrfs/space-info.c | 20 ++++++++++++--------
> include/trace/events/btrfs.h | 10 ++++++----
> 2 files changed, 18 insertions(+), 12 deletions(-)
>
> diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c
> index 5ee698c12a7b..30474fa30985 100644
> --- a/fs/btrfs/space-info.c
> +++ b/fs/btrfs/space-info.c
> @@ -664,7 +664,7 @@ static int may_commit_transaction(struct btrfs_fs_info
> *fs_info,
> */
> static void flush_space(struct btrfs_fs_info *fs_info,
> struct btrfs_space_info *space_info, u64 num_bytes,
> - enum btrfs_flush_state state)
> + enum btrfs_flush_state state, bool for_preempt)
> {
> struct btrfs_root *root = fs_info->extent_root;
> struct btrfs_trans_handle *trans;
> @@ -747,7 +747,7 @@ static void flush_space(struct btrfs_fs_info *fs_info,
> }
>
> trace_btrfs_flush_space(fs_info, space_info->flags, num_bytes, state,
> - ret);
> + ret, for_preempt);
> return;
> }
>
> @@ -973,7 +973,8 @@ static void btrfs_async_reclaim_metadata_space(struct
> work_struct *work)
>
> flush_state = FLUSH_DELAYED_ITEMS_NR;
> do {
> - flush_space(fs_info, space_info, to_reclaim, flush_state);
> + flush_space(fs_info, space_info, to_reclaim, flush_state,
> + false);
> spin_lock(&space_info->lock);
> if (list_empty(&space_info->tickets)) {
> space_info->flush = 0;
> @@ -1109,7 +1110,7 @@ static void btrfs_preempt_reclaim_metadata_space(struct
> work_struct *work)
> to_reclaim >>= 2;
> if (!to_reclaim)
> to_reclaim = btrfs_calc_insert_metadata_size(fs_info,
> 1);
> - flush_space(fs_info, space_info, to_reclaim, flush);
> + flush_space(fs_info, space_info, to_reclaim, flush, true);
> cond_resched();
> spin_lock(&space_info->lock);
> }
> @@ -1200,7 +1201,8 @@ static void btrfs_async_reclaim_data_space(struct
> work_struct *work)
> spin_unlock(&space_info->lock);
>
> while (!space_info->full) {
> - flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE);
> + flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE,
> + false);
> spin_lock(&space_info->lock);
> if (list_empty(&space_info->tickets)) {
> space_info->flush = 0;
> @@ -1213,7 +1215,7 @@ static void btrfs_async_reclaim_data_space(struct
> work_struct *work)
>
> while (flush_state < ARRAY_SIZE(data_flush_states)) {
> flush_space(fs_info, space_info, U64_MAX,
> - data_flush_states[flush_state]);
> + data_flush_states[flush_state], false);
> spin_lock(&space_info->lock);
> if (list_empty(&space_info->tickets)) {
> space_info->flush = 0;
> @@ -1286,7 +1288,8 @@ static void priority_reclaim_metadata_space(struct
> btrfs_fs_info *fs_info,
>
> flush_state = 0;
> do {
> - flush_space(fs_info, space_info, to_reclaim,
> states[flush_state]);
> + flush_space(fs_info, space_info, to_reclaim,
> states[flush_state],
> + false);
> flush_state++;
> spin_lock(&space_info->lock);
> if (ticket->bytes == 0) {
> @@ -1302,7 +1305,8 @@ static void priority_reclaim_data_space(struct
> btrfs_fs_info *fs_info,
> struct reserve_ticket *ticket)
> {
> while (!space_info->full) {
> - flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE);
> + flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE,
> + false);
> spin_lock(&space_info->lock);
> if (ticket->bytes == 0) {
> spin_unlock(&space_info->lock);
> diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
> index 0a3d35d952c4..6d93637bae02 100644
> --- a/include/trace/events/btrfs.h
> +++ b/include/trace/events/btrfs.h
> @@ -1112,15 +1112,16 @@ TRACE_EVENT(btrfs_trigger_flush,
> TRACE_EVENT(btrfs_flush_space,
>
> TP_PROTO(const struct btrfs_fs_info *fs_info, u64 flags, u64 num_bytes,
> - int state, int ret),
> + int state, int ret, int for_preempt),
for_preempt should be bool
>
> - TP_ARGS(fs_info, flags, num_bytes, state, ret),
> + TP_ARGS(fs_info, flags, num_bytes, state, ret, for_preempt),
>
> TP_STRUCT__entry_btrfs(
> __field( u64, flags )
> __field( u64, num_bytes )
> __field( int, state )
> __field( int, ret )
> + __field( int, for_preempt )
> ),
>
> TP_fast_assign_btrfs(fs_info,
> @@ -1128,15 +1129,16 @@ TRACE_EVENT(btrfs_flush_space,
> __entry->num_bytes = num_bytes;
> __entry->state = state;
> __entry->ret = ret;
> + __entry->for_preempt = for_preempt;
> ),
>
> - TP_printk_btrfs("state=%d(%s) flags=%llu(%s) num_bytes=%llu ret=%d",
> + TP_printk_btrfs("state=%d(%s) flags=%llu(%s) num_bytes=%llu ret=%d
> for_preempt=%d",
> __entry->state,
> __print_symbolic(__entry->state, FLUSH_STATES),
> __entry->flags,
> __print_flags((unsigned long)__entry->flags, "|",
> BTRFS_GROUP_FLAGS),
> - __entry->num_bytes, __entry->ret)
> + __entry->num_bytes, __entry->ret, __entry->for_preempt)
> );
>
> DECLARE_EVENT_CLASS(btrfs__reserved_extent,
> --
> 2.26.2