From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Oliver Schinagl <oliver+list@schinagl.nl>
Cc: linux-kernel@vger.kernel.org, linux@roeck-us.net, khali@linux-fr.org
Subject: Re: [PATCH v2 2/7] sysfs.h: add ATTRIBUTE_GROUPS() macro
Date: Thu, 11 Jul 2013 10:06:48 -0700 [thread overview]
Message-ID: <20130711170648.GC23056@kroah.com> (raw)
In-Reply-To: <51DE9DE5.20905@schinagl.nl>
On Thu, Jul 11, 2013 at 01:58:29PM +0200, Oliver Schinagl wrote:
> On 11-07-13 02:36, Greg Kroah-Hartman wrote:
> >To make it easier for driver subsystems to work with attribute groups,
> >create the ATTRIBUTE_GROUPS macro to remove some of the repetitive
> >typing for the most common use for attribute groups.
> But binary groups are discriminated against :(
Yes, as they are "rarer" by far, as they should be. binary sysfs files
should almost never be used, as they are only "pass-through" files to
the hardware, so I want to see you do more work in order to use them, as
they should not be created lightly.
> The attached patch should help here.
Can you give me an example of using these macros? I seem to be lost in
them somehow, or maybe my morning coffee just hasn't kicked in...
> I suppose one more additional helper wouldn't be bad to have:
>
> #define ATTRIBUTE_(BIN_)GROUPS_R[O/W](_name(, _size)) \
> ATTRIBUTE_(BIN_)ATTR_R[O/W](_name, _size); \
> ATTRIBUTE_(BIN_)GROUPS(_name)
Would that ever be needed?
> >From 003ab7a74ff689daa6934e7bc50c498b2d35a1cc Mon Sep 17 00:00:00 2001
> From: Oliver Schinagl <oliver@schinagl.nl>
> Date: Thu, 11 Jul 2013 13:48:18 +0200
> Subject: [PATCH] sysfs: add more helper macro's for (bin_)attribute(_groups)
>
> With the recent changes to sysfs there's various helper macro's.
> However there's no RW, RO BIN_ helper macro's. This patch adds them.
>
> Additionally there are no BIN_ group helpers so there's that aswell
> Moreso, if both bin and normal attribute groups are used, there's a
> simple helper for that, though the naming code be better. _TXT_ for the
> show/store ones and neither TXT or BIN for both, but that would change
> things to extensivly.
>
> Finally there's also helpers for ATTRIBUTE_ATTRS.
>
> After this patch, create default attributes can be as easy as:
>
> ATTRIBUTE_(BIN_)ATTR_RO(name, SIZE);
> ATTRIBUTE_BIN_GROUPS(name);
>
> Signed-off-by: Oliver Schinagl <oliver@schinagl.nl>
> ---
> include/linux/sysfs.h | 96 ++++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 84 insertions(+), 12 deletions(-)
>
> diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
> index 2c3b6a3..0ebed11 100644
> --- a/include/linux/sysfs.h
> +++ b/include/linux/sysfs.h
> @@ -17,6 +17,7 @@
> #include <linux/list.h>
> #include <linux/lockdep.h>
> #include <linux/kobject_ns.h>
> +#include <linux/stat.h>
> #include <linux/atomic.h>
>
> struct kobject;
> @@ -94,15 +95,32 @@ struct attribute_group {
> #define __ATTR_IGNORE_LOCKDEP __ATTR
> #endif
>
> -#define ATTRIBUTE_GROUPS(name) \
> -static const struct attribute_group name##_group = { \
> - .attrs = name##_attrs, \
> +#define __ATTRIBUTE_GROUPS(_name) \
> +static const struct attribute_group *_name##_groups[] = { \
> + &_name##_group, \
> + NULL, \
> +}
> +
> +#define ATTRIBUTE_GROUPS(_name) \
> +static const struct attribute_group _name##_group = { \
> + .attrs = _name##_attrs, \
> }; \
> -static const struct attribute_group *name##_groups[] = { \
> - &name##_group, \
> +__ATTRIBUTE_GROUPS(_name)
> +
> +#define __ATTRIBUTE_ATTRS(_name) \
> +struct bin_attribute *_name##_attrs[] = { \
> + &_name##_attr, \
> NULL, \
> }
>
> +#define ATTRIBUTE_ATTR_RO(_name, _size) \
> +struct attribute _name##_attr = __ATTR_RO(_name, _size); \
> +__ATTRIBUTE_ATTRS(_name)
> +
> +#define ATTRIBUTE_ATTR_RW(_name, _size) \
> +struct attribute _name##_attr = __ATTR_RW(_name, _size); \
> +__ATTRIBUTE_ATTRS(_name)
What do these two help out with? "attribute attribute read-write" seems
a bit "clunky", don't you think? :)
> +
> #define attr_name(_attr) (_attr).attr.name
>
> struct file;
> @@ -132,15 +150,69 @@ struct bin_attribute {
> */
> #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
>
> -/* macro to create static binary attributes easier */
> -#define BIN_ATTR(_name, _mode, _read, _write, _size) \
> -struct bin_attribute bin_attr_##_name = { \
> - .attr = {.name = __stringify(_name), .mode = _mode }, \
> - .read = _read, \
> - .write = _write, \
> - .size = _size, \
> +/* macros to create static binary attributes easier */
> +#define __BIN_ATTR(_name, _mode, _read, _write, _size) { \
> + .attr = { .name = __stringify(_name), .mode = _mode }, \
> + .read = _read, \
> + .write = _write, \
> + .size = _size, \
> +}
> +
> +#define __BIN_ATTR_RO(_name, _size) { \
> + .attr = { .name = __stringify(_name), .mode = S_IRUGO }, \
> + .read = _name##_read, \
> + .size = _size, \
> +}
> +
> +#define __BIN_ATTR_RW(_name, _size) __BIN_ATTR(_name, \
> + (S_IWUSR | S_IRUGO), _name##_read, \
> + _name##_write)
> +
> +#define __BIN_ATTR_NULL __ATTR_NULL
> +
> +#define BIN_ATTR(_name, _mode, _read, _write, _size) \
> +struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
> + _write, _size)
> +
> +#define BIN_RO_ATTR(_name, _size) \
> +struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
> +
> +#define BIN_RW_ATTR(_name, _size) \
> +struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
To be consistent, these shoudl be BIN_ATTR_RO and BIN_ATTR_RW, right?
These all look fine to me, thanks.
It's these that I'm confused about:
> +
> +#define __ATTRIBUTE_BIN_GROUPS(_name) \
> +static const struct attribute_group *_name##_bin_groups[] = { \
> + &_name##_bin_group, \
> + NULL, \
> }
>
> +#define ATTRIBUTE_BIN_GROUPS(_name) \
> +static const struct attribute_group _name##_bin_group = { \
> + .bin_attrs = _name##_bin_attrs, \
> +}; \
> +__ATTRIBUTE_BIN_GROUPS(_name)
> +
> +#define ATTRIBUTE_FULL_GROUPS(_name) \
> +static const struct attribute_group _name##_full_group = { \
> + .attrs = _name##_attrs, \
> + .bin_attrs = _name##_bin_attrs, \
> +}; \
> +__ATTRIBUTE_GROUPS(_name); __ATTRIBUTE_BIN_GROUPS(_name)
> +
> +#define __ATTRIBUTE_BIN_ATTRS(_name) \
> +struct bin_attribute *_name##_bin_attrs[] = { \
> + &_name##_bin_attr, \
> + NULL, \
> +}
> +
> +#define ATTRIBUTE_BIN_ATTR_RO(_name, _size) \
> +struct bin_attribute _name##_bin_attr = __BIN_ATTR_RO(_name, _size); \
> +__ATTRIBUTE_BIN_ATTRS(_name)
> +
> +#define ATTRIBUTE_BIN_ATTR_RW(_name, _size) \
> +struct bin_attribute _name##_bin_attr = __BIN_ATTR_RW(_name, _size); \
> +__ATTRIBUTE_BIN_ATTRS(_name)
Can you show me how these would be used in a real-world example?
thanks,
greg k-h
next prev parent reply other threads:[~2013-07-11 17:06 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-10 20:05 Driver core and sysfs changes for attribute groups Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 1/6] sysfs.h: add __ATTR_RW() macro Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 2/6] sysfs.h: add ATTRIBUTE_GROUPS() macro Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 3/6] sysfs.h: add BIN_ATTR macro Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 4/6] driver core: add DEVICE_ATTR_RW and DEVICE_ATTR_RO macros Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 5/6] sysfs: add support for binary attributes in groups Greg Kroah-Hartman
2013-07-10 20:05 ` [PATCH 6/6] driver core: Introduce device_create_groups Greg Kroah-Hartman
2013-07-10 20:17 ` Driver core and sysfs changes for attribute groups Oliver Schinagl
2013-07-10 22:04 ` Guenter Roeck
2013-07-10 22:23 ` Greg Kroah-Hartman
2013-07-10 22:34 ` Guenter Roeck
2013-07-10 22:05 ` [PATCH 7/6] driver core: add default groups to struct class Greg Kroah-Hartman
2013-07-10 22:18 ` Guenter Roeck
2013-07-10 22:24 ` Greg Kroah-Hartman
2013-07-10 22:20 ` [PATCH 7/6 v2] " Greg KH
2013-07-11 0:35 ` [PATCH v2 0/7] Driver core and sysfs changes for attribute groups Greg Kroah-Hartman
2013-07-11 0:35 ` [PATCH v2 1/7] sysfs.h: add __ATTR_RW() macro Greg Kroah-Hartman
2013-07-11 0:36 ` [PATCH v2 2/7] sysfs.h: add ATTRIBUTE_GROUPS() macro Greg Kroah-Hartman
2013-07-11 11:58 ` Oliver Schinagl
2013-07-11 17:06 ` Greg Kroah-Hartman [this message]
2013-07-11 20:09 ` Oliver Schinagl
2013-07-11 20:26 ` Greg Kroah-Hartman
2013-07-11 20:55 ` Oliver Schinagl
2013-07-14 22:55 ` Oliver Schinagl
2013-07-14 23:06 ` Greg Kroah-Hartman
2013-07-11 12:03 ` Oliver Schinagl
2013-07-11 17:08 ` Greg Kroah-Hartman
2013-07-11 0:36 ` [PATCH v2 3/7] sysfs.h: add BIN_ATTR macro Greg Kroah-Hartman
2013-07-11 0:36 ` [PATCH v2 4/7] driver core: device.h: add RW and RO attribute macros Greg Kroah-Hartman
2013-07-11 0:36 ` [PATCH v2 5/7] sysfs: add support for binary attributes in groups Greg Kroah-Hartman
2013-07-11 11:45 ` Oliver Schinagl
2013-07-11 16:59 ` Greg Kroah-Hartman
2013-07-11 0:36 ` [PATCH v2 6/7] driver core: Introduce device_create_groups Greg Kroah-Hartman
2013-07-11 0:36 ` [PATCH v2 7/7] driver core: add default groups to struct class Greg Kroah-Hartman
2013-07-11 5:23 ` [PATCH v2 0/7] Driver core and sysfs changes for attribute groups Guenter Roeck
2013-07-11 6:28 ` Greg Kroah-Hartman
2013-07-11 11:14 ` Oliver Schinagl
2013-07-14 17:27 ` Guenter Roeck
2013-07-14 17:32 ` Greg Kroah-Hartman
2013-07-14 18:32 ` Guenter Roeck
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=20130711170648.GC23056@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=khali@linux-fr.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=oliver+list@schinagl.nl \
/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.