Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81fb6f77 authored by Qu Wenruo's avatar Qu Wenruo Committed by Chris Mason
Browse files

btrfs: qgroup: Add new trace point for qgroup data reserve



Now each qgroup reserve for data will has its ftrace event for better
debugging.

Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent b9d0b389
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -2516,10 +2516,12 @@ int btrfs_qgroup_reserve_data(struct inode *inode, u64 start, u64 len)

	changeset.bytes_changed = 0;
	changeset.range_changed = ulist_alloc(GFP_NOFS);

	ret = set_record_extent_bits(&BTRFS_I(inode)->io_tree, start,
			start + len -1, EXTENT_QGROUP_RESERVED, GFP_NOFS,
			&changeset);
	trace_btrfs_qgroup_reserve_data(inode, start, len,
					changeset.bytes_changed,
					QGROUP_RESERVE);
	if (ret < 0)
		goto cleanup;
	ret = qgroup_reserve(root, changeset.bytes_changed);
@@ -2544,6 +2546,7 @@ static int __btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len,
				       int free)
{
	struct extent_changeset changeset;
	int trace_op = QGROUP_RELEASE;
	int ret;

	changeset.bytes_changed = 0;
@@ -2557,8 +2560,12 @@ static int __btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len,
	if (ret < 0)
		goto out;

	if (free)
	if (free) {
		qgroup_free(BTRFS_I(inode)->root, changeset.bytes_changed);
		trace_op = QGROUP_FREE;
	}
	trace_btrfs_qgroup_release_data(inode, start, len,
					changeset.bytes_changed, trace_op);
out:
	ulist_free(changeset.range_changed);
	return ret;
+8 −0
Original line number Diff line number Diff line
@@ -33,6 +33,13 @@ struct btrfs_qgroup_extent_record {
	struct ulist *old_roots;
};

/*
 * For qgroup event trace points only
 */
#define QGROUP_RESERVE		(1<<0)
#define QGROUP_RELEASE		(1<<1)
#define QGROUP_FREE		(1<<2)

int btrfs_quota_enable(struct btrfs_trans_handle *trans,
		       struct btrfs_fs_info *fs_info);
int btrfs_quota_disable(struct btrfs_trans_handle *trans,
@@ -81,6 +88,7 @@ static inline void btrfs_qgroup_free_delayed_ref(struct btrfs_fs_info *fs_info,
						 u64 ref_root, u64 num_bytes)
{
	btrfs_qgroup_free_refroot(fs_info, ref_root, num_bytes);
	trace_btrfs_qgroup_free_delayed_ref(ref_root, num_bytes);
}
void assert_qgroups_uptodate(struct btrfs_trans_handle *trans);

+113 −0
Original line number Diff line number Diff line
@@ -1117,6 +1117,119 @@ DEFINE_EVENT(btrfs__workqueue_done, btrfs_workqueue_destroy,
	TP_ARGS(wq)
);

DECLARE_EVENT_CLASS(btrfs__qgroup_data_map,

	TP_PROTO(struct inode *inode, u64 free_reserved),

	TP_ARGS(inode, free_reserved),

	TP_STRUCT__entry(
		__field(	u64,		rootid		)
		__field(	unsigned long,	ino		)
		__field(	u64,		free_reserved	)
	),

	TP_fast_assign(
		__entry->rootid		=	BTRFS_I(inode)->root->objectid;
		__entry->ino		=	inode->i_ino;
		__entry->free_reserved	=	free_reserved;
	),

	TP_printk("rootid=%llu, ino=%lu, free_reserved=%llu",
		  __entry->rootid, __entry->ino, __entry->free_reserved)
);

DEFINE_EVENT(btrfs__qgroup_data_map, btrfs_qgroup_init_data_rsv_map,

	TP_PROTO(struct inode *inode, u64 free_reserved),

	TP_ARGS(inode, free_reserved)
);

DEFINE_EVENT(btrfs__qgroup_data_map, btrfs_qgroup_free_data_rsv_map,

	TP_PROTO(struct inode *inode, u64 free_reserved),

	TP_ARGS(inode, free_reserved)
);

#define BTRFS_QGROUP_OPERATIONS				\
	{ QGROUP_RESERVE,	"reserve"	},	\
	{ QGROUP_RELEASE,	"release"	},	\
	{ QGROUP_FREE,		"free"		}

DECLARE_EVENT_CLASS(btrfs__qgroup_rsv_data,

	TP_PROTO(struct inode *inode, u64 start, u64 len, u64 reserved, int op),

	TP_ARGS(inode, start, len, reserved, op),

	TP_STRUCT__entry(
		__field(	u64,		rootid		)
		__field(	unsigned long,	ino		)
		__field(	u64,		start		)
		__field(	u64,		len		)
		__field(	u64,		reserved	)
		__field(	int,		op		)
	),

	TP_fast_assign(
		__entry->rootid		= BTRFS_I(inode)->root->objectid;
		__entry->ino		= inode->i_ino;
		__entry->start		= start;
		__entry->len		= len;
		__entry->reserved	= reserved;
		__entry->op		= op;
	),

	TP_printk("root=%llu, ino=%lu, start=%llu, len=%llu, reserved=%llu, op=%s",
		  __entry->rootid, __entry->ino, __entry->start, __entry->len,
		  __entry->reserved,
		  __print_flags((unsigned long)__entry->op, "",
				BTRFS_QGROUP_OPERATIONS)
	)
);

DEFINE_EVENT(btrfs__qgroup_rsv_data, btrfs_qgroup_reserve_data,

	TP_PROTO(struct inode *inode, u64 start, u64 len, u64 reserved, int op),

	TP_ARGS(inode, start, len, reserved, op)
);

DEFINE_EVENT(btrfs__qgroup_rsv_data, btrfs_qgroup_release_data,

	TP_PROTO(struct inode *inode, u64 start, u64 len, u64 reserved, int op),

	TP_ARGS(inode, start, len, reserved, op)
);

DECLARE_EVENT_CLASS(btrfs__qgroup_delayed_ref,

	TP_PROTO(u64 ref_root, u64 reserved),

	TP_ARGS(ref_root, reserved),

	TP_STRUCT__entry(
		__field(	u64,		ref_root	)
		__field(	u64,		reserved	)
	),

	TP_fast_assign(
		__entry->ref_root	= ref_root;
		__entry->reserved	= reserved;
	),

	TP_printk("root=%llu, reserved=%llu, op=free",
		  __entry->ref_root, __entry->reserved)
);

DEFINE_EVENT(btrfs__qgroup_delayed_ref, btrfs_qgroup_free_delayed_ref,

	TP_PROTO(u64 ref_root, u64 reserved),

	TP_ARGS(ref_root, reserved)
);
#endif /* _TRACE_BTRFS_H */

/* This part must be outside protection */