Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752645AbdLANXd (ORCPT ); Fri, 1 Dec 2017 08:23:33 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:35537 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752687AbdLANXb (ORCPT ); Fri, 1 Dec 2017 08:23:31 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20171201132329euoutp01530b2e38a23d054e9f75edb660e5875c~8LmpSH4911491214912euoutp01x X-AuditID: cbfec7f4-f790c6d0000075d3-01-5a2157cfe930 From: Maciej Purski To: Greg Kroah-Hartman Cc: Marek Szyprowski , Russell King , Bartlomiej Zolnierkiewicz , linux-kernel@vger.kernel.org, Maciej Purski Subject: [PATCH v5] component: add debugfs support Date: Fri, 01 Dec 2017 14:23:16 +0100 Message-id: <1512134596-10025-1-git-send-email-m.purski@samsung.com> X-Mailer: git-send-email 2.7.4 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrCIsWRmVeSWpSXmKPExsWy7djP87rnwxWjDC5vNLPYOGM9q0Xz4vVs Fpd3zWGzWPDyFovF2iN32S0u9U9kcmDzuHztIrPH/rlr2D36tqxi9Pi8SS6AJYrLJiU1J7Ms tUjfLoErY/bUS8wFs5Uq/l5dydjAuEymi5GDQ0LARGLbypguRk4gU0ziwr31bF2MXBxCAksZ JX4f3gDlfGaUWHZjNTtElYnElq4/jBCJZYwS7468YIJw/jNKtB94xQoylk1AS2JNezxIg4iA sUT/2VnsIDXMArcYJZ5ef8AIkhAWMJJoOd/DBmKzCKhKfDy+GCzOK+AicW/qVjaIbXISN891 MkPYT1kltt/NgTjbReLNzTiIsLDEq+NboI6Tkbg8uZsFwq6WuPh1F9SYGonG2xugaqwlPk/a AjaSWYBPYtK26cwQI3klOtqEIEo8JNqu7IMqd5S4vPAFK4gtJBArsenfQcYJjFILGBlWMYqk lhbnpqcWm+gVJ+YWl+al6yXn525iBMbd6X/Hv+xgXHzM6hCjAAejEg8vAzAehVgTy4orcw8x SnAwK4nwxvoBhXhTEiurUovy44tKc1KLDzFKc7AoifPaRrVFCgmkJ5akZqemFqQWwWSZODil Ghil4y69YPo43/WUmojDw/+mwUyRKks+m4nV1M5byMAr8JxJ42fOq5j+5x1Jpr179XKvyXs2 PdTc0Dpv8+8VDyKP507vkFFI3zkjxHv/83sB/x8z7RNKsrjzeGJKzsrjJ2tuOq2axRZ+6n3V l/U7e90/dZnfWTK7znmhTOSKnkO/Fzxcf7xe+NJbJZbijERDLeai4kQAgJkWsrcCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrIJMWRmVeSWpSXmKPExsVy+t/xK7rnwxWjDDZ/EbfYOGM9q0Xz4vVs Fpd3zWGzWPDyFovF2iN32S0u9U9kcmDzuHztIrPH/rlr2D36tqxi9Pi8SS6AJYrLJiU1J7Ms tUjfLoErY/bUS8wFs5Uq/l5dydjAuEymi5GTQ0LARGJL1x9GCFtM4sK99WxdjFwcQgJLGCV2 vV7HAuE0Mkl8XbsUyOHgYBPQkljTHg/SICJgLNF/dhY7SA2zwC1GibNLH4JNEhYwkmg538MG YrMIqEp8PL4YLM4r4CJxb+pWNohtchI3z3UyT2DkXsDIsIpRJLW0ODc9t9hIrzgxt7g0L10v OT93EyMwILYd+7llB2PXu+BDjAIcjEo8vAzAQBFiTSwrrsw9xCjBwawkwhvrBxTiTUmsrEot yo8vKs1JLT7EKM3BoiTO27tndaSQQHpiSWp2ampBahFMlomDU6qBMe39rlAJswvF/XPMZL7W p+wyPDDzbHoF23UV5eDPn6ulXNdw1iW47uSTvGUtOq+y0z5g1popH9ZtsuOe2ZKgN68nSPBX Zv958/0dTg25ZzSX/jTTXNmzRlLGom3ry2m9XWt2CZ0tOb3/8dKNBzSMr7s5umTO3n5krcTG TXo384/uq9mfFc84T4mlOCPRUIu5qDgRAJ3PeF4EAgAA X-CMS-MailID: 20171201132327eucas1p2c065b1218eca342af05b54c285b70eac X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171201132327eucas1p2c065b1218eca342af05b54c285b70eac X-RootMTR: 20171201132327eucas1p2c065b1218eca342af05b54c285b70eac References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4226 Lines: 151 Currently there is no information in any vfs about which devices a master component consists of, what makes debugging hard if one of the component devices fails to register. Add 'device_component' directory to debugfs. Create a new file for each component master, when it has been added. Remove it on a master deletion. Show a list of devices required by the given master and their status (registered or not). This provides an easy way to check, which device has failed to register if the given master device is not available in the system. Signed-off-by: Maciej Purski --- Changes in v5: - remove inline of no-op functions Changes in v4: - fix and expand commit message - inline n-op functions Changes in v3: - get rid of useless check - change directory name to "device_component" Changes in v2: - use seq_printf() instead of seq_puts() when printing headers - move whole debugfs code to the file beginning in order to avoid forward declarations or using multiple ifdefs --- drivers/base/component.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/drivers/base/component.c b/drivers/base/component.c index 89b032f..114a602 100644 --- a/drivers/base/component.c +++ b/drivers/base/component.c @@ -17,6 +17,7 @@ #include #include #include +#include struct component; @@ -41,6 +42,7 @@ struct master { const struct component_master_ops *ops; struct device *dev; struct component_match *match; + struct dentry *dentry; }; struct component { @@ -56,6 +58,80 @@ static DEFINE_MUTEX(component_mutex); static LIST_HEAD(component_list); static LIST_HEAD(masters); +#ifdef CONFIG_DEBUG_FS + +static struct dentry *component_debugfs_dir; + +static int component_devices_show(struct seq_file *s, void *data) +{ + struct master *m = s->private; + struct component_match *match = m->match; + size_t i; + + mutex_lock(&component_mutex); + seq_printf(s, "%-40s %20s\n", "master name", "status"); + seq_puts(s, "-------------------------------------------------------------\n"); + seq_printf(s, "%-40s %20s\n\n", + dev_name(m->dev), m->bound ? "bound" : "not bound"); + + seq_printf(s, "%-40s %20s\n", "device name", "status"); + seq_puts(s, "-------------------------------------------------------------\n"); + for (i = 0; i < match->num; i++) { + struct device *d = (struct device *)match->compare[i].data; + + seq_printf(s, "%-40s %20s\n", dev_name(d), + match->compare[i].component ? + "registered" : "not registered"); + } + mutex_unlock(&component_mutex); + + return 0; +} + +static int component_devices_open(struct inode *inode, struct file *file) +{ + return single_open(file, component_devices_show, inode->i_private); +} + +static const struct file_operations component_devices_fops = { + .open = component_devices_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int __init component_debug_init(void) +{ + component_debugfs_dir = debugfs_create_dir("device_component", NULL); + + return 0; +} + +core_initcall(component_debug_init); + +static void component_master_debugfs_add(struct master *m) +{ + m->dentry = debugfs_create_file(dev_name(m->dev), 0444, + component_debugfs_dir, + m, &component_devices_fops); +} + +static void component_master_debugfs_del(struct master *m) +{ + debugfs_remove(m->dentry); + m->dentry = NULL; +} + +#else + +static void component_master_debugfs_add(struct master *m) +{ } + +static void component_master_debugfs_del(struct master *m) +{ } + +#endif + static struct master *__master_find(struct device *dev, const struct component_master_ops *ops) { @@ -290,6 +366,7 @@ static void free_master(struct master *master) struct component_match *match = master->match; int i; + component_master_debugfs_del(master); list_del(&master->node); if (match) { @@ -323,6 +400,7 @@ int component_master_add_with_match(struct device *dev, master->ops = ops; master->match = match; + component_master_debugfs_add(master); /* Add to the list of available masters. */ mutex_lock(&component_mutex); list_add(&master->node, &masters); -- 2.7.4