btrfs: tracepoints: trace transaction states during commit phase

Currently the trace event is fired only when a transaction is fully
complete (its state is TRANS_STATE_COMPLETED). However during a
transaction commit we go through several states and as soon as the
state reaches TRANS_STATE_UNBLOCKED, another transaction can start.
Therefore it's useful to track every transaction state changed during
the commit of a transaction, so that we can see if a new transaction
is started before the current one is completed. Add the transaction
state to the transaction commit event and call the event everytime
we change the transaction state during commit.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Filipe Manana
2026-04-23 17:05:23 +01:00
committed by David Sterba
parent 99314d7cc7
commit 17819dc282
2 changed files with 21 additions and 4 deletions

View File

@@ -105,6 +105,15 @@ struct btrfs_transaction;
EM( COMMIT_TRANS, "COMMIT_TRANS") \
EMe(RESET_ZONES, "RESET_ZONES")
#define TRANSACTION_STATES \
EM( TRANS_STATE_RUNNING, "TRANS_STATE_RUNNING") \
EM( TRANS_STATE_COMMIT_PREP, "TRANS_STATE_COMMIT_PREP") \
EM( TRANS_STATE_COMMIT_START, "TRANS_STATE_COMMIT_START") \
EM( TRANS_STATE_COMMIT_DOING, "TRANS_STATE_COMMIT_DOING") \
EM( TRANS_STATE_UNBLOCKED, "TRANS_STATE_UNBLOCKED") \
EM( TRANS_STATE_SUPER_COMMITTED, "TRANS_STATE_SUPER_COMMITTED") \
EMe(TRANS_STATE_COMPLETED, "TRANS_STATE_COMPLETED")
/*
* First define the enums in the above macros to be exported to userspace via
* TRACE_DEFINE_ENUM().
@@ -120,6 +129,7 @@ FI_TYPES
QGROUP_RSV_TYPES
IO_TREE_OWNER
FLUSH_STATES
TRANSACTION_STATES
/*
* Now redefine the EM and EMe macros to map the enums to the strings that will
@@ -208,15 +218,18 @@ TRACE_EVENT(btrfs_transaction_commit,
TP_STRUCT__entry_btrfs(
__field( u64, generation )
__field( bool, in_fsync )
__field( int, state )
),
TP_fast_assign_btrfs(trans->fs_info,
__entry->generation = trans->transid;
__entry->in_fsync = trans->in_fsync;
__entry->state = trans->transaction->state;
),
TP_printk_btrfs("gen=%llu in_fsync=%d", __entry->generation,
__entry->in_fsync)
TP_printk_btrfs("gen=%llu in_fsync=%d state=%d(%s)", __entry->generation,
__entry->in_fsync, __entry->state,
__print_symbolic(__entry->state, TRANSACTION_STATES))
);
TRACE_EVENT(btrfs_transaction_abort,