2010-11-12 18:21:15

by Stefan Achatz

[permalink] [raw]
Subject: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

hid-roccat-kone now uses new group functions for creating binary
sysfs attributes.

Signed-off-by: Stefan Achatz <[email protected]>
---
drivers/hid/hid-roccat-kone.c | 53 ++++++++++++----------------------------
1 files changed, 16 insertions(+), 37 deletions(-)

diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c
index f776957..43f1693 100644
--- a/drivers/hid/hid-roccat-kone.c
+++ b/drivers/hid/hid-roccat-kone.c
@@ -710,6 +710,20 @@ static struct bin_attribute kone_profile5_attr = {
.write = kone_sysfs_write_profile5
};

+static struct attribute *kone_bin_attributes[] = {
+ &kone_settings_attr.attr,
+ &kone_profile1_attr.attr,
+ &kone_profile2_attr.attr,
+ &kone_profile3_attr.attr,
+ &kone_profile4_attr.attr,
+ &kone_profile5_attr.attr,
+ NULL
+};
+
+static struct attribute_group kone_bin_attribute_group = {
+ .attrs = kone_bin_attributes
+};
+
static int kone_create_sysfs_attributes(struct usb_interface *intf)
{
int retval;
@@ -718,42 +732,12 @@ static int kone_create_sysfs_attributes(struct usb_interface *intf)
if (retval)
goto exit_1;

- retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_settings_attr);
+ retval = sysfs_create_bin_group(&intf->dev.kobj, &kone_bin_attribute_group);
if (retval)
goto exit_2;

- retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile1_attr);
- if (retval)
- goto exit_3;
-
- retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile2_attr);
- if (retval)
- goto exit_4;
-
- retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile3_attr);
- if (retval)
- goto exit_5;
-
- retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile4_attr);
- if (retval)
- goto exit_6;
-
- retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile5_attr);
- if (retval)
- goto exit_7;
-
return 0;

-exit_7:
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile4_attr);
-exit_6:
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile3_attr);
-exit_5:
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile2_attr);
-exit_4:
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile1_attr);
-exit_3:
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_settings_attr);
exit_2:
sysfs_remove_group(&intf->dev.kobj, &kone_attribute_group);
exit_1:
@@ -762,12 +746,7 @@ exit_1:

static void kone_remove_sysfs_attributes(struct usb_interface *intf)
{
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile5_attr);
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile4_attr);
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile3_attr);
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile2_attr);
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile1_attr);
- sysfs_remove_bin_file(&intf->dev.kobj, &kone_settings_attr);
+ sysfs_remove_group(&intf->dev.kobj, &kone_bin_attribute_group);
sysfs_remove_group(&intf->dev.kobj, &kone_attribute_group);
}

--
1.7.2.3



2010-11-13 00:21:49

by Eric Biederman

[permalink] [raw]
Subject: Re: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

On Fri, Nov 12, 2010 at 10:18 AM, Stefan Achatz <[email protected]> wrote:
> hid-roccat-kone now uses new group functions for creating binary
> sysfs attributes.

Looking at this, I have a problem with the way this works.
You are still doing this the hard and racy way.

sysfs attributes that are only added when we initialize the hardware and
are only removed when we remove the driver should use the device layer
functions to create their attributes.

This achieves two things. The code is easier to write because there
is less of it.
The notification to user space happens after the attributes appear so
that you don't
have strange hotplug races.

If there a chance you can look at implementing this in the simpler
race free way?

Eric


>
> Signed-off-by: Stefan Achatz <[email protected]>
> ---
> ?drivers/hid/hid-roccat-kone.c | ? 53 ++++++++++++----------------------------
> ?1 files changed, 16 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c
> index f776957..43f1693 100644
> --- a/drivers/hid/hid-roccat-kone.c
> +++ b/drivers/hid/hid-roccat-kone.c
> @@ -710,6 +710,20 @@ static struct bin_attribute kone_profile5_attr = {
> ? ? ? ?.write = kone_sysfs_write_profile5
> ?};
>
> +static struct attribute *kone_bin_attributes[] = {
> + ? ? ? &kone_settings_attr.attr,
> + ? ? ? &kone_profile1_attr.attr,
> + ? ? ? &kone_profile2_attr.attr,
> + ? ? ? &kone_profile3_attr.attr,
> + ? ? ? &kone_profile4_attr.attr,
> + ? ? ? &kone_profile5_attr.attr,
> + ? ? ? NULL
> +};
> +
> +static struct attribute_group kone_bin_attribute_group = {
> + ? ? ? .attrs = kone_bin_attributes
> +};
> +
> ?static int kone_create_sysfs_attributes(struct usb_interface *intf)
> ?{
> ? ? ? ?int retval;
> @@ -718,42 +732,12 @@ static int kone_create_sysfs_attributes(struct usb_interface *intf)
> ? ? ? ?if (retval)
> ? ? ? ? ? ? ? ?goto exit_1;
>
> - ? ? ? retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_settings_attr);
> + ? ? ? retval = sysfs_create_bin_group(&intf->dev.kobj, &kone_bin_attribute_group);
> ? ? ? ?if (retval)
> ? ? ? ? ? ? ? ?goto exit_2;
>
> - ? ? ? retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile1_attr);
> - ? ? ? if (retval)
> - ? ? ? ? ? ? ? goto exit_3;
> -
> - ? ? ? retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile2_attr);
> - ? ? ? if (retval)
> - ? ? ? ? ? ? ? goto exit_4;
> -
> - ? ? ? retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile3_attr);
> - ? ? ? if (retval)
> - ? ? ? ? ? ? ? goto exit_5;
> -
> - ? ? ? retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile4_attr);
> - ? ? ? if (retval)
> - ? ? ? ? ? ? ? goto exit_6;
> -
> - ? ? ? retval = sysfs_create_bin_file(&intf->dev.kobj, &kone_profile5_attr);
> - ? ? ? if (retval)
> - ? ? ? ? ? ? ? goto exit_7;
> -
> ? ? ? ?return 0;
>
> -exit_7:
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile4_attr);
> -exit_6:
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile3_attr);
> -exit_5:
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile2_attr);
> -exit_4:
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile1_attr);
> -exit_3:
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_settings_attr);
> ?exit_2:
> ? ? ? ?sysfs_remove_group(&intf->dev.kobj, &kone_attribute_group);
> ?exit_1:
> @@ -762,12 +746,7 @@ exit_1:
>
> ?static void kone_remove_sysfs_attributes(struct usb_interface *intf)
> ?{
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile5_attr);
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile4_attr);
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile3_attr);
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile2_attr);
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_profile1_attr);
> - ? ? ? sysfs_remove_bin_file(&intf->dev.kobj, &kone_settings_attr);
> + ? ? ? sysfs_remove_group(&intf->dev.kobj, &kone_bin_attribute_group);
> ? ? ? ?sysfs_remove_group(&intf->dev.kobj, &kone_attribute_group);
> ?}
>
> --
> 1.7.2.3
>
>
>
>

2010-11-13 00:53:57

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

On Fri, Nov 12, 2010 at 04:21:45PM -0800, Eric Biederman wrote:
> On Fri, Nov 12, 2010 at 10:18 AM, Stefan Achatz <[email protected]> wrote:
> > hid-roccat-kone now uses new group functions for creating binary
> > sysfs attributes.
>
> Looking at this, I have a problem with the way this works.
> You are still doing this the hard and racy way.
>
> sysfs attributes that are only added when we initialize the hardware and
> are only removed when we remove the driver should use the device layer
> functions to create their attributes.
>
> This achieves two things. The code is easier to write because there
> is less of it.
> The notification to user space happens after the attributes appear so
> that you don't
> have strange hotplug races.
>
> If there a chance you can look at implementing this in the simpler
> race free way?

Good point, just attach this attribute group to the device and the
driver core will automatically create the files for you.

thanks,

greg k-h

2010-11-13 06:06:44

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

On Fri, Nov 12, 2010 at 04:52:32PM -0800, Greg KH wrote:
> On Fri, Nov 12, 2010 at 04:21:45PM -0800, Eric Biederman wrote:
> > On Fri, Nov 12, 2010 at 10:18 AM, Stefan Achatz <[email protected]> wrote:
> > > hid-roccat-kone now uses new group functions for creating binary
> > > sysfs attributes.
> >
> > Looking at this, I have a problem with the way this works.
> > You are still doing this the hard and racy way.
> >
> > sysfs attributes that are only added when we initialize the hardware and
> > are only removed when we remove the driver should use the device layer
> > functions to create their attributes.
> >
> > This achieves two things. The code is easier to write because there
> > is less of it.
> > The notification to user space happens after the attributes appear so
> > that you don't
> > have strange hotplug races.
> >
> > If there a chance you can look at implementing this in the simpler
> > race free way?
>
> Good point, just attach this attribute group to the device and the
> driver core will automatically create the files for you.
>

Attribute group in device structure is normally owned and managed by
subsystem core; without additional plumbing drivers should not be
touching it, at least not normally.

Plus we do not have binary attribute group in device structure [yet].

--
Dmitry

2010-11-13 14:48:11

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

On Fri, Nov 12, 2010 at 10:06:34PM -0800, Dmitry Torokhov wrote:
> On Fri, Nov 12, 2010 at 04:52:32PM -0800, Greg KH wrote:
> > On Fri, Nov 12, 2010 at 04:21:45PM -0800, Eric Biederman wrote:
> > > On Fri, Nov 12, 2010 at 10:18 AM, Stefan Achatz <[email protected]> wrote:
> > > > hid-roccat-kone now uses new group functions for creating binary
> > > > sysfs attributes.
> > >
> > > Looking at this, I have a problem with the way this works.
> > > You are still doing this the hard and racy way.
> > >
> > > sysfs attributes that are only added when we initialize the hardware and
> > > are only removed when we remove the driver should use the device layer
> > > functions to create their attributes.
> > >
> > > This achieves two things. The code is easier to write because there
> > > is less of it.
> > > The notification to user space happens after the attributes appear so
> > > that you don't
> > > have strange hotplug races.
> > >
> > > If there a chance you can look at implementing this in the simpler
> > > race free way?
> >
> > Good point, just attach this attribute group to the device and the
> > driver core will automatically create the files for you.
> >
>
> Attribute group in device structure is normally owned and managed by
> subsystem core; without additional plumbing drivers should not be
> touching it, at least not normally.
>
> Plus we do not have binary attribute group in device structure [yet].

In thinking about it a bit more, why do you have so many binary
attributes for this driver? binary sysfs files are rare, so adding a
binary attribute group pointer to the device or driver would just waste
a lot of space that no one else uses.

What are these binary files for? Who uses them? I don't seem to be
able to find them in the Documentation/ABI directory, or am I missing
something here?

thanks,

greg k-h

2010-11-13 16:35:30

by Stefan Achatz

[permalink] [raw]
Subject: Re: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

Am Samstag, den 13.11.2010, 06:39 -0800 schrieb Greg KH:
> On Fri, Nov 12, 2010 at 10:06:34PM -0800, Dmitry Torokhov wrote:
> > On Fri, Nov 12, 2010 at 04:52:32PM -0800, Greg KH wrote:
> > > On Fri, Nov 12, 2010 at 04:21:45PM -0800, Eric Biederman wrote:
> > > > On Fri, Nov 12, 2010 at 10:18 AM, Stefan Achatz <[email protected]> wrote:
> > > > > hid-roccat-kone now uses new group functions for creating binary
> > > > > sysfs attributes.
> > > >
> > > > Looking at this, I have a problem with the way this works.
> > > > You are still doing this the hard and racy way.
> > > >
> > > > sysfs attributes that are only added when we initialize the hardware and
> > > > are only removed when we remove the driver should use the device layer
> > > > functions to create their attributes.
> > > >
> > > > This achieves two things. The code is easier to write because there
> > > > is less of it.
> > > > The notification to user space happens after the attributes appear so
> > > > that you don't
> > > > have strange hotplug races.
> > > >
> > > > If there a chance you can look at implementing this in the simpler
> > > > race free way?
> > >
> > > Good point, just attach this attribute group to the device and the
> > > driver core will automatically create the files for you.
> > >
> >
> > Attribute group in device structure is normally owned and managed by
> > subsystem core; without additional plumbing drivers should not be
> > touching it, at least not normally.
> >
> > Plus we do not have binary attribute group in device structure [yet].
>
> In thinking about it a bit more, why do you have so many binary
> attributes for this driver? binary sysfs files are rare, so adding a
> binary attribute group pointer to the device or driver would just waste
> a lot of space that no one else uses.
>
> What are these binary files for? Who uses them? I don't seem to be
> able to find them in the Documentation/ABI directory, or am I missing
> something here?

Documentation/ABI/testing/sysfs-driver-hid-roccat-kone

Stefan

2010-11-14 00:03:11

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 2/2] HID: roccat: using new sysfs_create_bin_group() in kone driver

On Sat, Nov 13, 2010 at 05:34:15PM +0100, Stefan Achatz wrote:
> Am Samstag, den 13.11.2010, 06:39 -0800 schrieb Greg KH:
> > On Fri, Nov 12, 2010 at 10:06:34PM -0800, Dmitry Torokhov wrote:
> > > On Fri, Nov 12, 2010 at 04:52:32PM -0800, Greg KH wrote:
> > > > On Fri, Nov 12, 2010 at 04:21:45PM -0800, Eric Biederman wrote:
> > > > > On Fri, Nov 12, 2010 at 10:18 AM, Stefan Achatz <[email protected]> wrote:
> > > > > > hid-roccat-kone now uses new group functions for creating binary
> > > > > > sysfs attributes.
> > > > >
> > > > > Looking at this, I have a problem with the way this works.
> > > > > You are still doing this the hard and racy way.
> > > > >
> > > > > sysfs attributes that are only added when we initialize the hardware and
> > > > > are only removed when we remove the driver should use the device layer
> > > > > functions to create their attributes.
> > > > >
> > > > > This achieves two things. The code is easier to write because there
> > > > > is less of it.
> > > > > The notification to user space happens after the attributes appear so
> > > > > that you don't
> > > > > have strange hotplug races.
> > > > >
> > > > > If there a chance you can look at implementing this in the simpler
> > > > > race free way?
> > > >
> > > > Good point, just attach this attribute group to the device and the
> > > > driver core will automatically create the files for you.
> > > >
> > >
> > > Attribute group in device structure is normally owned and managed by
> > > subsystem core; without additional plumbing drivers should not be
> > > touching it, at least not normally.
> > >
> > > Plus we do not have binary attribute group in device structure [yet].
> >
> > In thinking about it a bit more, why do you have so many binary
> > attributes for this driver? binary sysfs files are rare, so adding a
> > binary attribute group pointer to the device or driver would just waste
> > a lot of space that no one else uses.
> >
> > What are these binary files for? Who uses them? I don't seem to be
> > able to find them in the Documentation/ABI directory, or am I missing
> > something here?
>
> Documentation/ABI/testing/sysfs-driver-hid-roccat-kone

My apologies, that does look correct, thanks for doing it.

Yeah, odds are udev wants to see these files when the device shows up so
we need a way to get them created before the device event is sent out to
userspace. So we need to get them assigned to the device or driver
somehow like the default attribute groups we have today. Any ideas are
appreciated.

thanks,

greg k-h