btrfs: adjust the flush trace point to include the source
authorJosef Bacik <josef@toxicpanda.com>
Fri, 9 Oct 2020 13:28:28 +0000 (09:28 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Feb 2021 21:58:59 +0000 (22:58 +0100)
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 <nborisov@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/space-info.c
include/trace/events/btrfs.h

index e8acf08..bb4f85c 100644 (file)
@@ -673,7 +673,7 @@ enospc:
  */
 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;
@@ -756,7 +756,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;
 }
 
@@ -997,7 +997,7 @@ 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;
@@ -1132,7 +1132,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);
        }
@@ -1223,7 +1223,7 @@ 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;
@@ -1236,7 +1236,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;
@@ -1309,7 +1309,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) {
@@ -1325,7 +1326,7 @@ 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);
index 8a7c163..807921d 100644 (file)
@@ -1113,15 +1113,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, bool for_preempt),
 
-       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(       bool,    for_preempt             )
        ),
 
        TP_fast_assign_btrfs(fs_info,
@@ -1129,15 +1130,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,