kobject: Allow the constification of kobject attributes

Allow kobject attribute to reside in read-only memory.
Both const and non-const attributes are handled by the utility macros
and attributes can be migrated one-by-one.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Link: https://patch.msgid.link/20260707-sysfs-const-attr-kobj-attr-prep-v2-3-35ae1bc0f9ef@weissschuh.net
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
Thomas Weißschuh
2026-07-11 20:38:01 +02:00
committed by Danilo Krummrich
parent a3a9c7453f
commit ed96337a5b
2 changed files with 57 additions and 8 deletions
+51 -6
View File
@@ -138,17 +138,62 @@ struct kset_uevent_ops {
struct kobj_attribute {
struct attribute attr;
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
char *buf);
ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t count);
__SYSFS_FUNCTION_ALTERNATIVE(
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
ssize_t (*show_const)(struct kobject *kobj, const struct kobj_attribute *attr,
char *buf);
);
__SYSFS_FUNCTION_ALTERNATIVE(
ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t count);
ssize_t (*store_const)(struct kobject *kobj, const struct kobj_attribute *attr,
const char *buf, size_t count);
);
};
typedef ssize_t __kobj_show_handler_const(struct kobject *kobj, const struct kobj_attribute *attr,
char *buf);
typedef ssize_t __kobj_store_handler_const(struct kobject *kobj, const struct kobj_attribute *attr,
const char *buf, size_t count);
#ifdef CONFIG_CFI
#define __KOBJ_ATTR_SHOW_STORE(_show, _store) \
.show = _Generic(_show, \
__kobj_show_handler_const * : NULL, \
default : _show \
), \
.show_const = _Generic(_show, \
__kobj_show_handler_const * : _show, \
default : NULL \
), \
.store = _Generic(_store, \
__kobj_store_handler_const * : NULL, \
default : _store \
), \
.store_const = _Generic(_store, \
__kobj_store_handler_const * : _store, \
default : NULL \
),
#else
#define __KOBJ_ATTR_SHOW_STORE(_show, _store) \
.show = _Generic(_show, \
__kobj_show_handler_const * : (void *)_show, \
default : _show \
), \
.store = _Generic(_store, \
__kobj_store_handler_const * : (void *)_store, \
default : _store \
), \
#endif
#define __KOBJ_ATTR(_name, _mode, _show, _store) { \
.attr = { .name = __stringify(_name), \
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
.show = _show, \
.store = _store, \
__KOBJ_ATTR_SHOW_STORE(_show, _store) \
}
#define __KOBJ_ATTR_RO_MODE(_name, _mode) \
+6 -2
View File
@@ -823,9 +823,11 @@ static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
struct kobj_attribute *kattr;
ssize_t ret = -EIO;
kattr = container_of(attr, struct kobj_attribute, attr);
kattr = container_of_const(attr, struct kobj_attribute, attr);
if (kattr->show)
ret = kattr->show(kobj, kattr, buf);
else if (kattr->show_const)
ret = kattr->show_const(kobj, kattr, buf);
return ret;
}
@@ -835,9 +837,11 @@ static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
struct kobj_attribute *kattr;
ssize_t ret = -EIO;
kattr = container_of(attr, struct kobj_attribute, attr);
kattr = container_of_const(attr, struct kobj_attribute, attr);
if (kattr->store)
ret = kattr->store(kobj, kattr, buf, count);
else if (kattr->store_const)
ret = kattr->store_const(kobj, kattr, buf, count);
return ret;
}