btrfs: Add trace for btrfs_workqueue alloc/destroy

Since most of the btrfs_workqueue is printed as pointer address,
for easier analysis, add trace for btrfs_workqueue alloc/destroy.
So it is possible to determine the workqueue that a given work belongs
to(by comparing the wq pointer address with alloc trace event).

Signed-off-by: Qu Wenruo <quenruo@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
Qu Wenruo 2014-03-12 08:05:33 +00:00 committed by Chris Mason
parent f094c9bd3e
commit c3a468915a
3 changed files with 61 additions and 3 deletions

View File

@ -56,7 +56,8 @@ struct btrfs_workqueue {
}; };
static inline struct __btrfs_workqueue static inline struct __btrfs_workqueue
*__btrfs_alloc_workqueue(char *name, int flags, int max_active, int thresh) *__btrfs_alloc_workqueue(const char *name, int flags, int max_active,
int thresh)
{ {
struct __btrfs_workqueue *ret = kzalloc(sizeof(*ret), GFP_NOFS); struct __btrfs_workqueue *ret = kzalloc(sizeof(*ret), GFP_NOFS);
@ -92,13 +93,14 @@ static inline struct __btrfs_workqueue
INIT_LIST_HEAD(&ret->ordered_list); INIT_LIST_HEAD(&ret->ordered_list);
spin_lock_init(&ret->list_lock); spin_lock_init(&ret->list_lock);
spin_lock_init(&ret->thres_lock); spin_lock_init(&ret->thres_lock);
trace_btrfs_workqueue_alloc(ret, name, flags & WQ_HIGHPRI);
return ret; return ret;
} }
static inline void static inline void
__btrfs_destroy_workqueue(struct __btrfs_workqueue *wq); __btrfs_destroy_workqueue(struct __btrfs_workqueue *wq);
struct btrfs_workqueue *btrfs_alloc_workqueue(char *name, struct btrfs_workqueue *btrfs_alloc_workqueue(const char *name,
int flags, int flags,
int max_active, int max_active,
int thresh) int thresh)
@ -305,6 +307,7 @@ static inline void
__btrfs_destroy_workqueue(struct __btrfs_workqueue *wq) __btrfs_destroy_workqueue(struct __btrfs_workqueue *wq)
{ {
destroy_workqueue(wq->normal_wq); destroy_workqueue(wq->normal_wq);
trace_btrfs_workqueue_destroy(wq);
kfree(wq); kfree(wq);
} }

View File

@ -38,7 +38,7 @@ struct btrfs_work {
unsigned long flags; unsigned long flags;
}; };
struct btrfs_workqueue *btrfs_alloc_workqueue(char *name, struct btrfs_workqueue *btrfs_alloc_workqueue(const char *name,
int flags, int flags,
int max_active, int max_active,
int thresh); int thresh);

View File

@ -22,6 +22,7 @@ struct btrfs_free_cluster;
struct map_lookup; struct map_lookup;
struct extent_buffer; struct extent_buffer;
struct btrfs_work; struct btrfs_work;
struct __btrfs_workqueue;
#define show_ref_type(type) \ #define show_ref_type(type) \
__print_symbolic(type, \ __print_symbolic(type, \
@ -1063,6 +1064,60 @@ DEFINE_EVENT(btrfs__work, btrfs_ordered_sched,
TP_ARGS(work) TP_ARGS(work)
); );
DECLARE_EVENT_CLASS(btrfs__workqueue,
TP_PROTO(struct __btrfs_workqueue *wq, const char *name, int high),
TP_ARGS(wq, name, high),
TP_STRUCT__entry(
__field( void *, wq )
__string( name, name )
__field( int , high )
),
TP_fast_assign(
__entry->wq = wq;
__assign_str(name, name);
__entry->high = high;
),
TP_printk("name=%s%s, wq=%p", __get_str(name),
__print_flags(__entry->high, "",
{(WQ_HIGHPRI), "-high"}),
__entry->wq)
);
DEFINE_EVENT(btrfs__workqueue, btrfs_workqueue_alloc,
TP_PROTO(struct __btrfs_workqueue *wq, const char *name, int high),
TP_ARGS(wq, name, high)
);
DECLARE_EVENT_CLASS(btrfs__workqueue_done,
TP_PROTO(struct __btrfs_workqueue *wq),
TP_ARGS(wq),
TP_STRUCT__entry(
__field( void *, wq )
),
TP_fast_assign(
__entry->wq = wq;
),
TP_printk("wq=%p", __entry->wq)
);
DEFINE_EVENT(btrfs__workqueue_done, btrfs_workqueue_destroy,
TP_PROTO(struct __btrfs_workqueue *wq),
TP_ARGS(wq)
);
#endif /* _TRACE_BTRFS_H */ #endif /* _TRACE_BTRFS_H */