linux/include/trace/events/nilfs2.h

225 lines
5.2 KiB
C
Raw Normal View History

nilfs2: add a tracepoint for tracking stage transition of segment construction This patch adds a tracepoint for tracking stage transition of block collection in segment construction. With the tracepoint, we can analysis the behavior of segment construction in depth. It would be useful for bottleneck detection and debugging, etc. The tracepoint is created with the standard trace API of linux (like ext3, ext4, f2fs and btrfs). So we can analysis with existing tools easily. Of course, more detailed analysis will be possible if we can create nilfs specific analysis tools. Below is an example of event dump with Brendan Gregg's perf-tools (https://github.com/brendangregg/perf-tools). Time consumption between each stage can be obtained. $ sudo bin/tpoint nilfs2:nilfs2_collection_stage_transition Tracing nilfs2:nilfs2_collection_stage_transition. Ctrl-C to end. segctord-14875 [003] ...1 28311.067794: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_INIT segctord-14875 [003] ...1 28311.068139: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_GC segctord-14875 [003] ...1 28311.068139: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_FILE segctord-14875 [003] ...1 28311.068486: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_IFILE segctord-14875 [003] ...1 28311.068540: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_CPFILE segctord-14875 [003] ...1 28311.068561: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_SUFILE segctord-14875 [003] ...1 28311.068565: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_DAT segctord-14875 [003] ...1 28311.068573: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_SR segctord-14875 [003] ...1 28311.068574: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_DONE For capturing transition correctly, this patch adds wrappers for the member scnt of nilfs_cstage. With this change, every transition of the stage can produce trace event in a correct manner. Signed-off-by: Hitoshi Mitake <mitake.hitoshi@lab.ntt.co.jp> Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-11-07 08:31:59 +08:00
#undef TRACE_SYSTEM
#define TRACE_SYSTEM nilfs2
#if !defined(_TRACE_NILFS2_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_NILFS2_H
#include <linux/tracepoint.h>
struct nilfs_sc_info;
#define show_collection_stage(type) \
__print_symbolic(type, \
{ NILFS_ST_INIT, "ST_INIT" }, \
{ NILFS_ST_GC, "ST_GC" }, \
{ NILFS_ST_FILE, "ST_FILE" }, \
{ NILFS_ST_IFILE, "ST_IFILE" }, \
{ NILFS_ST_CPFILE, "ST_CPFILE" }, \
{ NILFS_ST_SUFILE, "ST_SUFILE" }, \
{ NILFS_ST_DAT, "ST_DAT" }, \
{ NILFS_ST_SR, "ST_SR" }, \
{ NILFS_ST_DSYNC, "ST_DSYNC" }, \
{ NILFS_ST_DONE, "ST_DONE"})
TRACE_EVENT(nilfs2_collection_stage_transition,
TP_PROTO(struct nilfs_sc_info *sci),
TP_ARGS(sci),
TP_STRUCT__entry(
__field(void *, sci)
__field(int, stage)
),
TP_fast_assign(
__entry->sci = sci;
__entry->stage = sci->sc_stage.scnt;
),
TP_printk("sci = %p stage = %s",
__entry->sci,
show_collection_stage(__entry->stage))
);
nilfs2: add a tracepoint for transaction events This patch adds a tracepoint for transaction events of nilfs. With the tracepoint, these events can be tracked: begin, abort, commit, trylock, lock, and unlock. Basically, these events have corresponding functions e.g. begin event corresponds nilfs_transaction_begin(). The unlock event is an exception. It corresponds to the iteration in nilfs_transaction_lock(). Only one tracepoint is introcued: nilfs2_transaction_transition. The above events are distinguished with newly introduced enum. With this tracepoint, we can analyse a critical section of segment constructoin. Sample output by tpoint of perf-tools: cp-4457 [000] ...1 63.266220: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800bf5ccc58 count = 1 flags = 9 state = BEGIN cp-4457 [000] ...1 63.266221: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800bf5ccc58 count = 0 flags = 9 state = COMMIT cp-4457 [000] ...1 63.266221: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800bf5ccc58 count = 0 flags = 9 state = COMMIT segctord-4371 [001] ...1 68.261196: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800b889bdf8 count = 0 flags = 10 state = TRYLOCK segctord-4371 [001] ...1 68.261280: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800b889bdf8 count = 0 flags = 10 state = LOCK segctord-4371 [001] ...1 68.261877: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800b889bdf8 count = 1 flags = 10 state = BEGIN segctord-4371 [001] ...1 68.262116: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800b889bdf8 count = 0 flags = 18 state = COMMIT segctord-4371 [001] ...1 68.265032: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800b889bdf8 count = 0 flags = 18 state = UNLOCK segctord-4371 [001] ...1 132.376847: nilfs2_transaction_transition: sb = ffff8802112b8800 ti = ffff8800b889bdf8 count = 0 flags = 10 state = TRYLOCK This patch also does trivial cleaning of comma usage in collection stage transition event for consistent coding style. Signed-off-by: Hitoshi Mitake <mitake.hitoshi@lab.ntt.co.jp> Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-11-07 08:32:02 +08:00
#ifndef TRACE_HEADER_MULTI_READ
enum nilfs2_transaction_transition_state {
TRACE_NILFS2_TRANSACTION_BEGIN,
TRACE_NILFS2_TRANSACTION_COMMIT,
TRACE_NILFS2_TRANSACTION_ABORT,
TRACE_NILFS2_TRANSACTION_TRYLOCK,
TRACE_NILFS2_TRANSACTION_LOCK,
TRACE_NILFS2_TRANSACTION_UNLOCK,
};
#endif
#define show_transaction_state(type) \
__print_symbolic(type, \
{ TRACE_NILFS2_TRANSACTION_BEGIN, "BEGIN" }, \
{ TRACE_NILFS2_TRANSACTION_COMMIT, "COMMIT" }, \
{ TRACE_NILFS2_TRANSACTION_ABORT, "ABORT" }, \
{ TRACE_NILFS2_TRANSACTION_TRYLOCK, "TRYLOCK" }, \
{ TRACE_NILFS2_TRANSACTION_LOCK, "LOCK" }, \
{ TRACE_NILFS2_TRANSACTION_UNLOCK, "UNLOCK" })
TRACE_EVENT(nilfs2_transaction_transition,
TP_PROTO(struct super_block *sb,
struct nilfs_transaction_info *ti,
int count,
unsigned int flags,
enum nilfs2_transaction_transition_state state),
TP_ARGS(sb, ti, count, flags, state),
TP_STRUCT__entry(
__field(void *, sb)
__field(void *, ti)
__field(int, count)
__field(unsigned int, flags)
__field(int, state)
),
TP_fast_assign(
__entry->sb = sb;
__entry->ti = ti;
__entry->count = count;
__entry->flags = flags;
__entry->state = state;
),
TP_printk("sb = %p ti = %p count = %d flags = %x state = %s",
__entry->sb,
__entry->ti,
__entry->count,
__entry->flags,
show_transaction_state(__entry->state))
);
TRACE_EVENT(nilfs2_segment_usage_check,
TP_PROTO(struct inode *sufile,
__u64 segnum,
unsigned long cnt),
TP_ARGS(sufile, segnum, cnt),
TP_STRUCT__entry(
__field(struct inode *, sufile)
__field(__u64, segnum)
__field(unsigned long, cnt)
),
TP_fast_assign(
__entry->sufile = sufile;
__entry->segnum = segnum;
__entry->cnt = cnt;
),
TP_printk("sufile = %p segnum = %llu cnt = %lu",
__entry->sufile,
__entry->segnum,
__entry->cnt)
);
TRACE_EVENT(nilfs2_segment_usage_allocated,
TP_PROTO(struct inode *sufile,
__u64 segnum),
TP_ARGS(sufile, segnum),
TP_STRUCT__entry(
__field(struct inode *, sufile)
__field(__u64, segnum)
),
TP_fast_assign(
__entry->sufile = sufile;
__entry->segnum = segnum;
),
TP_printk("sufile = %p segnum = %llu",
__entry->sufile,
__entry->segnum)
);
TRACE_EVENT(nilfs2_segment_usage_freed,
TP_PROTO(struct inode *sufile,
__u64 segnum),
TP_ARGS(sufile, segnum),
TP_STRUCT__entry(
__field(struct inode *, sufile)
__field(__u64, segnum)
),
TP_fast_assign(
__entry->sufile = sufile;
__entry->segnum = segnum;
),
TP_printk("sufile = %p segnum = %llu",
__entry->sufile,
__entry->segnum)
);
TRACE_EVENT(nilfs2_mdt_insert_new_block,
TP_PROTO(struct inode *inode,
unsigned long ino,
unsigned long block),
TP_ARGS(inode, ino, block),
TP_STRUCT__entry(
__field(struct inode *, inode)
__field(unsigned long, ino)
__field(unsigned long, block)
),
TP_fast_assign(
__entry->inode = inode;
__entry->ino = ino;
__entry->block = block;
),
TP_printk("inode = %p ino = %lu block = %lu",
__entry->inode,
__entry->ino,
__entry->block)
);
TRACE_EVENT(nilfs2_mdt_submit_block,
TP_PROTO(struct inode *inode,
unsigned long ino,
unsigned long blkoff,
int mode),
TP_ARGS(inode, ino, blkoff, mode),
TP_STRUCT__entry(
__field(struct inode *, inode)
__field(unsigned long, ino)
__field(unsigned long, blkoff)
__field(int, mode)
),
TP_fast_assign(
__entry->inode = inode;
__entry->ino = ino;
__entry->blkoff = blkoff;
__entry->mode = mode;
),
TP_printk("inode = %p ino = %lu blkoff = %lu mode = %x",
__entry->inode,
__entry->ino,
__entry->blkoff,
__entry->mode)
);
nilfs2: add a tracepoint for tracking stage transition of segment construction This patch adds a tracepoint for tracking stage transition of block collection in segment construction. With the tracepoint, we can analysis the behavior of segment construction in depth. It would be useful for bottleneck detection and debugging, etc. The tracepoint is created with the standard trace API of linux (like ext3, ext4, f2fs and btrfs). So we can analysis with existing tools easily. Of course, more detailed analysis will be possible if we can create nilfs specific analysis tools. Below is an example of event dump with Brendan Gregg's perf-tools (https://github.com/brendangregg/perf-tools). Time consumption between each stage can be obtained. $ sudo bin/tpoint nilfs2:nilfs2_collection_stage_transition Tracing nilfs2:nilfs2_collection_stage_transition. Ctrl-C to end. segctord-14875 [003] ...1 28311.067794: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_INIT segctord-14875 [003] ...1 28311.068139: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_GC segctord-14875 [003] ...1 28311.068139: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_FILE segctord-14875 [003] ...1 28311.068486: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_IFILE segctord-14875 [003] ...1 28311.068540: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_CPFILE segctord-14875 [003] ...1 28311.068561: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_SUFILE segctord-14875 [003] ...1 28311.068565: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_DAT segctord-14875 [003] ...1 28311.068573: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_SR segctord-14875 [003] ...1 28311.068574: nilfs2_collection_stage_transition: sci = ffff8800ce6de000 stage = ST_DONE For capturing transition correctly, this patch adds wrappers for the member scnt of nilfs_cstage. With this change, every transition of the stage can produce trace event in a correct manner. Signed-off-by: Hitoshi Mitake <mitake.hitoshi@lab.ntt.co.jp> Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-11-07 08:31:59 +08:00
#endif /* _TRACE_NILFS2_H */
/* This part must be outside protection */
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE nilfs2
#include <trace/define_trace.h>