Re: [PATCH v6 2/3] binder: add trace at free transaction.

2020-08-03 Thread Frankie Chang
On Mon, 2020-08-03 at 08:12 -0700, Todd Kjos wrote:
> On Sun, Aug 2, 2020 at 8:11 PM Frankie Chang  
> wrote:
> >
> > On Fri, 2020-07-31 at 11:50 -0700, Todd Kjos wrote:
> > > On Mon, Jul 27, 2020 at 8:28 PM Frankie Chang
> > >  wrote:
> > > >
> > > > From: "Frankie.Chang" 
> > > >
> > > > Since the original trace_binder_transaction_received cannot
> > > > precisely present the real finished time of transaction, adding a
> > > > trace_binder_txn_latency_free at the point of free transaction
> > > > may be more close to it.
> > > >
> > > > Signed-off-by: Frankie.Chang 
> > > > ---
> > > >  drivers/android/binder.c   |6 ++
> > > >  drivers/android/binder_trace.h |   27 +++
> > > >  2 files changed, 33 insertions(+)
> > > >
> > > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> > > > index 2df146f..1e6fc40 100644
> > > > --- a/drivers/android/binder.c
> > > > +++ b/drivers/android/binder.c
> > > > @@ -1522,6 +1522,9 @@ static void binder_free_transaction(struct 
> > > > binder_transaction *t)
> > > >  * If the transaction has no target_proc, then
> > > >  * t->buffer->transaction has already been cleared.
> > > >  */
> > > > +   spin_lock(>lock);
> > > > +   trace_binder_txn_latency_free(t);
> > > > +   spin_unlock(>lock);
> > >
> > > Hmm. I don't prefer taking the lock just to call a trace. It doesn't
> > > make clear why the lock has to be taken. I'd prefer something like:
> > >
> > > if (trace_binder_txn_latency_free_enabled()) {
> > c
> > > }
> > >
> > > And then the trace would use the passed-in values instead of accessing
> > > via t->to_proc/to_thread.
> > >
> > Then we still add lock protection in the hook function, when trace is
> > disable ?
> 
> I don't understand... in the example I gave, the trace doesn't get
> called if disabled. What do you mean to "add lock protection when the
> trace is disabled()"?
> 
> >
> > Or we also pass these to hook function, no matter the trace is enable or
> 
> What do you mean by "hook" function? If something has attached to the
> trace, then xxx_enabled() will return true.
> 
I'm sorry for that I misunderstand this XXX_enabled(). 

> > not.I think this way is more clear that the lock protects @from,
> > @to_proc and @to_thread.Then, there is no need to add the lock in hook
> > function.
> 
> Why is it clearer (other than the fact that I missed including t->from
> under the lock)?
> 
I think your example is clear enough.

> >
> > int from_proc, from_thread, to_proc, to_thread;
> >
> > spin_lock(>lock);
> > from_proc = t->from ? t->from->proc->pid : 0;
> > from_thread = t->from ? t->from->pid :0;
> > to_proc = t->to_proc ? t->to_proc->pid : 0;
> > to_thread = t->to_thread ? t->to_thread->pid : 0;
> > spin_unlock(>lock);
> > trace_binder_txn_latency_free(t, from_proc, from_thread, to_proc,
> > to_pid);
> 
> The main feedback is I'd like to see the fields dereferenced in the
> same context as the lock acquisition instead of acquiring the lock and
> calling the trace function, so this code would be fine. There will be
> very little contention for t->lock so using xxx_enabled() is optional.
> 
> Since trace_binder_txn_latency_free() is called twice,  it would make
> sense to have a helper function to do the above.
> 
Okay, I will make a helper function to do this in next version patch.
Very thanks for your help for this.

> >
> > > > binder_free_txn_fixups(t);
> > > > kfree(t);
> > > > binder_stats_deleted(BINDER_STAT_TRANSACTION);
> > > > @@ -3093,6 +3096,9 @@ static void binder_transaction(struct binder_proc 
> > > > *proc,
> > > > kfree(tcomplete);
> > > > binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
> > > >  err_alloc_tcomplete_failed:
> > > > +   spin_lock(>lock);
> > > > +   trace_binder_txn_latency_free(t);
> > > > +   spin_unlock(>lock);
> > > > kfree(t);
> > > > binder_stats_deleted(BINDER_STAT_TRANSACTION);
> > > >  err_alloc_t_failed:
> > > > diff --git a/drivers/android/binder_trace.h 
> > > > b/drivers/android/binder_trace.h
> > > > index 6731c3c..8ac87d1 100644
> > > > --- a/drivers/android/binder_trace.h
> > > > +++ b/drivers/android/binder_trace.h
> > > > @@ -95,6 +95,33 @@
> > > >   __entry->thread_todo)
> > > >  );
> > > >
> > > > +TRACE_EVENT(binder_txn_latency_free,
> > > > +   TP_PROTO(struct binder_transaction *t),
> > > > +   TP_ARGS(t),
> > > > +   TP_STRUCT__entry(
> > > > +   __field(int, debug_id)
> > > > +   __field(int, from_proc)
> > > > +   __field(int, from_thread)
> > > > +   __field(int, to_proc)
> > > > +   __field(int, to_thread)
> > > > +   __field(unsigned int, code)
> > > > +   __field(unsigned int, flags)
> > > > +   ),
> > > > +   TP_fast_assign(
> > > > +   __entry->debug_id = t->debug_id;
> > > > +   __entry->from_proc 

Re: [PATCH v6 2/3] binder: add trace at free transaction.

2020-08-03 Thread Todd Kjos
On Sun, Aug 2, 2020 at 8:11 PM Frankie Chang  wrote:
>
> On Fri, 2020-07-31 at 11:50 -0700, Todd Kjos wrote:
> > On Mon, Jul 27, 2020 at 8:28 PM Frankie Chang
> >  wrote:
> > >
> > > From: "Frankie.Chang" 
> > >
> > > Since the original trace_binder_transaction_received cannot
> > > precisely present the real finished time of transaction, adding a
> > > trace_binder_txn_latency_free at the point of free transaction
> > > may be more close to it.
> > >
> > > Signed-off-by: Frankie.Chang 
> > > ---
> > >  drivers/android/binder.c   |6 ++
> > >  drivers/android/binder_trace.h |   27 +++
> > >  2 files changed, 33 insertions(+)
> > >
> > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> > > index 2df146f..1e6fc40 100644
> > > --- a/drivers/android/binder.c
> > > +++ b/drivers/android/binder.c
> > > @@ -1522,6 +1522,9 @@ static void binder_free_transaction(struct 
> > > binder_transaction *t)
> > >  * If the transaction has no target_proc, then
> > >  * t->buffer->transaction has already been cleared.
> > >  */
> > > +   spin_lock(>lock);
> > > +   trace_binder_txn_latency_free(t);
> > > +   spin_unlock(>lock);
> >
> > Hmm. I don't prefer taking the lock just to call a trace. It doesn't
> > make clear why the lock has to be taken. I'd prefer something like:
> >
> > if (trace_binder_txn_latency_free_enabled()) {
> c
> > }
> >
> > And then the trace would use the passed-in values instead of accessing
> > via t->to_proc/to_thread.
> >
> Then we still add lock protection in the hook function, when trace is
> disable ?

I don't understand... in the example I gave, the trace doesn't get
called if disabled. What do you mean to "add lock protection when the
trace is disabled()"?

>
> Or we also pass these to hook function, no matter the trace is enable or

What do you mean by "hook" function? If something has attached to the
trace, then xxx_enabled() will return true.

> not.I think this way is more clear that the lock protects @from,
> @to_proc and @to_thread.Then, there is no need to add the lock in hook
> function.

Why is it clearer (other than the fact that I missed including t->from
under the lock)?

>
> int from_proc, from_thread, to_proc, to_thread;
>
> spin_lock(>lock);
> from_proc = t->from ? t->from->proc->pid : 0;
> from_thread = t->from ? t->from->pid :0;
> to_proc = t->to_proc ? t->to_proc->pid : 0;
> to_thread = t->to_thread ? t->to_thread->pid : 0;
> spin_unlock(>lock);
> trace_binder_txn_latency_free(t, from_proc, from_thread, to_proc,
> to_pid);

The main feedback is I'd like to see the fields dereferenced in the
same context as the lock acquisition instead of acquiring the lock and
calling the trace function, so this code would be fine. There will be
very little contention for t->lock so using xxx_enabled() is optional.

Since trace_binder_txn_latency_free() is called twice,  it would make
sense to have a helper function to do the above.

>
> > > binder_free_txn_fixups(t);
> > > kfree(t);
> > > binder_stats_deleted(BINDER_STAT_TRANSACTION);
> > > @@ -3093,6 +3096,9 @@ static void binder_transaction(struct binder_proc 
> > > *proc,
> > > kfree(tcomplete);
> > > binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
> > >  err_alloc_tcomplete_failed:
> > > +   spin_lock(>lock);
> > > +   trace_binder_txn_latency_free(t);
> > > +   spin_unlock(>lock);
> > > kfree(t);
> > > binder_stats_deleted(BINDER_STAT_TRANSACTION);
> > >  err_alloc_t_failed:
> > > diff --git a/drivers/android/binder_trace.h 
> > > b/drivers/android/binder_trace.h
> > > index 6731c3c..8ac87d1 100644
> > > --- a/drivers/android/binder_trace.h
> > > +++ b/drivers/android/binder_trace.h
> > > @@ -95,6 +95,33 @@
> > >   __entry->thread_todo)
> > >  );
> > >
> > > +TRACE_EVENT(binder_txn_latency_free,
> > > +   TP_PROTO(struct binder_transaction *t),
> > > +   TP_ARGS(t),
> > > +   TP_STRUCT__entry(
> > > +   __field(int, debug_id)
> > > +   __field(int, from_proc)
> > > +   __field(int, from_thread)
> > > +   __field(int, to_proc)
> > > +   __field(int, to_thread)
> > > +   __field(unsigned int, code)
> > > +   __field(unsigned int, flags)
> > > +   ),
> > > +   TP_fast_assign(
> > > +   __entry->debug_id = t->debug_id;
> > > +   __entry->from_proc = t->from ? t->from->proc->pid : 0;
> > > +   __entry->from_thread = t->from ? t->from->pid : 0;
> > > +   __entry->to_proc = t->to_proc ? t->to_proc->pid : 0;
> > > +   __entry->to_thread = t->to_thread ? t->to_thread->pid : 0;
> > > +   __entry->code = t->code;
> > > +   __entry->flags = t->flags;
> > > +   ),
> > > +   TP_printk("transaction=%d from %d:%d to %d:%d flags=0x%x 
> > > code=0x%x",
> > > + 

Re: [PATCH v6 2/3] binder: add trace at free transaction.

2020-08-02 Thread Frankie Chang
On Fri, 2020-07-31 at 11:50 -0700, Todd Kjos wrote:
> On Mon, Jul 27, 2020 at 8:28 PM Frankie Chang
>  wrote:
> >
> > From: "Frankie.Chang" 
> >
> > Since the original trace_binder_transaction_received cannot
> > precisely present the real finished time of transaction, adding a
> > trace_binder_txn_latency_free at the point of free transaction
> > may be more close to it.
> >
> > Signed-off-by: Frankie.Chang 
> > ---
> >  drivers/android/binder.c   |6 ++
> >  drivers/android/binder_trace.h |   27 +++
> >  2 files changed, 33 insertions(+)
> >
> > diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> > index 2df146f..1e6fc40 100644
> > --- a/drivers/android/binder.c
> > +++ b/drivers/android/binder.c
> > @@ -1522,6 +1522,9 @@ static void binder_free_transaction(struct 
> > binder_transaction *t)
> >  * If the transaction has no target_proc, then
> >  * t->buffer->transaction has already been cleared.
> >  */
> > +   spin_lock(>lock);
> > +   trace_binder_txn_latency_free(t);
> > +   spin_unlock(>lock);
> 
> Hmm. I don't prefer taking the lock just to call a trace. It doesn't
> make clear why the lock has to be taken. I'd prefer something like:
> 
> if (trace_binder_txn_latency_free_enabled()) {
c
> }
> 
> And then the trace would use the passed-in values instead of accessing
> via t->to_proc/to_thread.
> 
Then we still add lock protection in the hook function, when trace is
disable ?

Or we also pass these to hook function, no matter the trace is enable or
not.I think this way is more clear that the lock protects @from,
@to_proc and @to_thread.Then, there is no need to add the lock in hook
function.

int from_proc, from_thread, to_proc, to_thread;
 
spin_lock(>lock);
from_proc = t->from ? t->from->proc->pid : 0;
from_thread = t->from ? t->from->pid :0;
to_proc = t->to_proc ? t->to_proc->pid : 0;
to_thread = t->to_thread ? t->to_thread->pid : 0;
spin_unlock(>lock);
trace_binder_txn_latency_free(t, from_proc, from_thread, to_proc,
to_pid);

> > binder_free_txn_fixups(t);
> > kfree(t);
> > binder_stats_deleted(BINDER_STAT_TRANSACTION);
> > @@ -3093,6 +3096,9 @@ static void binder_transaction(struct binder_proc 
> > *proc,
> > kfree(tcomplete);
> > binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
> >  err_alloc_tcomplete_failed:
> > +   spin_lock(>lock);
> > +   trace_binder_txn_latency_free(t);
> > +   spin_unlock(>lock);
> > kfree(t);
> > binder_stats_deleted(BINDER_STAT_TRANSACTION);
> >  err_alloc_t_failed:
> > diff --git a/drivers/android/binder_trace.h b/drivers/android/binder_trace.h
> > index 6731c3c..8ac87d1 100644
> > --- a/drivers/android/binder_trace.h
> > +++ b/drivers/android/binder_trace.h
> > @@ -95,6 +95,33 @@
> >   __entry->thread_todo)
> >  );
> >
> > +TRACE_EVENT(binder_txn_latency_free,
> > +   TP_PROTO(struct binder_transaction *t),
> > +   TP_ARGS(t),
> > +   TP_STRUCT__entry(
> > +   __field(int, debug_id)
> > +   __field(int, from_proc)
> > +   __field(int, from_thread)
> > +   __field(int, to_proc)
> > +   __field(int, to_thread)
> > +   __field(unsigned int, code)
> > +   __field(unsigned int, flags)
> > +   ),
> > +   TP_fast_assign(
> > +   __entry->debug_id = t->debug_id;
> > +   __entry->from_proc = t->from ? t->from->proc->pid : 0;
> > +   __entry->from_thread = t->from ? t->from->pid : 0;
> > +   __entry->to_proc = t->to_proc ? t->to_proc->pid : 0;
> > +   __entry->to_thread = t->to_thread ? t->to_thread->pid : 0;
> > +   __entry->code = t->code;
> > +   __entry->flags = t->flags;
> > +   ),
> > +   TP_printk("transaction=%d from %d:%d to %d:%d flags=0x%x code=0x%x",
> > + __entry->debug_id, __entry->from_proc, 
> > __entry->from_thread,
> > + __entry->to_proc, __entry->to_thread, __entry->code,
> > + __entry->flags)
> > +);
> > +
> >  TRACE_EVENT(binder_transaction,
> > TP_PROTO(bool reply, struct binder_transaction *t,
> >  struct binder_node *target_node),
> > --
> > 1.7.9.5



Re: [PATCH v6 2/3] binder: add trace at free transaction.

2020-07-31 Thread Todd Kjos
On Mon, Jul 27, 2020 at 8:28 PM Frankie Chang
 wrote:
>
> From: "Frankie.Chang" 
>
> Since the original trace_binder_transaction_received cannot
> precisely present the real finished time of transaction, adding a
> trace_binder_txn_latency_free at the point of free transaction
> may be more close to it.
>
> Signed-off-by: Frankie.Chang 
> ---
>  drivers/android/binder.c   |6 ++
>  drivers/android/binder_trace.h |   27 +++
>  2 files changed, 33 insertions(+)
>
> diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> index 2df146f..1e6fc40 100644
> --- a/drivers/android/binder.c
> +++ b/drivers/android/binder.c
> @@ -1522,6 +1522,9 @@ static void binder_free_transaction(struct 
> binder_transaction *t)
>  * If the transaction has no target_proc, then
>  * t->buffer->transaction has already been cleared.
>  */
> +   spin_lock(>lock);
> +   trace_binder_txn_latency_free(t);
> +   spin_unlock(>lock);

Hmm. I don't prefer taking the lock just to call a trace. It doesn't
make clear why the lock has to be taken. I'd prefer something like:

if (trace_binder_txn_latency_free_enabled()) {
  int to_proc, to_thread;

  spin_lock(>lock);
  to_proc = t->to_proc ? t->to_proc->pid : 0;
  to_thread = t->to_thread ? t->to_thread->pid : 0;
  spin_unlock(>lock);
  trace_binder_txn_latency_free(t, to_proc, to_pid);
}

And then the trace would use the passed-in values instead of accessing
via t->to_proc/to_thread.

> binder_free_txn_fixups(t);
> kfree(t);
> binder_stats_deleted(BINDER_STAT_TRANSACTION);
> @@ -3093,6 +3096,9 @@ static void binder_transaction(struct binder_proc *proc,
> kfree(tcomplete);
> binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
>  err_alloc_tcomplete_failed:
> +   spin_lock(>lock);
> +   trace_binder_txn_latency_free(t);
> +   spin_unlock(>lock);
> kfree(t);
> binder_stats_deleted(BINDER_STAT_TRANSACTION);
>  err_alloc_t_failed:
> diff --git a/drivers/android/binder_trace.h b/drivers/android/binder_trace.h
> index 6731c3c..8ac87d1 100644
> --- a/drivers/android/binder_trace.h
> +++ b/drivers/android/binder_trace.h
> @@ -95,6 +95,33 @@
>   __entry->thread_todo)
>  );
>
> +TRACE_EVENT(binder_txn_latency_free,
> +   TP_PROTO(struct binder_transaction *t),
> +   TP_ARGS(t),
> +   TP_STRUCT__entry(
> +   __field(int, debug_id)
> +   __field(int, from_proc)
> +   __field(int, from_thread)
> +   __field(int, to_proc)
> +   __field(int, to_thread)
> +   __field(unsigned int, code)
> +   __field(unsigned int, flags)
> +   ),
> +   TP_fast_assign(
> +   __entry->debug_id = t->debug_id;
> +   __entry->from_proc = t->from ? t->from->proc->pid : 0;
> +   __entry->from_thread = t->from ? t->from->pid : 0;
> +   __entry->to_proc = t->to_proc ? t->to_proc->pid : 0;
> +   __entry->to_thread = t->to_thread ? t->to_thread->pid : 0;
> +   __entry->code = t->code;
> +   __entry->flags = t->flags;
> +   ),
> +   TP_printk("transaction=%d from %d:%d to %d:%d flags=0x%x code=0x%x",
> + __entry->debug_id, __entry->from_proc, __entry->from_thread,
> + __entry->to_proc, __entry->to_thread, __entry->code,
> + __entry->flags)
> +);
> +
>  TRACE_EVENT(binder_transaction,
> TP_PROTO(bool reply, struct binder_transaction *t,
>  struct binder_node *target_node),
> --
> 1.7.9.5


[PATCH v6 2/3] binder: add trace at free transaction.

2020-07-27 Thread Frankie Chang
From: "Frankie.Chang" 

Since the original trace_binder_transaction_received cannot
precisely present the real finished time of transaction, adding a
trace_binder_txn_latency_free at the point of free transaction
may be more close to it.

Signed-off-by: Frankie.Chang 
---
 drivers/android/binder.c   |6 ++
 drivers/android/binder_trace.h |   27 +++
 2 files changed, 33 insertions(+)

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 2df146f..1e6fc40 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -1522,6 +1522,9 @@ static void binder_free_transaction(struct 
binder_transaction *t)
 * If the transaction has no target_proc, then
 * t->buffer->transaction has already been cleared.
 */
+   spin_lock(>lock);
+   trace_binder_txn_latency_free(t);
+   spin_unlock(>lock);
binder_free_txn_fixups(t);
kfree(t);
binder_stats_deleted(BINDER_STAT_TRANSACTION);
@@ -3093,6 +3096,9 @@ static void binder_transaction(struct binder_proc *proc,
kfree(tcomplete);
binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
 err_alloc_tcomplete_failed:
+   spin_lock(>lock);
+   trace_binder_txn_latency_free(t);
+   spin_unlock(>lock);
kfree(t);
binder_stats_deleted(BINDER_STAT_TRANSACTION);
 err_alloc_t_failed:
diff --git a/drivers/android/binder_trace.h b/drivers/android/binder_trace.h
index 6731c3c..8ac87d1 100644
--- a/drivers/android/binder_trace.h
+++ b/drivers/android/binder_trace.h
@@ -95,6 +95,33 @@
  __entry->thread_todo)
 );
 
+TRACE_EVENT(binder_txn_latency_free,
+   TP_PROTO(struct binder_transaction *t),
+   TP_ARGS(t),
+   TP_STRUCT__entry(
+   __field(int, debug_id)
+   __field(int, from_proc)
+   __field(int, from_thread)
+   __field(int, to_proc)
+   __field(int, to_thread)
+   __field(unsigned int, code)
+   __field(unsigned int, flags)
+   ),
+   TP_fast_assign(
+   __entry->debug_id = t->debug_id;
+   __entry->from_proc = t->from ? t->from->proc->pid : 0;
+   __entry->from_thread = t->from ? t->from->pid : 0;
+   __entry->to_proc = t->to_proc ? t->to_proc->pid : 0;
+   __entry->to_thread = t->to_thread ? t->to_thread->pid : 0;
+   __entry->code = t->code;
+   __entry->flags = t->flags;
+   ),
+   TP_printk("transaction=%d from %d:%d to %d:%d flags=0x%x code=0x%x",
+ __entry->debug_id, __entry->from_proc, __entry->from_thread,
+ __entry->to_proc, __entry->to_thread, __entry->code,
+ __entry->flags)
+);
+
 TRACE_EVENT(binder_transaction,
TP_PROTO(bool reply, struct binder_transaction *t,
 struct binder_node *target_node),
-- 
1.7.9.5