mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
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:
parent
f094c9bd3e
commit
c3a468915a
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user