Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp6054849ybl; Tue, 27 Aug 2019 13:44:53 -0700 (PDT) X-Google-Smtp-Source: APXvYqyfSjEqlhCIfm7hGnh92Y0BQ98t+NQKUKCLTuUCkhf1X0FLbYBFnWkdziJOlz3yqgdA4MiV X-Received: by 2002:a62:ee0e:: with SMTP id e14mr435523pfi.31.1566938693710; Tue, 27 Aug 2019 13:44:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1566938693; cv=none; d=google.com; s=arc-20160816; b=IKI0tw0OqGpGezIkC3p+1BP7UsQPFbj+MoYbj9E2XvF3SSVHELFTqWj1hFijQhLpxn QaDhdvecsfRsnRCbckRLVzW01aKvc+NNa/rtrIog2JZrL/xVAOE0qeff6cwmcdO1w3i0 o7MGT5P6zd64VRsn1vdvQbxDuWUcQJFxss2veByB5dEF/xv/bzJnhY/nHB1BOu28FnXW 4hnkRnEgMPacjGYk2VGhoJuCQu5Nm6/0CqL/gULi27v3xNqhZ58KQIFGo17lNuscjpf8 06/yX5G30APu+20alZ5eExX6XlKU4yRj/CXN/LKuU6bFE1Js1ENOKSoaisZhHfry772w bFjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=6h3RXDkleqwSeFqf8A0vxqUeYj6Enzmb74sDLEq6U/8=; b=Rz07MSBJvRIxFCR6RDDYXjTSkf1tuMw8h1FbpAd8YP4ekFc66IX7sl55TXDWbqL/YO J7e5U4bV0O9rPCqwWoYhml/t2L3NDBateLKKGhXubFTOerY830RDV4eBBMrQGxEfjfRl uQAv7juW8Eo/rD6cIR++J2WLs1+wjXym8jzDtLI40UXBv3vcsFCdEzNf5aqHsad3DCXg PJqWgnT9f7yUGojSMz5Yukn59LVUkj2bpb0aL4u4PazqnZXhRznJWAOT5aFzQ3/HzN6F gB3/e6zlj+/7Zy/rQNHA6RQhXJG9LoAeKaEqJUdbh9XlqIv4motC9hBiQ9i5BfXPoYIq u6OQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=hIf+XNYE; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u128si323625pgu.389.2019.08.27.13.44.36; Tue, 27 Aug 2019 13:44:53 -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; dkim=pass header.i=@google.com header.s=20161025 header.b=hIf+XNYE; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730424AbfH0UmK (ORCPT + 99 others); Tue, 27 Aug 2019 16:42:10 -0400 Received: from mail-vs1-f74.google.com ([209.85.217.74]:43933 "EHLO mail-vs1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726332AbfH0UmJ (ORCPT ); Tue, 27 Aug 2019 16:42:09 -0400 Received: by mail-vs1-f74.google.com with SMTP id p63so143579vsd.10 for ; Tue, 27 Aug 2019 13:42:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=6h3RXDkleqwSeFqf8A0vxqUeYj6Enzmb74sDLEq6U/8=; b=hIf+XNYEUQSXKtJDWrxGdw/5j20GGEWjVaH2b5AL4MYsKyZe4prNgrf5JXlUHYqgGY 6ZP5MvNWdFUB7bWnJlJt0FS5GSHVfIkfwGnDb/swmXPE77hKQCom70QTNrYK8qP/Za4W HDPJDE7GmcYCIz0ar5Y12OLYP2heiC3VDmnBg2b7/CzQSh0oVLCWv5HkGRmgou10C5O+ wJVCjRCgOsjKAChfQ3yVwyCtM16QKfhPIcQxKz4WXGmIECOhwqACTNuqUiyMPOhIyD13 DP7C3HClweEGbdg0eO+7YtHVz2zjPjXzFTGv6TM9ZBmp5dUD773ZfgGn9Y8EsWlLUezB 4VvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=6h3RXDkleqwSeFqf8A0vxqUeYj6Enzmb74sDLEq6U/8=; b=OssoY0o8GayB4zSYKVBaMCOYQ4luX0XrmXYVQ8ThUwMrBIPikhjlXrtxQdEzrdnIEM h8g/zB33Bjdjzl5gxco5rThPblboIFQ0Dfj9pcKAEAQ/Zx8hjESjQLVJGdoabvPV8ESe PKLa+3aMao24gY4cz/SDsc2tLXy+HySiKNQyKcHy6vqEJPk6REfKwIDcw+UfGMh8Rviv /wc6hLffjsR3HqzwCe9sprAWxyqCSM6ZnH5JiMzq3fORqcFylvgmNroqD2sOUbrAOLYU 9TvfM9jXPRctWq0ioGQkgfyt5qstUpccDMZVa5WlfsK4c0yu0pvr6qjwZujWTmkCof1v DOAQ== X-Gm-Message-State: APjAAAU7sWUApVvXq/ikJi40gieec1GugjhZqbPkeI2CnCVHvz3JP5xh U4RBskO2T/YTtWNt4bCmeOtP2qPbQMY= X-Received: by 2002:a1f:7c0e:: with SMTP id x14mr486504vkc.0.1566938528429; Tue, 27 Aug 2019 13:42:08 -0700 (PDT) Date: Tue, 27 Aug 2019 13:41:49 -0700 In-Reply-To: <20190827204152.114609-1-hridya@google.com> Message-Id: <20190827204152.114609-2-hridya@google.com> Mime-Version: 1.0 References: <20190827204152.114609-1-hridya@google.com> X-Mailer: git-send-email 2.23.0.187.g17f5b7556c-goog Subject: [PATCH 1/4] binder: add a mount option to show global stats From: Hridya Valsaraju To: Greg Kroah-Hartman , "=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=" , Todd Kjos , Martijn Coenen , Joel Fernandes , Christian Brauner , devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Cc: kernel-team@android.com, Hridya Valsaraju Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, all binder state and statistics live in debugfs. We need this information even when debugfs is not mounted. This patch adds the mount option 'stats' to enable a binderfs instance to have binder debug information present in the same. 'stats=global' will enable the global binder statistics. In the future, 'stats=local' will enable binder statistics local to the binderfs instance. The two modes 'global' and 'local' will be mutually exclusive. 'stats=global' option is only available for a binderfs instance mounted in the initial user namespace. An attempt to use the option to mount a binderfs instance in another user namespace will return an EPERM error. Signed-off-by: Hridya Valsaraju --- drivers/android/binderfs.c | 47 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c index cc2e71576396..d95d179aec58 100644 --- a/drivers/android/binderfs.c +++ b/drivers/android/binderfs.c @@ -51,18 +51,27 @@ static DEFINE_IDA(binderfs_minors); /** * binderfs_mount_opts - mount options for binderfs * @max: maximum number of allocatable binderfs binder devices + * @stats_mode: enable binder stats in binderfs. */ struct binderfs_mount_opts { int max; + int stats_mode; }; enum { Opt_max, + Opt_stats_mode, Opt_err }; +enum binderfs_stats_mode { + STATS_NONE, + STATS_GLOBAL, +}; + static const match_table_t tokens = { { Opt_max, "max=%d" }, + { Opt_stats_mode, "stats=%s" }, { Opt_err, NULL } }; @@ -290,8 +299,9 @@ static void binderfs_evict_inode(struct inode *inode) static int binderfs_parse_mount_opts(char *data, struct binderfs_mount_opts *opts) { - char *p; + char *p, *stats; opts->max = BINDERFS_MAX_MINOR; + opts->stats_mode = STATS_NONE; while ((p = strsep(&data, ",")) != NULL) { substring_t args[MAX_OPT_ARGS]; @@ -311,6 +321,24 @@ static int binderfs_parse_mount_opts(char *data, opts->max = max_devices; break; + case Opt_stats_mode: + stats = match_strdup(&args[0]); + if (!stats) + return -ENOMEM; + + if (strcmp(stats, "global") != 0) { + kfree(stats); + return -EINVAL; + } + + if (!capable(CAP_SYS_ADMIN)) { + kfree(stats); + return -EINVAL; + } + + opts->stats_mode = STATS_GLOBAL; + kfree(stats); + break; default: pr_err("Invalid mount options\n"); return -EINVAL; @@ -322,8 +350,21 @@ static int binderfs_parse_mount_opts(char *data, static int binderfs_remount(struct super_block *sb, int *flags, char *data) { + int prev_stats_mode, ret; struct binderfs_info *info = sb->s_fs_info; - return binderfs_parse_mount_opts(data, &info->mount_opts); + + prev_stats_mode = info->mount_opts.stats_mode; + ret = binderfs_parse_mount_opts(data, &info->mount_opts); + if (ret) + return ret; + + if (prev_stats_mode != info->mount_opts.stats_mode) { + pr_info("Binderfs stats mode cannot be changed during a remount\n"); + info->mount_opts.stats_mode = prev_stats_mode; + return -EINVAL; + } + + return 0; } static int binderfs_show_mount_opts(struct seq_file *seq, struct dentry *root) @@ -333,6 +374,8 @@ static int binderfs_show_mount_opts(struct seq_file *seq, struct dentry *root) info = root->d_sb->s_fs_info; if (info->mount_opts.max <= BINDERFS_MAX_MINOR) seq_printf(seq, ",max=%d", info->mount_opts.max); + if (info->mount_opts.stats_mode == STATS_GLOBAL) + seq_printf(seq, ",stats=global"); return 0; } -- 2.23.0.187.g17f5b7556c-goog