Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp601310ybl; Fri, 30 Aug 2019 04:33:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqzDg+iHxb359hIgJdp85z+IG3t6kiG5+3rAttZD2EQ6dqFMB2++ZoQVXqEndZhO/YBLPbaM X-Received: by 2002:a62:e915:: with SMTP id j21mr13194759pfh.239.1567164817341; Fri, 30 Aug 2019 04:33:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567164817; cv=none; d=google.com; s=arc-20160816; b=Z5VZQaq3K/y7jDccrhigFMbaWb1i+k8DFBbS1pP34/enTqHCromQlloFYyeABI2GWo 9dxIO1YbWVYBHu0EPINnphI/YFeOpOKgFEUI7ai3JVEjVjHTxpCrogsZV3Yf665NILC3 6r2mCKHzmaRCxhgrvzsU/jPcnEYou3Ea0aELtKExF1jgaezz+1cmJBiNoFLR3o2I+8Zi dPAyB17w4nOxUVjxLooWu+8XQdahJfWABgJ6mJPE9IPxpN8YT2iDW6hAl8pgwgdTO/ep 47mbfve+8dzWfJqmXSTGXi864c92Ma8hmlGClMNy0VJfN7zDoXjTQNmjPywuEYpXLnuR 1GXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=AJ1vadXF6nyDv+d68oyppgFbpBtOUtC99r6hb2QpXyU=; b=Uop3JguBSx/jXzkXxUuzTqOPSN/emVf0YbCSo1G9xuYyF2A5kWHbSiBxktjQ4DbGEc KtMoP3c6qqmQuQUaSNXOeMWWZKJXhiYH8cFjjoiDl1KvQaBtDpiZp96fBLH0drFCoukV cphdq8DHCQJ54CgtjwXSTNacfaxpp0/e6ezJQZzMJdhTmPfVprCh9PhEFktOQn6Y5AtP DrkXsNZhRUTg4NNlQJM+nG2/9ONQm5zz16JPTWeLUu2VDHRELRSfOGngS1A1MA3fAiAu /VvD76eT8CQqpkEF67LuiZN7fqbXeKm5yOYvR0EwxrWa8UobxRx2Y4rAOaovXShvxXMM gd4Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gn16si4515427plb.97.2019.08.30.04.33.21; Fri, 30 Aug 2019 04:33:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727781AbfH3Lc0 (ORCPT + 99 others); Fri, 30 Aug 2019 07:32:26 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:50808 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727170AbfH3Lc0 (ORCPT ); Fri, 30 Aug 2019 07:32:26 -0400 Received: from [213.220.153.21] (helo=wittgenstein) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1i3f8b-0004uw-Kr; Fri, 30 Aug 2019 11:32:17 +0000 Date: Fri, 30 Aug 2019 13:32:16 +0200 From: Christian Brauner To: Hridya Valsaraju Cc: Greg Kroah-Hartman , Arve =?utf-8?B?SGrDuG5uZXbDpWc=?= , Todd Kjos , Martijn Coenen , Joel Fernandes , devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, kernel-team@android.com Subject: Re: [PATCH v2 2/4] binder: Add stats, state and transactions files Message-ID: <20190830113215.eaa6dfvlhxkmhqc3@wittgenstein> References: <20190829211812.32520-1-hridya@google.com> <20190829211812.32520-3-hridya@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190829211812.32520-3-hridya@google.com> User-Agent: NeoMutt/20180716 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Aug 29, 2019 at 02:18:10PM -0700, Hridya Valsaraju wrote: > The following binder stat files currently live in debugfs. > > /sys/kernel/debug/binder/state > /sys/kernel/debug/binder/stats > /sys/kernel/debug/binder/transactions > > This patch makes these files available in a binderfs instance > mounted with the mount option 'stats=global'. For example, if a binderfs > instance is mounted at path /dev/binderfs, the above files will be > available at the following locations: > > /dev/binderfs/binder_logs/state > /dev/binderfs/binder_logs/stats > /dev/binderfs/binder_logs/transactions > > This provides a way to access them even when debugfs is not mounted. > > Signed-off-by: Hridya Valsaraju Just two comments below. If you have addressed them you can add my: Acked-by: Christian Brauner > --- > > Changes in v2: > - Consistently name variables across functions as per Christian > Brauner. > - Improve check for binderfs device in binderfs_evict_inode() > as per Christian Brauner. > > drivers/android/binder.c | 15 ++-- > drivers/android/binder_internal.h | 8 ++ > drivers/android/binderfs.c | 140 +++++++++++++++++++++++++++++- > 3 files changed, 153 insertions(+), 10 deletions(-) > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c > index ca6b21a53321..de795bd229c4 100644 > --- a/drivers/android/binder.c > +++ b/drivers/android/binder.c > @@ -6055,7 +6055,7 @@ static void print_binder_proc_stats(struct seq_file *m, > } > > > -static int state_show(struct seq_file *m, void *unused) > +int binder_state_show(struct seq_file *m, void *unused) > { > struct binder_proc *proc; > struct binder_node *node; > @@ -6094,7 +6094,7 @@ static int state_show(struct seq_file *m, void *unused) > return 0; > } > > -static int stats_show(struct seq_file *m, void *unused) > +int binder_stats_show(struct seq_file *m, void *unused) > { > struct binder_proc *proc; > > @@ -6110,7 +6110,7 @@ static int stats_show(struct seq_file *m, void *unused) > return 0; > } > > -static int transactions_show(struct seq_file *m, void *unused) > +int binder_transactions_show(struct seq_file *m, void *unused) > { > struct binder_proc *proc; > > @@ -6198,9 +6198,6 @@ const struct file_operations binder_fops = { > .release = binder_release, > }; > > -DEFINE_SHOW_ATTRIBUTE(state); > -DEFINE_SHOW_ATTRIBUTE(stats); > -DEFINE_SHOW_ATTRIBUTE(transactions); > DEFINE_SHOW_ATTRIBUTE(transaction_log); > > static int __init init_binder_device(const char *name) > @@ -6256,17 +6253,17 @@ static int __init binder_init(void) > 0444, > binder_debugfs_dir_entry_root, > NULL, > - &state_fops); > + &binder_state_fops); > debugfs_create_file("stats", > 0444, > binder_debugfs_dir_entry_root, > NULL, > - &stats_fops); > + &binder_stats_fops); > debugfs_create_file("transactions", > 0444, > binder_debugfs_dir_entry_root, > NULL, > - &transactions_fops); > + &binder_transactions_fops); > debugfs_create_file("transaction_log", > 0444, > binder_debugfs_dir_entry_root, > diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h > index fe8c745dc8e0..12ef96f256c6 100644 > --- a/drivers/android/binder_internal.h > +++ b/drivers/android/binder_internal.h > @@ -57,4 +57,12 @@ static inline int __init init_binderfs(void) > } > #endif > > +int binder_stats_show(struct seq_file *m, void *unused); > +DEFINE_SHOW_ATTRIBUTE(binder_stats); > + > +int binder_state_show(struct seq_file *m, void *unused); > +DEFINE_SHOW_ATTRIBUTE(binder_state); > + > +int binder_transactions_show(struct seq_file *m, void *unused); > +DEFINE_SHOW_ATTRIBUTE(binder_transactions); > #endif /* _LINUX_BINDER_INTERNAL_H */ > diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c > index 7045bfe5b52b..0e1e7c87cd33 100644 > --- a/drivers/android/binderfs.c > +++ b/drivers/android/binderfs.c > @@ -280,7 +280,7 @@ static void binderfs_evict_inode(struct inode *inode) > > clear_inode(inode); > > - if (!device) > + if (!S_ISCHR(inode->i_mode) || !device) > return; > > mutex_lock(&binderfs_minors_mutex); > @@ -502,6 +502,141 @@ static const struct inode_operations binderfs_dir_inode_operations = { > .unlink = binderfs_unlink, > }; > > +static struct inode *binderfs_make_inode(struct super_block *sb, int mode) > +{ > + struct inode *ret; > + > + ret = new_inode(sb); > + if (ret) { > + ret->i_ino = iunique(sb, BINDERFS_MAX_MINOR + INODE_OFFSET); > + ret->i_mode = mode; > + ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret); > + } > + return ret; > +} > + > +static struct dentry *binderfs_create_dentry(struct dentry *parent, > + const char *name) > +{ > + struct dentry *dentry; > + > + dentry = lookup_one_len(name, parent, strlen(name)); > + if (IS_ERR(dentry)) > + return dentry; > + > + /* Return error if the file/dir already exists. */ > + if (d_really_is_positive(dentry)) { > + dput(dentry); > + return ERR_PTR(-EEXIST); > + } > + > + return dentry; > +} > + > +static struct dentry *binderfs_create_file(struct dentry *parent, > + const char *name, > + const struct file_operations *fops, > + void *data) > +{ > + struct dentry *dentry; > + struct inode *new_inode, *parent_inode; > + struct super_block *sb; > + > + parent_inode = parent->d_inode; Note that you're using d_inode(parent) below but parent->d_inode here. :) > + inode_lock(parent_inode); > + > + dentry = binderfs_create_dentry(parent, name); > + if (IS_ERR(dentry)) > + goto out; > + > + sb = parent_inode->i_sb; > + new_inode = binderfs_make_inode(sb, S_IFREG | 0444); > + if (!new_inode) { > + dput(dentry); > + dentry = ERR_PTR(-ENOMEM); > + goto out; > + } > + > + new_inode->i_fop = fops; > + new_inode->i_private = data; > + d_instantiate(dentry, new_inode); > + fsnotify_create(parent_inode, dentry); > + > +out: > + inode_unlock(parent_inode); > + return dentry; > +} > + > +static struct dentry *binderfs_create_dir(struct dentry *parent, > + const char *name) > +{ > + struct dentry *dentry; > + struct inode *new_inode, *parent_inode; > + struct super_block *sb; > + > + parent_inode = d_inode(parent); > + inode_lock(parent_inode); > + > + dentry = binderfs_create_dentry(parent, name); > + if (IS_ERR(dentry)) > + goto out; > + > + sb = parent_inode->i_sb; > + new_inode = binderfs_make_inode(sb, S_IFDIR | 0755); > + if (!new_inode) { > + dput(dentry); > + dentry = ERR_PTR(-ENOMEM); > + goto out; > + } > + > + new_inode->i_fop = &simple_dir_operations; > + new_inode->i_op = &simple_dir_inode_operations; > + > + inc_nlink(new_inode); This should be set_nlink(new_inode, 2) since noboby can modify it and it's also clearer what's happening and what the expected count is. > + d_instantiate(dentry, new_inode); > + inc_nlink(parent_inode); > + fsnotify_mkdir(parent_inode, dentry); > + > +out: > + inode_unlock(parent_inode); > + return dentry; > +} > + > +static int init_binder_logs(struct super_block *sb) > +{ > + struct dentry *binder_logs_root_dir, *dentry; > + int ret = 0; > + > + binder_logs_root_dir = binderfs_create_dir(sb->s_root, > + "binder_logs"); > + if (IS_ERR(binder_logs_root_dir)) { > + ret = PTR_ERR(binder_logs_root_dir); > + goto out; > + } > + > + dentry = binderfs_create_file(binder_logs_root_dir, "stats", > + &binder_stats_fops, NULL); > + if (IS_ERR(dentry)) { > + ret = PTR_ERR(dentry); > + goto out; > + } > + > + dentry = binderfs_create_file(binder_logs_root_dir, "state", > + &binder_state_fops, NULL); > + if (IS_ERR(dentry)) { > + ret = PTR_ERR(dentry); > + goto out; > + } > + > + dentry = binderfs_create_file(binder_logs_root_dir, "transactions", > + &binder_transactions_fops, NULL); > + if (IS_ERR(dentry)) > + ret = PTR_ERR(dentry); > + > +out: > + return ret; > +} > + > static int binderfs_fill_super(struct super_block *sb, void *data, int silent) > { > int ret; > @@ -580,6 +715,9 @@ static int binderfs_fill_super(struct super_block *sb, void *data, int silent) > > } > > + if (info->mount_opts.stats_mode == STATS_GLOBAL) > + return init_binder_logs(sb); > + > return 0; > } > > -- > 2.23.0.187.g17f5b7556c-goog >