Re: [PATCH tracepoints] nilfs2: add a tracepoint for transaction events
On Thu, Sep 25, 2014 at 12:22 AM, Ryusuke Konishi wrote: > On Wed, 24 Sep 2014 23:18:31 +0900, Mitake Hitoshi wrote: >> 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] ...163.266220: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, >> count = 1, flags = 9 state = BEGIN >> cp-4457 [000] ...163.266221: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, >> count = 0, flags = 9 state = COMMIT >> cp-4457 [000] ...163.266221: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, >> count = 0, flags = 9 state = COMMIT >> segctord-4371 [001] ...168.261196: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, >> count = 0, flags = 10 state = TRYLOCK >> segctord-4371 [001] ...168.261280: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, >> count = 0, flags = 10 state = LOCK >> segctord-4371 [001] ...168.261877: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, >> count = 1, flags = 10 state = BEGIN >> segctord-4371 [001] ...168.262116: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, >> count = 0, flags = 18 state = COMMIT >> segctord-4371 [001] ...168.265032: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, >> count = 0, flags = 18 state = UNLOCK >> segctord-4371 [001] ...1 132.376847: >> nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, >> count = 0, flags = 10 state = TRYLOCK >> >> Signed-off-by: Hitoshi Mitake >> --- >> fs/nilfs2/segment.c | 33 ++- >> include/trace/events/nilfs2.h | 53 >> +++ >> 2 files changed, 85 insertions(+), 1 deletion(-) >> >> diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c >> index 0fcf8e7..1dd9330 100644 >> --- a/fs/nilfs2/segment.c >> +++ b/fs/nilfs2/segment.c >> @@ -213,11 +213,18 @@ int nilfs_transaction_begin(struct super_block *sb, >> { >> struct the_nilfs *nilfs; >> int ret = nilfs_prepare_segment_lock(ti); >> + struct nilfs_transaction_info *trace_ti; >> >> if (unlikely(ret < 0)) >> return ret; >> - if (ret > 0) >> + if (ret > 0) { >> + trace_ti = current->journal_info; >> + >> + trace_nilfs2_transaction_transition(sb, trace_ti, >> + trace_ti->ti_count, trace_ti->ti_flags, >> + TRACE_NILFS2_TRANSACTION_BEGIN); >> return 0; >> + } >> >> sb_start_intwrite(sb); >> >> @@ -228,6 +235,11 @@ int nilfs_transaction_begin(struct super_block *sb, >> ret = -ENOSPC; >> goto failed; >> } >> + >> + trace_ti = current->journal_info; >> + trace_nilfs2_transaction_transition(sb, trace_ti, trace_ti->ti_count, >> + trace_ti->ti_flags, >> + TRACE_NILFS2_TRANSACTION_BEGIN); >> return 0; >> >> failed: >> @@ -260,6 +272,8 @@ int nilfs_transaction_commit(struct super_block *sb) >> ti->ti_flags |= NILFS_TI_COMMIT; >> if (ti->ti_count > 0) { >> ti->ti_count--; >> + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, >> + ti->ti_flags, TRACE_NILFS2_TRANSACTION_COMMIT); >> return 0; >> } >> if (nilfs->ns_writer) { >> @@ -271,6 +285,9 @@ int nilfs_transaction_commit(struct super_block *sb) >> nilfs_segctor_do_flush(sci, 0); >> } >> up_read(&nilfs->ns_segctor_sem); >> + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, >> + ti->ti_flags, TRACE_NILFS2_TRANSACTION_COMMIT); >> + >> current->journal_info = ti->ti_save; >> >> if (ti->ti_flags & NILFS_TI_SYNC) >> @@ -289,10 +306,15 @@ void nilfs_transaction_abort(struct super_block *sb) >> BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); >> if (ti->ti_count > 0) { >> ti->ti_count--; >> + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, >> + ti->
Re: [PATCH tracepoints] nilfs2: add a tracepoint for transaction events
On Wed, 24 Sep 2014 23:18:31 +0900, Mitake Hitoshi wrote: > 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] ...163.266220: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, > count = 1, flags = 9 state = BEGIN > cp-4457 [000] ...163.266221: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, > count = 0, flags = 9 state = COMMIT > cp-4457 [000] ...163.266221: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, > count = 0, flags = 9 state = COMMIT > segctord-4371 [001] ...168.261196: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, > count = 0, flags = 10 state = TRYLOCK > segctord-4371 [001] ...168.261280: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, > count = 0, flags = 10 state = LOCK > segctord-4371 [001] ...168.261877: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, > count = 1, flags = 10 state = BEGIN > segctord-4371 [001] ...168.262116: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, > count = 0, flags = 18 state = COMMIT > segctord-4371 [001] ...168.265032: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, > count = 0, flags = 18 state = UNLOCK > segctord-4371 [001] ...1 132.376847: > nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, > count = 0, flags = 10 state = TRYLOCK > > Signed-off-by: Hitoshi Mitake > --- > fs/nilfs2/segment.c | 33 ++- > include/trace/events/nilfs2.h | 53 > +++ > 2 files changed, 85 insertions(+), 1 deletion(-) > > diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c > index 0fcf8e7..1dd9330 100644 > --- a/fs/nilfs2/segment.c > +++ b/fs/nilfs2/segment.c > @@ -213,11 +213,18 @@ int nilfs_transaction_begin(struct super_block *sb, > { > struct the_nilfs *nilfs; > int ret = nilfs_prepare_segment_lock(ti); > + struct nilfs_transaction_info *trace_ti; > > if (unlikely(ret < 0)) > return ret; > - if (ret > 0) > + if (ret > 0) { > + trace_ti = current->journal_info; > + > + trace_nilfs2_transaction_transition(sb, trace_ti, > + trace_ti->ti_count, trace_ti->ti_flags, > + TRACE_NILFS2_TRANSACTION_BEGIN); > return 0; > + } > > sb_start_intwrite(sb); > > @@ -228,6 +235,11 @@ int nilfs_transaction_begin(struct super_block *sb, > ret = -ENOSPC; > goto failed; > } > + > + trace_ti = current->journal_info; > + trace_nilfs2_transaction_transition(sb, trace_ti, trace_ti->ti_count, > + trace_ti->ti_flags, > + TRACE_NILFS2_TRANSACTION_BEGIN); > return 0; > > failed: > @@ -260,6 +272,8 @@ int nilfs_transaction_commit(struct super_block *sb) > ti->ti_flags |= NILFS_TI_COMMIT; > if (ti->ti_count > 0) { > ti->ti_count--; > + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, > + ti->ti_flags, TRACE_NILFS2_TRANSACTION_COMMIT); > return 0; > } > if (nilfs->ns_writer) { > @@ -271,6 +285,9 @@ int nilfs_transaction_commit(struct super_block *sb) > nilfs_segctor_do_flush(sci, 0); > } > up_read(&nilfs->ns_segctor_sem); > + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, > + ti->ti_flags, TRACE_NILFS2_TRANSACTION_COMMIT); > + > current->journal_info = ti->ti_save; > > if (ti->ti_flags & NILFS_TI_SYNC) > @@ -289,10 +306,15 @@ void nilfs_transaction_abort(struct super_block *sb) > BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); > if (ti->ti_count > 0) { > ti->ti_count--; > + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, > + ti->ti_flags, TRACE_NILFS2_TRANSACTION_ABORT); > return; > } > up_read(&nilfs->ns_segctor_sem); > > + trace_nilfs2_transaction
[PATCH tracepoints] 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] ...163.266220: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, count = 1, flags = 9 state = BEGIN cp-4457 [000] ...163.266221: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, count = 0, flags = 9 state = COMMIT cp-4457 [000] ...163.266221: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800bf5ccc58, count = 0, flags = 9 state = COMMIT segctord-4371 [001] ...168.261196: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, count = 0, flags = 10 state = TRYLOCK segctord-4371 [001] ...168.261280: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, count = 0, flags = 10 state = LOCK segctord-4371 [001] ...168.261877: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, count = 1, flags = 10 state = BEGIN segctord-4371 [001] ...168.262116: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, count = 0, flags = 18 state = COMMIT segctord-4371 [001] ...168.265032: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, count = 0, flags = 18 state = UNLOCK segctord-4371 [001] ...1 132.376847: nilfs2_transaction_transition: sb = 8802112b8800, ti = 8800b889bdf8, count = 0, flags = 10 state = TRYLOCK Signed-off-by: Hitoshi Mitake --- fs/nilfs2/segment.c | 33 ++- include/trace/events/nilfs2.h | 53 +++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 0fcf8e7..1dd9330 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c @@ -213,11 +213,18 @@ int nilfs_transaction_begin(struct super_block *sb, { struct the_nilfs *nilfs; int ret = nilfs_prepare_segment_lock(ti); + struct nilfs_transaction_info *trace_ti; if (unlikely(ret < 0)) return ret; - if (ret > 0) + if (ret > 0) { + trace_ti = current->journal_info; + + trace_nilfs2_transaction_transition(sb, trace_ti, + trace_ti->ti_count, trace_ti->ti_flags, + TRACE_NILFS2_TRANSACTION_BEGIN); return 0; + } sb_start_intwrite(sb); @@ -228,6 +235,11 @@ int nilfs_transaction_begin(struct super_block *sb, ret = -ENOSPC; goto failed; } + + trace_ti = current->journal_info; + trace_nilfs2_transaction_transition(sb, trace_ti, trace_ti->ti_count, + trace_ti->ti_flags, + TRACE_NILFS2_TRANSACTION_BEGIN); return 0; failed: @@ -260,6 +272,8 @@ int nilfs_transaction_commit(struct super_block *sb) ti->ti_flags |= NILFS_TI_COMMIT; if (ti->ti_count > 0) { ti->ti_count--; + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, + ti->ti_flags, TRACE_NILFS2_TRANSACTION_COMMIT); return 0; } if (nilfs->ns_writer) { @@ -271,6 +285,9 @@ int nilfs_transaction_commit(struct super_block *sb) nilfs_segctor_do_flush(sci, 0); } up_read(&nilfs->ns_segctor_sem); + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, + ti->ti_flags, TRACE_NILFS2_TRANSACTION_COMMIT); + current->journal_info = ti->ti_save; if (ti->ti_flags & NILFS_TI_SYNC) @@ -289,10 +306,15 @@ void nilfs_transaction_abort(struct super_block *sb) BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); if (ti->ti_count > 0) { ti->ti_count--; + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, + ti->ti_flags, TRACE_NILFS2_TRANSACTION_ABORT); return; } up_read(&nilfs->ns_segctor_sem); + trace_nilfs2_transaction_transition(sb, ti, ti->ti_count, + ti->ti_flags, TRACE_NILFS2_TRANSACTION_ABORT); + current->journal_info = ti->ti_save; if (ti->ti_flags & NILFS_TI_DYNAMIC_ALL