mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2] component: add debugfs support
       [not found] <CGME20171115120534eucas1p25315c9e71abea9b7be93d66f97406523@eucas1p2.samsung.com>
@ 2017-11-15 12:05 ` Maciej Purski
  2017-11-15 14:01   ` Greg Kroah-Hartman
  0 siblings, 1 reply; 3+ messages in thread
From: Maciej Purski @ 2017-11-15 12:05 UTC (permalink / raw)
  To: linux-kernel; +Cc: Greg Kroah-Hartman, Russell King, Maciej Purski

Add 'component' directory to debugfs. Create a new file for each master,
when a master is added. Remove it on a master deletion.

Show a list of devices matched with master and indicate if
master's components were successfully added and if the whole master is
bound.

Signed-off-by: Maciej Purski <m.purski@samsung.com>
---
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 | 83 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)

diff --git a/drivers/base/component.c b/drivers/base/component.c
index 89b032f..8745ad9 100644
--- a/drivers/base/component.c
+++ b/drivers/base/component.c
@@ -17,6 +17,7 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
+#include <linux/debugfs.h>
 
 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,85 @@ 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("component", NULL);
+
+	if (!component_debugfs_dir)
+		return -ENOMEM;
+
+	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 +371,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 +405,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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] component: add debugfs support
  2017-11-15 12:05 ` [PATCH v2] component: add debugfs support Maciej Purski
@ 2017-11-15 14:01   ` Greg Kroah-Hartman
  2017-11-16 12:39     ` Maciej Purski
  0 siblings, 1 reply; 3+ messages in thread
From: Greg Kroah-Hartman @ 2017-11-15 14:01 UTC (permalink / raw)
  To: Maciej Purski; +Cc: linux-kernel, Russell King

On Wed, Nov 15, 2017 at 01:05:26PM +0100, Maciej Purski wrote:
> Add 'component' directory to debugfs. Create a new file for each master,
> when a master is added. Remove it on a master deletion.
> 
> Show a list of devices matched with master and indicate if
> master's components were successfully added and if the whole master is
> bound.
> 
> Signed-off-by: Maciej Purski <m.purski@samsung.com>
> ---
> 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 | 83 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 83 insertions(+)
> 
> diff --git a/drivers/base/component.c b/drivers/base/component.c
> index 89b032f..8745ad9 100644
> --- a/drivers/base/component.c
> +++ b/drivers/base/component.c
> @@ -17,6 +17,7 @@
>  #include <linux/module.h>
>  #include <linux/mutex.h>
>  #include <linux/slab.h>
> +#include <linux/debugfs.h>
>  
>  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,85 @@ 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("component", NULL);
> +
> +	if (!component_debugfs_dir)
> +		return -ENOMEM;

No need to test this at all, you should never fail anything if debugfs
is not working properly, just continue and move on.  The result of any
debugfs call can be fed back into any other debugfs call without any
problems.

> +
> +	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);

See, you do it well here, do the same thing when you create the initial
debugfs directory.

Also, "component" is very vague, can you think of a better term for
this?  "device_component"?  "dev_component"?  Something else?  But I
don't care, if you really like "component", that's fine.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] component: add debugfs support
  2017-11-15 14:01   ` Greg Kroah-Hartman
@ 2017-11-16 12:39     ` Maciej Purski
  0 siblings, 0 replies; 3+ messages in thread
From: Maciej Purski @ 2017-11-16 12:39 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Russell King; +Cc: linux-kernel, Marek Szyprowski



On 11/15/2017 03:01 PM, Greg Kroah-Hartman wrote:
> On Wed, Nov 15, 2017 at 01:05:26PM +0100, Maciej Purski wrote:
>> Add 'component' directory to debugfs. Create a new file for each master,
>> when a master is added. Remove it on a master deletion.
>>
>> Show a list of devices matched with master and indicate if
>> master's components were successfully added and if the whole master is
>> bound.
>>
>> Signed-off-by: Maciej Purski <m.purski@samsung.com>
>> ---
>> 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 | 83 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 83 insertions(+)
>>
>> diff --git a/drivers/base/component.c b/drivers/base/component.c
>> index 89b032f..8745ad9 100644
>> --- a/drivers/base/component.c
>> +++ b/drivers/base/component.c
>> @@ -17,6 +17,7 @@
>>   #include <linux/module.h>
>>   #include <linux/mutex.h>
>>   #include <linux/slab.h>
>> +#include <linux/debugfs.h>
>>   
>>   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,85 @@ 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("component", NULL);
>> +
>> +	if (!component_debugfs_dir)
>> +		return -ENOMEM;
> 
> No need to test this at all, you should never fail anything if debugfs
> is not working properly, just continue and move on.  The result of any
> debugfs call can be fed back into any other debugfs call without any
> problems.
> 
>> +
>> +	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);
> 
> See, you do it well here, do the same thing when you create the initial
> debugfs directory.

I'll to this the way you suggest. Thanks.

> 
> Also, "component" is very vague, can you think of a better term for
> this?  "device_component"?  "dev_component"?  Something else?  But I
> don't care, if you really like "component", that's fine.
>

I'm not really attached to that name, so I can change it to one that you suggested.
Maybe Russell King has some preference on that?

Best regards,

Maciej Purski

> thanks,
> 
> greg k-h
> 
> 
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-11-16 12:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20171115120534eucas1p25315c9e71abea9b7be93d66f97406523@eucas1p2.samsung.com>
2017-11-15 12:05 ` [PATCH v2] component: add debugfs support Maciej Purski
2017-11-15 14:01   ` Greg Kroah-Hartman
2017-11-16 12:39     ` Maciej Purski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®