2019-08-27 20:43:40

by Hridya Valsaraju

[permalink] [raw]
Subject: [PATCH 3/4] binder: Make transaction_log available in binderfs

Currently, the binder transaction log files 'transaction_log'
and 'failed_transaction_log' live in debugfs at the following locations:

/sys/kernel/debug/binder/failed_transaction_log
/sys/kernel/debug/binder/transaction_log

This patch makes these files also available in a binderfs instance
mounted with the mount option "stats=global".
It does not affect the presence of these files in debugfs.
If a binderfs instance is mounted at path /dev/binderfs, the location of
these files will be as follows:

/dev/binderfs/binder_logs/failed_transaction_log
/dev/binderfs/binder_logs/transaction_log

This change provides an alternate option to access these files when
debugfs is not mounted.

Signed-off-by: Hridya Valsaraju <[email protected]>
---
drivers/android/binder.c | 34 +++++--------------------------
drivers/android/binder_internal.h | 30 +++++++++++++++++++++++++++
drivers/android/binderfs.c | 19 +++++++++++++++++
3 files changed, 54 insertions(+), 29 deletions(-)

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index de795bd229c4..bed217310197 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -197,30 +197,8 @@ static inline void binder_stats_created(enum binder_stat_types type)
atomic_inc(&binder_stats.obj_created[type]);
}

-struct binder_transaction_log_entry {
- int debug_id;
- int debug_id_done;
- int call_type;
- int from_proc;
- int from_thread;
- int target_handle;
- int to_proc;
- int to_thread;
- int to_node;
- int data_size;
- int offsets_size;
- int return_error_line;
- uint32_t return_error;
- uint32_t return_error_param;
- const char *context_name;
-};
-struct binder_transaction_log {
- atomic_t cur;
- bool full;
- struct binder_transaction_log_entry entry[32];
-};
-static struct binder_transaction_log binder_transaction_log;
-static struct binder_transaction_log binder_transaction_log_failed;
+struct binder_transaction_log binder_transaction_log;
+struct binder_transaction_log binder_transaction_log_failed;

static struct binder_transaction_log_entry *binder_transaction_log_add(
struct binder_transaction_log *log)
@@ -6166,7 +6144,7 @@ static void print_binder_transaction_log_entry(struct seq_file *m,
"\n" : " (incomplete)\n");
}

-static int transaction_log_show(struct seq_file *m, void *unused)
+int binder_transaction_log_show(struct seq_file *m, void *unused)
{
struct binder_transaction_log *log = m->private;
unsigned int log_cur = atomic_read(&log->cur);
@@ -6198,8 +6176,6 @@ const struct file_operations binder_fops = {
.release = binder_release,
};

-DEFINE_SHOW_ATTRIBUTE(transaction_log);
-
static int __init init_binder_device(const char *name)
{
int ret;
@@ -6268,12 +6244,12 @@ static int __init binder_init(void)
0444,
binder_debugfs_dir_entry_root,
&binder_transaction_log,
- &transaction_log_fops);
+ &binder_transaction_log_fops);
debugfs_create_file("failed_transaction_log",
0444,
binder_debugfs_dir_entry_root,
&binder_transaction_log_failed,
- &transaction_log_fops);
+ &binder_transaction_log_fops);
}

if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) &&
diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h
index 12ef96f256c6..b9be42d9464c 100644
--- a/drivers/android/binder_internal.h
+++ b/drivers/android/binder_internal.h
@@ -65,4 +65,34 @@ DEFINE_SHOW_ATTRIBUTE(binder_state);

int binder_transactions_show(struct seq_file *m, void *unused);
DEFINE_SHOW_ATTRIBUTE(binder_transactions);
+
+int binder_transaction_log_show(struct seq_file *m, void *unused);
+DEFINE_SHOW_ATTRIBUTE(binder_transaction_log);
+
+struct binder_transaction_log_entry {
+ int debug_id;
+ int debug_id_done;
+ int call_type;
+ int from_proc;
+ int from_thread;
+ int target_handle;
+ int to_proc;
+ int to_thread;
+ int to_node;
+ int data_size;
+ int offsets_size;
+ int return_error_line;
+ uint32_t return_error;
+ uint32_t return_error_param;
+ const char *context_name;
+};
+
+struct binder_transaction_log {
+ atomic_t cur;
+ bool full;
+ struct binder_transaction_log_entry entry[32];
+};
+
+extern struct binder_transaction_log binder_transaction_log;
+extern struct binder_transaction_log binder_transaction_log_failed;
#endif /* _LINUX_BINDER_INTERNAL_H */
diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c
index d542f9b8d8ab..dc25a7d759c9 100644
--- a/drivers/android/binderfs.c
+++ b/drivers/android/binderfs.c
@@ -630,8 +630,27 @@ static int init_binder_logs(struct super_block *sb)

file_dentry = binderfs_create_file(binder_logs_root_dir, "transactions",
&binder_transactions_fops, NULL);
+ if (IS_ERR(file_dentry)) {
+ ret = PTR_ERR(file_dentry);
+ goto out;
+ }
+
+ file_dentry = binderfs_create_file(binder_logs_root_dir,
+ "transaction_log",
+ &binder_transaction_log_fops,
+ &binder_transaction_log);
+ if (IS_ERR(file_dentry)) {
+ ret = PTR_ERR(file_dentry);
+ goto out;
+ }
+
+ file_dentry = binderfs_create_file(binder_logs_root_dir,
+ "failed_transaction_log",
+ &binder_transaction_log_fops,
+ &binder_transaction_log_failed);
if (IS_ERR(file_dentry))
ret = PTR_ERR(file_dentry);
+
out:
return ret;
}
--
2.23.0.187.g17f5b7556c-goog


2019-08-28 13:01:31

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH 3/4] binder: Make transaction_log available in binderfs

On Tue, Aug 27, 2019 at 01:41:51PM -0700, Hridya Valsaraju wrote:
> Currently, the binder transaction log files 'transaction_log'
> and 'failed_transaction_log' live in debugfs at the following locations:
>
> /sys/kernel/debug/binder/failed_transaction_log
> /sys/kernel/debug/binder/transaction_log
>
> This patch makes these files also available in a binderfs instance
> mounted with the mount option "stats=global".
> It does not affect the presence of these files in debugfs.
> If a binderfs instance is mounted at path /dev/binderfs, the location of
> these files will be as follows:
>
> /dev/binderfs/binder_logs/failed_transaction_log
> /dev/binderfs/binder_logs/transaction_log
>
> This change provides an alternate option to access these files when
> debugfs is not mounted.
>
> Signed-off-by: Hridya Valsaraju <[email protected]>

Acked-by: Christian Brauner <[email protected]>

> ---
> drivers/android/binder.c | 34 +++++--------------------------
> drivers/android/binder_internal.h | 30 +++++++++++++++++++++++++++
> drivers/android/binderfs.c | 19 +++++++++++++++++
> 3 files changed, 54 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> index de795bd229c4..bed217310197 100644
> --- a/drivers/android/binder.c
> +++ b/drivers/android/binder.c
> @@ -197,30 +197,8 @@ static inline void binder_stats_created(enum binder_stat_types type)
> atomic_inc(&binder_stats.obj_created[type]);
> }
>
> -struct binder_transaction_log_entry {
> - int debug_id;
> - int debug_id_done;
> - int call_type;
> - int from_proc;
> - int from_thread;
> - int target_handle;
> - int to_proc;
> - int to_thread;
> - int to_node;
> - int data_size;
> - int offsets_size;
> - int return_error_line;
> - uint32_t return_error;
> - uint32_t return_error_param;
> - const char *context_name;
> -};
> -struct binder_transaction_log {
> - atomic_t cur;
> - bool full;
> - struct binder_transaction_log_entry entry[32];
> -};
> -static struct binder_transaction_log binder_transaction_log;
> -static struct binder_transaction_log binder_transaction_log_failed;
> +struct binder_transaction_log binder_transaction_log;
> +struct binder_transaction_log binder_transaction_log_failed;
>
> static struct binder_transaction_log_entry *binder_transaction_log_add(
> struct binder_transaction_log *log)
> @@ -6166,7 +6144,7 @@ static void print_binder_transaction_log_entry(struct seq_file *m,
> "\n" : " (incomplete)\n");
> }
>
> -static int transaction_log_show(struct seq_file *m, void *unused)
> +int binder_transaction_log_show(struct seq_file *m, void *unused)
> {
> struct binder_transaction_log *log = m->private;
> unsigned int log_cur = atomic_read(&log->cur);
> @@ -6198,8 +6176,6 @@ const struct file_operations binder_fops = {
> .release = binder_release,
> };
>
> -DEFINE_SHOW_ATTRIBUTE(transaction_log);
> -
> static int __init init_binder_device(const char *name)
> {
> int ret;
> @@ -6268,12 +6244,12 @@ static int __init binder_init(void)
> 0444,
> binder_debugfs_dir_entry_root,
> &binder_transaction_log,
> - &transaction_log_fops);
> + &binder_transaction_log_fops);
> debugfs_create_file("failed_transaction_log",
> 0444,
> binder_debugfs_dir_entry_root,
> &binder_transaction_log_failed,
> - &transaction_log_fops);
> + &binder_transaction_log_fops);
> }
>
> if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) &&
> diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h
> index 12ef96f256c6..b9be42d9464c 100644
> --- a/drivers/android/binder_internal.h
> +++ b/drivers/android/binder_internal.h
> @@ -65,4 +65,34 @@ DEFINE_SHOW_ATTRIBUTE(binder_state);
>
> int binder_transactions_show(struct seq_file *m, void *unused);
> DEFINE_SHOW_ATTRIBUTE(binder_transactions);
> +
> +int binder_transaction_log_show(struct seq_file *m, void *unused);
> +DEFINE_SHOW_ATTRIBUTE(binder_transaction_log);
> +
> +struct binder_transaction_log_entry {
> + int debug_id;
> + int debug_id_done;
> + int call_type;
> + int from_proc;
> + int from_thread;
> + int target_handle;
> + int to_proc;
> + int to_thread;
> + int to_node;
> + int data_size;
> + int offsets_size;
> + int return_error_line;
> + uint32_t return_error;
> + uint32_t return_error_param;
> + const char *context_name;
> +};
> +
> +struct binder_transaction_log {
> + atomic_t cur;
> + bool full;
> + struct binder_transaction_log_entry entry[32];
> +};
> +
> +extern struct binder_transaction_log binder_transaction_log;
> +extern struct binder_transaction_log binder_transaction_log_failed;
> #endif /* _LINUX_BINDER_INTERNAL_H */
> diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c
> index d542f9b8d8ab..dc25a7d759c9 100644
> --- a/drivers/android/binderfs.c
> +++ b/drivers/android/binderfs.c
> @@ -630,8 +630,27 @@ static int init_binder_logs(struct super_block *sb)
>
> file_dentry = binderfs_create_file(binder_logs_root_dir, "transactions",
> &binder_transactions_fops, NULL);
> + if (IS_ERR(file_dentry)) {
> + ret = PTR_ERR(file_dentry);
> + goto out;
> + }
> +
> + file_dentry = binderfs_create_file(binder_logs_root_dir,
> + "transaction_log",
> + &binder_transaction_log_fops,
> + &binder_transaction_log);
> + if (IS_ERR(file_dentry)) {
> + ret = PTR_ERR(file_dentry);
> + goto out;
> + }
> +
> + file_dentry = binderfs_create_file(binder_logs_root_dir,
> + "failed_transaction_log",
> + &binder_transaction_log_fops,
> + &binder_transaction_log_failed);
> if (IS_ERR(file_dentry))
> ret = PTR_ERR(file_dentry);
> +
> out:
> return ret;
> }
> --
> 2.23.0.187.g17f5b7556c-goog
>

2019-08-28 16:07:28

by Todd Kjos

[permalink] [raw]
Subject: Re: [PATCH 3/4] binder: Make transaction_log available in binderfs

On Wed, Aug 28, 2019 at 5:59 AM Christian Brauner
<[email protected]> wrote:
>
> On Tue, Aug 27, 2019 at 01:41:51PM -0700, Hridya Valsaraju wrote:
> > Currently, the binder transaction log files 'transaction_log'
> > and 'failed_transaction_log' live in debugfs at the following locations:
> >
> > /sys/kernel/debug/binder/failed_transaction_log
> > /sys/kernel/debug/binder/transaction_log
> >
> > This patch makes these files also available in a binderfs instance
> > mounted with the mount option "stats=global".
> > It does not affect the presence of these files in debugfs.
> > If a binderfs instance is mounted at path /dev/binderfs, the location of
> > these files will be as follows:
> >
> > /dev/binderfs/binder_logs/failed_transaction_log
> > /dev/binderfs/binder_logs/transaction_log
> >
> > This change provides an alternate option to access these files when
> > debugfs is not mounted.
> >
> > Signed-off-by: Hridya Valsaraju <[email protected]>
>
> Acked-by: Christian Brauner <[email protected]>

Acked-by: Todd Kjos <[email protected]>

>
> > ---
> > drivers/android/binder.c | 34 +++++--------------------------
> > drivers/android/binder_internal.h | 30 +++++++++++++++++++++++++++
> > drivers/android/binderfs.c | 19 +++++++++++++++++
> > 3 files changed, 54 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/android/binder.c b/drivers/android/binder.c
> > index de795bd229c4..bed217310197 100644
> > --- a/drivers/android/binder.c
> > +++ b/drivers/android/binder.c
> > @@ -197,30 +197,8 @@ static inline void binder_stats_created(enum binder_stat_types type)
> > atomic_inc(&binder_stats.obj_created[type]);
> > }
> >
> > -struct binder_transaction_log_entry {
> > - int debug_id;
> > - int debug_id_done;
> > - int call_type;
> > - int from_proc;
> > - int from_thread;
> > - int target_handle;
> > - int to_proc;
> > - int to_thread;
> > - int to_node;
> > - int data_size;
> > - int offsets_size;
> > - int return_error_line;
> > - uint32_t return_error;
> > - uint32_t return_error_param;
> > - const char *context_name;
> > -};
> > -struct binder_transaction_log {
> > - atomic_t cur;
> > - bool full;
> > - struct binder_transaction_log_entry entry[32];
> > -};
> > -static struct binder_transaction_log binder_transaction_log;
> > -static struct binder_transaction_log binder_transaction_log_failed;
> > +struct binder_transaction_log binder_transaction_log;
> > +struct binder_transaction_log binder_transaction_log_failed;
> >
> > static struct binder_transaction_log_entry *binder_transaction_log_add(
> > struct binder_transaction_log *log)
> > @@ -6166,7 +6144,7 @@ static void print_binder_transaction_log_entry(struct seq_file *m,
> > "\n" : " (incomplete)\n");
> > }
> >
> > -static int transaction_log_show(struct seq_file *m, void *unused)
> > +int binder_transaction_log_show(struct seq_file *m, void *unused)
> > {
> > struct binder_transaction_log *log = m->private;
> > unsigned int log_cur = atomic_read(&log->cur);
> > @@ -6198,8 +6176,6 @@ const struct file_operations binder_fops = {
> > .release = binder_release,
> > };
> >
> > -DEFINE_SHOW_ATTRIBUTE(transaction_log);
> > -
> > static int __init init_binder_device(const char *name)
> > {
> > int ret;
> > @@ -6268,12 +6244,12 @@ static int __init binder_init(void)
> > 0444,
> > binder_debugfs_dir_entry_root,
> > &binder_transaction_log,
> > - &transaction_log_fops);
> > + &binder_transaction_log_fops);
> > debugfs_create_file("failed_transaction_log",
> > 0444,
> > binder_debugfs_dir_entry_root,
> > &binder_transaction_log_failed,
> > - &transaction_log_fops);
> > + &binder_transaction_log_fops);
> > }
> >
> > if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) &&
> > diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h
> > index 12ef96f256c6..b9be42d9464c 100644
> > --- a/drivers/android/binder_internal.h
> > +++ b/drivers/android/binder_internal.h
> > @@ -65,4 +65,34 @@ DEFINE_SHOW_ATTRIBUTE(binder_state);
> >
> > int binder_transactions_show(struct seq_file *m, void *unused);
> > DEFINE_SHOW_ATTRIBUTE(binder_transactions);
> > +
> > +int binder_transaction_log_show(struct seq_file *m, void *unused);
> > +DEFINE_SHOW_ATTRIBUTE(binder_transaction_log);
> > +
> > +struct binder_transaction_log_entry {
> > + int debug_id;
> > + int debug_id_done;
> > + int call_type;
> > + int from_proc;
> > + int from_thread;
> > + int target_handle;
> > + int to_proc;
> > + int to_thread;
> > + int to_node;
> > + int data_size;
> > + int offsets_size;
> > + int return_error_line;
> > + uint32_t return_error;
> > + uint32_t return_error_param;
> > + const char *context_name;
> > +};
> > +
> > +struct binder_transaction_log {
> > + atomic_t cur;
> > + bool full;
> > + struct binder_transaction_log_entry entry[32];
> > +};
> > +
> > +extern struct binder_transaction_log binder_transaction_log;
> > +extern struct binder_transaction_log binder_transaction_log_failed;
> > #endif /* _LINUX_BINDER_INTERNAL_H */
> > diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c
> > index d542f9b8d8ab..dc25a7d759c9 100644
> > --- a/drivers/android/binderfs.c
> > +++ b/drivers/android/binderfs.c
> > @@ -630,8 +630,27 @@ static int init_binder_logs(struct super_block *sb)
> >
> > file_dentry = binderfs_create_file(binder_logs_root_dir, "transactions",
> > &binder_transactions_fops, NULL);
> > + if (IS_ERR(file_dentry)) {
> > + ret = PTR_ERR(file_dentry);
> > + goto out;
> > + }
> > +
> > + file_dentry = binderfs_create_file(binder_logs_root_dir,
> > + "transaction_log",
> > + &binder_transaction_log_fops,
> > + &binder_transaction_log);
> > + if (IS_ERR(file_dentry)) {
> > + ret = PTR_ERR(file_dentry);
> > + goto out;
> > + }
> > +
> > + file_dentry = binderfs_create_file(binder_logs_root_dir,
> > + "failed_transaction_log",
> > + &binder_transaction_log_fops,
> > + &binder_transaction_log_failed);
> > if (IS_ERR(file_dentry))
> > ret = PTR_ERR(file_dentry);
> > +
> > out:
> > return ret;
> > }
> > --
> > 2.23.0.187.g17f5b7556c-goog
> >