btrfs: tracepoints: add trace event for btrfs_sync_log()

btrfs_sync_log() is one of the main functions called during a fsync.
Add trace events for when entering and exiting that function.

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-05-14 16:11:43 +01:00
parent 8c2e738c61
commit 375336c17e
2 changed files with 100 additions and 0 deletions

View File

@ -3322,8 +3322,10 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
u64 log_root_level;
mutex_lock(&root->log_mutex);
trace_btrfs_sync_log_enter(trans, root, ctx);
log_transid = ctx->log_transid;
if (root->log_transid_committed >= log_transid) {
trace_btrfs_sync_log_exit(trans, root, ctx, ctx->log_ret);
mutex_unlock(&root->log_mutex);
return ctx->log_ret;
}
@ -3331,6 +3333,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
index1 = log_transid % 2;
if (atomic_read(&root->log_commit[index1])) {
wait_log_commit(root, log_transid);
trace_btrfs_sync_log_exit(trans, root, ctx, ctx->log_ret);
mutex_unlock(&root->log_mutex);
return ctx->log_ret;
}
@ -3359,6 +3362,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
/* bail out if we need to do a full commit */
if (btrfs_need_log_full_commit(trans)) {
ret = BTRFS_LOG_FORCE_COMMIT;
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
mutex_unlock(&root->log_mutex);
goto out;
}
@ -3385,6 +3389,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
if (ret == -EAGAIN && btrfs_is_zoned(fs_info))
ret = 0;
if (ret) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
blk_finish_plug(&plug);
btrfs_set_log_full_commit(trans);
mutex_unlock(&root->log_mutex);
@ -3422,6 +3427,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
if (!log_root_tree->node) {
ret = btrfs_alloc_log_tree_node(trans, log_root_tree);
if (ret) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
mutex_unlock(&fs_info->tree_root->log_mutex);
blk_finish_plug(&plug);
goto out;
@ -3445,6 +3451,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
*/
ret = update_log_root(trans, log, &new_root_item);
if (ret) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
list_del_init(&root_log_ctx.list);
blk_finish_plug(&plug);
btrfs_set_log_full_commit(trans);
@ -3462,6 +3469,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
list_del_init(&root_log_ctx.list);
mutex_unlock(&log_root_tree->log_mutex);
ret = root_log_ctx.log_ret;
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
goto out;
}
@ -3473,6 +3481,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
mutex_unlock(&log_root_tree->log_mutex);
if (!ret)
ret = root_log_ctx.log_ret;
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
goto out;
}
ASSERT(root_log_ctx.log_transid == log_root_tree->log_transid,
@ -3494,6 +3503,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
btrfs_wait_tree_log_extents(log, mark);
mutex_unlock(&log_root_tree->log_mutex);
ret = BTRFS_LOG_FORCE_COMMIT;
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
goto out_wake_log_root;
}
@ -3507,11 +3517,13 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
* deadlock. Bail out to the full commit instead.
*/
if (ret == -EAGAIN && btrfs_is_zoned(fs_info)) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
btrfs_set_log_full_commit(trans);
btrfs_wait_tree_log_extents(log, mark);
mutex_unlock(&log_root_tree->log_mutex);
goto out_wake_log_root;
} else if (ret) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
btrfs_set_log_full_commit(trans);
mutex_unlock(&log_root_tree->log_mutex);
goto out_wake_log_root;
@ -3521,6 +3533,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
ret = btrfs_wait_tree_log_extents(log_root_tree,
EXTENT_DIRTY_LOG1 | EXTENT_DIRTY_LOG2);
if (ret) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
btrfs_set_log_full_commit(trans);
mutex_unlock(&log_root_tree->log_mutex);
goto out_wake_log_root;
@ -3557,6 +3570,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
*/
if (unlikely(BTRFS_FS_ERROR(fs_info))) {
ret = -EIO;
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
btrfs_set_log_full_commit(trans);
btrfs_abort_transaction(trans, ret);
mutex_unlock(&fs_info->tree_log_mutex);
@ -3568,6 +3582,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
ret = write_all_supers(trans);
mutex_unlock(&fs_info->tree_log_mutex);
if (unlikely(ret)) {
trace_btrfs_sync_log_exit(trans, root, ctx, ret);
btrfs_set_log_full_commit(trans);
btrfs_abort_transaction(trans, ret);
goto out_wake_log_root;

View File

@ -1547,6 +1547,91 @@ TRACE_EVENT(btrfs_log_new_name_exit,
__entry->ino, __entry->old_dir_ino, __entry->ret)
);
/* Ideally call this while under root->log_mutex (but not always possible). */
TRACE_EVENT(btrfs_sync_log_enter,
TP_PROTO(const struct btrfs_trans_handle *trans,
const struct btrfs_root *root,
const struct btrfs_log_ctx *ctx),
TP_ARGS(trans, root, ctx),
TP_STRUCT__entry_btrfs(
__field( u64, root_objectid )
__field( u64, transid )
__field( int, ctx_log_transid )
__field( int, root_log_transid )
__field( int, log_transid_committed )
__field( bool, log_committing )
__field( bool, log_committing_prev )
__field( int, log_writers )
),
TP_fast_assign(
TP_fast_assign_fsid(trans->fs_info);
__entry->root_objectid = btrfs_root_id(root);
__entry->transid = trans->transid;
__entry->ctx_log_transid = ctx->log_transid;
__entry->root_log_transid = btrfs_get_root_log_transid(root);
__entry->log_transid_committed =
data_race(root->log_transid_committed);
__entry->log_committing =
atomic_read(&root->log_commit[ctx->log_transid % 2]);
__entry->log_committing_prev =
atomic_read(&root->log_commit[(ctx->log_transid + 1) % 2]);
__entry->log_writers = atomic_read(&root->log_writers);
),
TP_printk_btrfs("root=%llu(%s) transid=%llu ctx_log_transid=%d"
" root_log_transid=%d log_transid_committed=%d"
" log_committing=%d log_committing_prev=%d log_writers=%d",
show_root_type(__entry->root_objectid), __entry->transid,
__entry->ctx_log_transid, __entry->root_log_transid,
__entry->log_transid_committed, __entry->log_committing,
__entry->log_committing_prev, __entry->log_writers)
);
/*
* Ideally call this while under root->log_mutex and in the same critical
* section that calls the btrfs_sync_log_enter() trace event (though it's not
* always possible).
*/
TRACE_EVENT(btrfs_sync_log_exit,
TP_PROTO(const struct btrfs_trans_handle *trans,
const struct btrfs_root *root,
const struct btrfs_log_ctx *ctx,
int ret),
TP_ARGS(trans, root, ctx, ret),
TP_STRUCT__entry_btrfs(
__field( u64, root_objectid )
__field( u64, transid )
__field( int, ctx_log_transid )
__field( int, root_log_transid )
__field( int, log_transid_committed )
__field( int, ret )
),
TP_fast_assign(
TP_fast_assign_fsid(trans->fs_info);
__entry->root_objectid = btrfs_root_id(root);
__entry->transid = trans->transid;
__entry->ctx_log_transid = ctx->log_transid;
__entry->root_log_transid = btrfs_get_root_log_transid(root);
__entry->log_transid_committed =
data_race(root->log_transid_committed);
__entry->ret = ret;
),
TP_printk_btrfs("root=%llu(%s) transid=%llu ctx_log_transid=%d"
" root_log_transid=%d log_transid_committed=%d ret=%d",
show_root_type(__entry->root_objectid), __entry->transid,
__entry->ctx_log_transid, __entry->root_log_transid,
__entry->log_transid_committed, __entry->ret)
);
TRACE_EVENT(btrfs_sync_fs,
TP_PROTO(const struct btrfs_fs_info *fs_info, int wait),