Re: [PATCH tracepoints] nilfs2: add a tracepoint for transaction events

2014-09-25 Thread Hitoshi Mitake
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

2014-09-24 Thread Ryusuke Konishi
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

2014-09-24 Thread Hitoshi Mitake
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