All of lore.kernel.org
 help / color / mirror / Atom feed
From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
To: Greg KH <gregkh@linuxfoundation.org>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
	"Brown, Len" <len.brown@intel.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>
Subject: Re: driver model, duplicate names question
Date: Tue, 16 Jul 2013 11:29:42 -0700	[thread overview]
Message-ID: <51E59116.2060801@linux.intel.com> (raw)
In-Reply-To: <20130716164459.GB17827@kroah.com>

[-- Attachment #1: Type: text/plain, Size: 2086 bytes --]

Thanks for the quick response. Here I am creating virtual devices using 
device_register.
I have attached a simple test program, which will give error.

This is my intention:

$> cd /sys/class/test_class
$> ls
power_zone_cpu_package_0
power_zone_cpu_package_1


$> cd power_zone_cpu_package_0
$> ls
power-zone-cpu-0

$> cd ..

$> cd power_zone_cpu_package_1
$> ls
power-zone-cpu-0


The error will be "
Error:
sysfs: cannot create duplicate filename '/class/test_class/power-zone-cpu-0'

I want to avoid a flat model, if there is a server system with many CPU 
packages with multiple cores in each.

Thanks,
Srinivas











On 07/16/2013 09:44 AM, Greg KH wrote:
> On Tue, Jul 16, 2013 at 09:34:57AM -0700, Srinivas Pandruvada wrote:
>> Hi Greg,
>>
>> I would like to create tree like structure using device model (struct
>> device, device_register/device_unregister) using parent/child
>> relationship while creation. I want to be able to create duplicate
>> names, when their parents are different, similar to a directory structure.
>> I see that I can't create devices with duplicate names (device names),
>> even when their parents are different.
> We actually check that?  Nice, I didn't realize that :)
>
>> How can I allow duplicate names when their parents are different devices?
>> I want to avoid flat model as I have parent child relationship and there
>> will be too many devices using flat model.
> Devices on the same bus shouldn't have the same name, but if they are in
> a "tree", it should be ok.  What check is erroring out?
>
>> Why, I need?
>> I am going to publish RFC for a new power cap class driver. We have a
>> multiple controllers under power cap class (they are devices). Under
>> which there are multiple power zones, with parent/child relationships.
>> Currently I have to use  kobject_init_and_add, which I want to avoid and
>> just use device_register. Other places, wherever such relationships are
>> required, kobjects are used like cpufreq.
> Yes, you shouldn't use "raw" kobject calls at all, so we should fix
> this.
>
> thanks,
>
> greg k-h
>


[-- Attachment #2: test_dev_create.c --]
[-- Type: text/x-csrc, Size: 2189 bytes --]

#include <linux/module.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/slab.h>

static struct device dev_par_0;
static struct device dev_par_0_child_0;

static struct device dev_par_1;
static struct device dev_par_1_child_0;


static struct class test_class_class = {
	.name = "test_class",
};

static int create_test_devices(void)
{
	int result;

	dev_set_name(&dev_par_0, "power_zone_cpu_package_0");

	dev_par_0.class = &test_class_class;
	result = device_register(&dev_par_0);
	if (result) {
		pr_err("device_register failed for parent_0\n");
		return result;
	}
	
	dev_set_name(&dev_par_1, "power_zone_cpu_package_1");
	dev_par_1.class = &test_class_class;
	result = device_register(&dev_par_1);
	if (result) {
		pr_err("device_register failed for parent_0\n");		
		goto error_par1;
	}
	

	dev_set_name(&dev_par_0_child_0, "power-zone-cpu-0");
	dev_par_0_child_0.class = &test_class_class;
	dev_par_0_child_0.parent = &dev_par_0;
	result = device_register(&dev_par_0_child_0);
	if (result) {
		pr_err("device_register failed for dev_par_0_child_0\n");		
		goto error_par0_child_0;
	}

	dev_set_name(&dev_par_1_child_0, "power-zone-cpu-0");
	dev_par_1_child_0.class = &test_class_class;
	dev_par_1_child_0.parent = &dev_par_1;
	result = device_register(&dev_par_1_child_0);
	if (result) {
		pr_err("device_register failed for dev_par_1_child_0\n");		
		goto error_par0_child_1;
	}

	return 0;

error_par0_child_1:
	device_unregister(&dev_par_0_child_0);
error_par0_child_0:
	device_unregister(&dev_par_1);
error_par1:
	device_unregister(&dev_par_0);

	return result;
}




static int __init dev_create_test_init(void)
{
	int result = 0;

	pr_debug("dev_create_test_init\n");
	result = class_register(&test_class_class);
	if (result)
		return result;

	result = create_test_devices();

	return result;
}

static void dev_create_test_exit(void)
{
	pr_debug("dev_create_test_exit\n");

	device_unregister(&dev_par_0_child_0);
	device_unregister(&dev_par_1_child_0);	
	device_unregister(&dev_par_0);
	device_unregister(&dev_par_1);

	class_unregister(&test_class_class);
}


module_init(dev_create_test_init)
module_exit(dev_create_test_exit)
MODULE_LICENSE("GPL v2");

  reply	other threads:[~2013-07-16 18:23 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-16 16:34 driver model, duplicate names question Srinivas Pandruvada
2013-07-16 16:44 ` Greg KH
2013-07-16 18:29   ` Srinivas Pandruvada [this message]
2013-07-16 18:31     ` Greg KH
2013-07-16 18:54       ` Srinivas Pandruvada
2013-07-16 19:04         ` Greg KH
2013-07-16 19:33           ` Srinivas Pandruvada
2013-07-16 19:32             ` Greg KH
2013-07-16 20:11               ` Srinivas Pandruvada
     [not found]               ` <51E6D95B.1070203@linux.intel.com>
2013-07-17 17:48                 ` Greg KH
2013-07-17 18:09               ` Srinivas Pandruvada
2013-07-17 18:31                 ` Greg KH
2013-07-17 18:55                   ` Srinivas Pandruvada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51E59116.2060801@linux.intel.com \
    --to=srinivas.pandruvada@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rjw@sisk.pl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.