From nobody Sun Jun 14 04:20:58 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29C901A6808 for ; Mon, 4 May 2026 05:33:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872838; cv=none; b=PBYeGGeni5t0XVb35qbaSWOTIjpw6W5ppNf5hLKlemGQwAP9FPjYjeXs2nXU55lzrHSCw7B3OjLi4DfnofHFYa0p42gyql7l22c3VVvpGOfDhG4MrLSswu7m1t7/IICLycIyETzrkI/g6tUMjAON3R8JTubuDSMzoe4xv0QoRoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872838; c=relaxed/simple; bh=vqKSWoKvW5QRnRu+bO9tguWyf/3swh3oVBfCT9wypb8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HqgSh7NA/6c7WJ75/R80/eCi/sesTH8WZ442i/tYg4xFgjN4INKiYgwnhNSBFC2OJptO9v9NVSGfJggrI1GAepbjsVK1SQODaOFSra8dL46EakVS0UE+DzLrocTIFGjO42rzQPjxpCKJArQlAAM3rSW6dS6GhKxee3MU/Kg7WZU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=tXrK8HqY; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="tXrK8HqY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1777872835; bh=vqKSWoKvW5QRnRu+bO9tguWyf/3swh3oVBfCT9wypb8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tXrK8HqYr9422S1s3TpHYVoVIhoetw0/lFoOebtx2yoXvliJiGverjzTT54HmFWGf 8LYv9Y4IAkrdmyYWxX4yBcXYzsizFjSa9xGEphCTq7sQaOo4zFTR7y+GOQhzZ/RrhY ud6nBwHeEA+v+aacjzEZTItAPcO2/IiwsVDw/iHw= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Mon, 04 May 2026 07:33:50 +0200 Subject: [PATCH v2 1/5] driver core: Delete DEVICE_ATTR_PREALLOC() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260504-sysfs-const-attr-device_attr-prep-v2-1-79d291cb3071@weissschuh.net> References: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> In-Reply-To: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777872834; l=1296; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=vqKSWoKvW5QRnRu+bO9tguWyf/3swh3oVBfCT9wypb8=; b=VOyN8/G3bJzSQBYc6LNER6bTbbXXjUiDxoWpuE3ubjXQHvyB/Jpcf7ES0utkSjW6qtvb4Ws9b cfdWH93bTPLD+rYbhoGGN0aZH1ogGuDqWv0djQedMKuCVlsrOkKd63O X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= This macro is unused and would create extra work during the upcoming constification of device attributes. Remove it. Signed-off-by: Thomas Wei=C3=9Fschuh --- include/linux/device.h | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/include/linux/device.h b/include/linux/device.h index 9c8fde6a3d86..06ec4e27a1e1 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -157,19 +157,6 @@ ssize_t device_show_string(struct device *dev, struct = device_attribute *attr, #define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name =3D __ATTR(_name, _mode, _show, = _store) =20 -/** - * DEVICE_ATTR_PREALLOC - Define a preallocated device attribute. - * @_name: Attribute name. - * @_mode: File mode. - * @_show: Show handler. Optional, but mandatory if attribute is readable. - * @_store: Store handler. Optional, but mandatory if attribute is writabl= e. - * - * Like DEVICE_ATTR(), but ``SYSFS_PREALLOC`` is set on @_mode. - */ -#define DEVICE_ATTR_PREALLOC(_name, _mode, _show, _store) \ - struct device_attribute dev_attr_##_name =3D \ - __ATTR_PREALLOC(_name, _mode, _show, _store) - /** * DEVICE_ATTR_RW - Define a read-write device attribute. * @_name: Attribute name. --=20 2.54.0 From nobody Sun Jun 14 04:20:58 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C385923D7C2 for ; Mon, 4 May 2026 05:33:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872839; cv=none; b=IV3ebammd/uLZEOkYnb1fMQjOhdJvbUMBUjNIBTQhgEBUO/CwE1WDlD/udVQl/zRRoXEUnRjTYlS67/c9HP2P/GWRQmFPh7ggplDUWnnS8803zP6QF9Rf16l5f5DblQJkOovkvUWR3U9lOieZ0YXuUESHKvI6XvrOJDK5A4Vknw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872839; c=relaxed/simple; bh=qVTV8qeG6V+Z9IZtbOivrANMEblCi5CBzzop6HZ4Z0U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Tnw+uFDSuqcULO6ZH5P+6M1BOUTcCYeg3ddeI5zLLLsXJplguJTUuIlpasBhyK2f2z6fxXZZVEAUlGRYLKDG9H5vevuqj/aAJW5KFA9oddtoAoxJkvrUQbo0EwCejn3CAfk1LK1oc857l/zPNAc7TTapMo/Mo2ojtnqPkYmHEAE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=jgAGqCau; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="jgAGqCau" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1777872835; bh=qVTV8qeG6V+Z9IZtbOivrANMEblCi5CBzzop6HZ4Z0U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jgAGqCauDCC2Wv3WI+64HzR8sdFJIc+8QMOyy0CE3EvekQNBQM+aKhBm0BMdY528R TwdCrXSjxqThAhf5GpGd4FyQHRO9stTokWH7SoGalv1VCBLedJOKuOGMjzdkKyQwxV NaDXKCJqZUZ7Un1TBVORayBlXwu2HfGuJsyQryV8= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Mon, 04 May 2026 07:33:51 +0200 Subject: [PATCH v2 2/5] driver core: Add low-level macros for device attributes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260504-sysfs-const-attr-device_attr-prep-v2-2-79d291cb3071@weissschuh.net> References: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> In-Reply-To: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777872834; l=5979; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=qVTV8qeG6V+Z9IZtbOivrANMEblCi5CBzzop6HZ4Z0U=; b=yR8gKkRvWMAWQfjfYHLwCgVP1BsP5OUeTMiWhHn54bNuGLbmk8YTcEDtNQY9W05pnj8/GliuB 6xiDS2zKzO7D/xEJETgIQ91CEf0ONcfoL4FmV1BfVkLFKQlYDrDLo37 X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= For the upcoming constification of device attributes the generic __ATTR() macros are insufficient. Prepare for a split by introducing new low-level macros specific to device attributes. Signed-off-by: Thomas Wei=C3=9Fschuh --- include/linux/device.h | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/include/linux/device.h b/include/linux/device.h index 06ec4e27a1e1..24ed3a6caad2 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -135,6 +135,27 @@ ssize_t device_store_bool(struct device *dev, struct d= evice_attribute *attr, ssize_t device_show_string(struct device *dev, struct device_attribute *at= tr, char *buf); =20 +#define __DEVICE_ATTR(_name, _mode, _show, _store) \ + __ATTR(_name, _mode, _show, _store) + +#define __DEVICE_ATTR_RO_MODE(_name, _mode) \ + __ATTR_RO_MODE(_name, _mode) + +#define __DEVICE_ATTR_RO(_name) \ + __ATTR_RO(_name) + +#define __DEVICE_ATTR_WO(_name) \ + __ATTR_WO(_name) + +#define __DEVICE_ATTR_RW_MODE(_name, _mode) \ + __ATTR_RW_MODE(_name, _mode) + +#define __DEVICE_ATTR_RW(_name) \ + __ATTR_RW(_name) + +#define __DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) \ + __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) + /** * DEVICE_ATTR - Define a device attribute. * @_name: Attribute name. @@ -155,7 +176,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, * }; */ #define DEVICE_ATTR(_name, _mode, _show, _store) \ - struct device_attribute dev_attr_##_name =3D __ATTR(_name, _mode, _show, = _store) + struct device_attribute dev_attr_##_name =3D __DEVICE_ATTR(_name, _mode, = _show, _store) =20 /** * DEVICE_ATTR_RW - Define a read-write device attribute. @@ -165,7 +186,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, * and @_store is <_name>_store. */ #define DEVICE_ATTR_RW(_name) \ - struct device_attribute dev_attr_##_name =3D __ATTR_RW(_name) + struct device_attribute dev_attr_##_name =3D __DEVICE_ATTR_RW(_name) =20 /** * DEVICE_ATTR_ADMIN_RW - Define an admin-only read-write device attribute. @@ -174,7 +195,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, * Like DEVICE_ATTR_RW(), but @_mode is 0600. */ #define DEVICE_ATTR_ADMIN_RW(_name) \ - struct device_attribute dev_attr_##_name =3D __ATTR_RW_MODE(_name, 0600) + struct device_attribute dev_attr_##_name =3D __DEVICE_ATTR_RW_MODE(_name,= 0600) =20 /** * DEVICE_ATTR_RW_NAMED - Define a read-write device attribute with a sysf= s name @@ -199,7 +220,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, * Like DEVICE_ATTR(), but @_mode is 0444 and @_show is <_name>_show. */ #define DEVICE_ATTR_RO(_name) \ - struct device_attribute dev_attr_##_name =3D __ATTR_RO(_name) + struct device_attribute dev_attr_##_name =3D __DEVICE_ATTR_RO(_name) =20 /** * DEVICE_ATTR_ADMIN_RO - Define an admin-only readable device attribute. @@ -208,7 +229,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, * Like DEVICE_ATTR_RO(), but @_mode is 0400. */ #define DEVICE_ATTR_ADMIN_RO(_name) \ - struct device_attribute dev_attr_##_name =3D __ATTR_RO_MODE(_name, 0400) + struct device_attribute dev_attr_##_name =3D __DEVICE_ATTR_RO_MODE(_name,= 0400) =20 /** * DEVICE_ATTR_RO_NAMED - Define a read-only device attribute with a sysfs= name @@ -232,7 +253,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, * Like DEVICE_ATTR(), but @_mode is 0200 and @_store is <_name>_store. */ #define DEVICE_ATTR_WO(_name) \ - struct device_attribute dev_attr_##_name =3D __ATTR_WO(_name) + struct device_attribute dev_attr_##_name =3D __DEVICE_ATTR_WO(_name) =20 /** * DEVICE_ATTR_WO_NAMED - Define a read-only device attribute with a sysfs= name @@ -260,7 +281,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, */ #define DEVICE_ULONG_ATTR(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name =3D \ - { __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } + { __DEVICE_ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(= _var) } =20 /** * DEVICE_INT_ATTR - Define a device attribute backed by an int. @@ -272,7 +293,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, */ #define DEVICE_INT_ATTR(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name =3D \ - { __ATTR(_name, _mode, device_show_int, device_store_int), &(_var) } + { __DEVICE_ATTR(_name, _mode, device_show_int, device_store_int), &(_var= ) } =20 /** * DEVICE_BOOL_ATTR - Define a device attribute backed by a bool. @@ -284,7 +305,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, */ #define DEVICE_BOOL_ATTR(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name =3D \ - { __ATTR(_name, _mode, device_show_bool, device_store_bool), &(_var) } + { __DEVICE_ATTR(_name, _mode, device_show_bool, device_store_bool), &(_v= ar) } =20 /** * DEVICE_STRING_ATTR_RO - Define a device attribute backed by a r/o strin= g. @@ -297,11 +318,11 @@ ssize_t device_show_string(struct device *dev, struct= device_attribute *attr, */ #define DEVICE_STRING_ATTR_RO(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name =3D \ - { __ATTR(_name, (_mode) & ~0222, device_show_string, NULL), (_var) } + { __DEVICE_ATTR(_name, (_mode) & ~0222, device_show_string, NULL), (_var= ) } =20 #define DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name =3D \ - __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) + __DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) =20 int device_create_file(struct device *device, const struct device_attribute *entry); --=20 2.54.0 From nobody Sun Jun 14 04:20:58 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29A4517A305 for ; Mon, 4 May 2026 05:33:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872840; cv=none; b=P6wqitKyBaTzPRcpR8FI7Nrz1ZDyOzwqC9Fc/eGcVPlRGZhTBlVi9EIsxdJ8OTpaprOi3ualfF1FlNbzcPU0mXN21KCWPrLjZ321IBX32rG4MCnov5bcMRgi5czGKakgIkVmzIp3JJzk7UKSG9Is75IhgHqYnoeOB4oMd89DUqg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872840; c=relaxed/simple; bh=Q2Kj+fih1psN3SqbcUkOIM/tNiFEPciiP5rTFtjkws4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ghwAiAPD/JAcZvCfmRkVEYo9ehXm7k+AtL6DDWHDjLWr83X9BN3etW65zR8qjRtXxQaspdkn+dUjptd0na3BmOKNfHuA5tFbY4Ly2dZCNpZSDl4SYRRqvrFX5KQv9zvUKusbTpptqiMiS4fmimk7AzO5DrJexOAPWMSqV8zHaN4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=GoK+KYqh; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="GoK+KYqh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1777872835; bh=Q2Kj+fih1psN3SqbcUkOIM/tNiFEPciiP5rTFtjkws4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GoK+KYqhDiTOVi9owQw0cgAbQ2oChh97WNNz/CX+Z+ebHvZwKY13ZZqHxnhVICQLM AdRziyaUPGGD8D/UkLDjpPmG7gq/panDEi2mAaIwbSRMPvOzU+iqF0C30jWoiRKgXe 8dwhWwVCnwfagopgAvp8NjCk3h/MW5CF7dfvtXQg= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Mon, 04 May 2026 07:33:52 +0200 Subject: [PATCH v2 3/5] driver core: stop using generic sysfs macros for device attributes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260504-sysfs-const-attr-device_attr-prep-v2-3-79d291cb3071@weissschuh.net> References: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> In-Reply-To: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777872834; l=2231; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=Q2Kj+fih1psN3SqbcUkOIM/tNiFEPciiP5rTFtjkws4=; b=nEnVJs638hmPVKHtjYOsiAaY0LReou5ZkIM9bHIS7ZNuQfyM4Y4MILS+2H7g4tPnMGcK5YL+z YlFBGvXm/mjAGeKU24wDZMq7XG5p9LZjmRR1q+XlOSpUDviuU1AkklY X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= The constification of device attributes will require a transition phase, where 'struct device_attribute' contains a classic non-const and a new const variant of the 'show' and 'store' callbacks. As __ATTR() and friends can not handle this duplication stop using them. Signed-off-by: Thomas Wei=C3=9Fschuh --- include/linux/device.h | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/include/linux/device.h b/include/linux/device.h index 24ed3a6caad2..17150b0dfcd6 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -135,26 +135,38 @@ ssize_t device_store_bool(struct device *dev, struct = device_attribute *attr, ssize_t device_show_string(struct device *dev, struct device_attribute *at= tr, char *buf); =20 -#define __DEVICE_ATTR(_name, _mode, _show, _store) \ - __ATTR(_name, _mode, _show, _store) +#define __DEVICE_ATTR(_name, _mode, _show, _store) { \ + .attr =3D {.name =3D __stringify(_name), \ + .mode =3D VERIFY_OCTAL_PERMISSIONS(_mode) }, \ + .show =3D _show, \ + .store =3D _store, \ +} =20 #define __DEVICE_ATTR_RO_MODE(_name, _mode) \ - __ATTR_RO_MODE(_name, _mode) + __DEVICE_ATTR(_name, _mode, _name##_show, NULL) =20 #define __DEVICE_ATTR_RO(_name) \ - __ATTR_RO(_name) + __DEVICE_ATTR_RO_MODE(_name, 0444) =20 #define __DEVICE_ATTR_WO(_name) \ - __ATTR_WO(_name) + __DEVICE_ATTR(_name, 0200, NULL, _name##_store) =20 #define __DEVICE_ATTR_RW_MODE(_name, _mode) \ - __ATTR_RW_MODE(_name, _mode) + __DEVICE_ATTR(_name, _mode, _name##_show, _name##_store) =20 #define __DEVICE_ATTR_RW(_name) \ - __ATTR_RW(_name) - -#define __DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) \ - __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) + __DEVICE_ATTR_RW_MODE(_name, 0644) + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +#define __DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) { \ + .attr =3D {.name =3D __stringify(_name), .mode =3D _mode, \ + .ignore_lockdep =3D true }, \ + .show =3D _show, \ + .store =3D _store, \ +} +#else +#define __DEVICE_ATTR_IGNORE_LOCKDEP __DEVICE_ATTR +#endif =20 /** * DEVICE_ATTR - Define a device attribute. --=20 2.54.0 From nobody Sun Jun 14 04:20:58 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 361DA282F21 for ; Mon, 4 May 2026 05:34:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872841; cv=none; b=YQijwpBHewhxVdQtr3S7cUQKYW3yjJj5/9i/FGHDZnbWW7LqRXse2YSqs7wLqI4RD8/9JUN0Y0nvigHFjbrldtbEkmP+0mP1N0phhYtOIZt6Inkt4cSgrRm3A0Zhp8Y+g6GUQyS5MD0oNoBWAtzolVrphvkmGYvHThHu6Gx1btU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872841; c=relaxed/simple; bh=GJzXC9MC3E6J4BElz4+/m2MofXQnovBTRlLTUNm3Zfc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K3X/yu3Wm6lE8ewxtyO3QffVtbAL5ZXErFDKfS0GKmyxZTTcVw52J9ujUP5NfPZ7yWfdg+vrPiJp1JoWcDnj6qktUycjhnRDQyM6Z3k5aXSQ7Sn9UeZRk3HORkBQAKQy5lsjiC8emyJ0l0U4jv5+uzDFMd+7IXAQIIp5yapM1bQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=elRx7MWZ; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="elRx7MWZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1777872835; bh=GJzXC9MC3E6J4BElz4+/m2MofXQnovBTRlLTUNm3Zfc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=elRx7MWZ+xb5GXnBlmCpANT6+UaHC24V1sVsC8BS2yMUYq8gq9AMBacpretBj1TYC rrW0qJSyE84lGaqmS+P90zSdoBqCIXV/PYXgHtPQH6iJQUwaNTnMzpEBMhEaOiEpit 6unr208Shcr+NwHR3vtTnnL7eIEZcUKwRAsZcx/M= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Mon, 04 May 2026 07:33:53 +0200 Subject: [PATCH v2 4/5] driver core: Allow the constification of device attributes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260504-sysfs-const-attr-device_attr-prep-v2-4-79d291cb3071@weissschuh.net> References: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> In-Reply-To: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777872834; l=5144; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=GJzXC9MC3E6J4BElz4+/m2MofXQnovBTRlLTUNm3Zfc=; b=Wd//sf7xKU5ONMB4qJDYFkmETOBS8ASNXnvi5QRCfmZ6uCwb6TKoyoMyKJ5S9XB7Zs2U6hG+R NN+hGQtYIvcArnYtdehRRSlYV3vBdK+C12W64i6otjO+DvoijcWPVGI X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= Allow device 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=C3=9Fschuh --- drivers/base/core.c | 12 ++++++---- include/linux/device.h | 62 +++++++++++++++++++++++++++++++++++++++++++---= ---- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index bd2ddf2aab50..6e2ee6d55a0b 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -2419,9 +2419,11 @@ static ssize_t dev_attr_show(struct kobject *kobj, s= truct attribute *attr, =20 if (dev_attr->show) ret =3D dev_attr->show(dev, dev_attr, buf); + else if (dev_attr->show_const) + ret =3D dev_attr->show_const(dev, dev_attr, buf); if (ret >=3D (ssize_t)PAGE_SIZE) { - printk("dev_attr_show: %pS returned bad count\n", - dev_attr->show); + printk("dev_attr_show: %pS/%pS returned bad count\n", + dev_attr->show, dev_attr->show_const); } return ret; } @@ -2435,6 +2437,8 @@ static ssize_t dev_attr_store(struct kobject *kobj, s= truct attribute *attr, =20 if (dev_attr->store) ret =3D dev_attr->store(dev, dev_attr, buf, count); + else if (dev_attr->store_const) + ret =3D dev_attr->store_const(dev, dev_attr, buf, count); return ret; } =20 @@ -3047,10 +3051,10 @@ int device_create_file(struct device *dev, int error =3D 0; =20 if (dev) { - WARN(((attr->attr.mode & S_IWUGO) && !attr->store), + WARN(((attr->attr.mode & S_IWUGO) && !(attr->store || attr->store_const)= ), "Attribute %s: write permission without 'store'\n", attr->attr.name); - WARN(((attr->attr.mode & S_IRUGO) && !attr->show), + WARN(((attr->attr.mode & S_IRUGO) && !(attr->show || attr->show_const)), "Attribute %s: read permission without 'show'\n", attr->attr.name); error =3D sysfs_create_file(&dev->kobj, &attr->attr); diff --git a/include/linux/device.h b/include/linux/device.h index 17150b0dfcd6..415a0c483db3 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -104,10 +104,18 @@ struct device_type { */ struct device_attribute { struct attribute attr; - ssize_t (*show)(struct device *dev, struct device_attribute *attr, - char *buf); - ssize_t (*store)(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count); + __SYSFS_FUNCTION_ALTERNATIVE( + ssize_t (*show)(struct device *dev, struct device_attribute *attr, + char *buf); + ssize_t (*show_const)(struct device *dev, const struct device_attribute = *attr, + char *buf); + ); + __SYSFS_FUNCTION_ALTERNATIVE( + ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); + ssize_t (*store_const)(struct device *dev, const struct device_attribute= *attr, + const char *buf, size_t count); + ); }; =20 /** @@ -135,11 +143,50 @@ ssize_t device_store_bool(struct device *dev, struct = device_attribute *attr, ssize_t device_show_string(struct device *dev, struct device_attribute *at= tr, char *buf); =20 +typedef ssize_t __device_show_handler_const(struct device *dev, const stru= ct device_attribute *attr, + char *buf); +typedef ssize_t __device_store_handler_const(struct device *dev, const str= uct device_attribute *attr, + const char *buf, size_t count); + +#ifdef CONFIG_CFI + +#define __DEVICE_ATTR_SHOW_STORE(_show, _store) \ + .show =3D _Generic(_show, \ + __device_show_handler_const * : NULL, \ + default : _show \ + ), \ + .show_const =3D _Generic(_show, \ + __device_show_handler_const * : _show, \ + default : NULL \ + ), \ + .store =3D _Generic(_store, \ + __device_store_handler_const * : NULL, \ + default : _store \ + ), \ + .store_const =3D _Generic(_store, \ + __device_store_handler_const * : _store, \ + default : NULL \ + ), + +#else + +#define __DEVICE_ATTR_SHOW_STORE(_show, _store) \ + .show =3D _Generic(_show, \ + __device_show_handler_const * : (void *)_show, \ + default : _show \ + ), \ + .store =3D _Generic(_store, \ + __device_store_handler_const * : (void *)_store, \ + default : _store \ + ), \ + +#endif + + #define __DEVICE_ATTR(_name, _mode, _show, _store) { \ .attr =3D {.name =3D __stringify(_name), \ .mode =3D VERIFY_OCTAL_PERMISSIONS(_mode) }, \ - .show =3D _show, \ - .store =3D _store, \ + __DEVICE_ATTR_SHOW_STORE(_show, _store) \ } =20 #define __DEVICE_ATTR_RO_MODE(_name, _mode) \ @@ -161,8 +208,7 @@ ssize_t device_show_string(struct device *dev, struct d= evice_attribute *attr, #define __DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) { \ .attr =3D {.name =3D __stringify(_name), .mode =3D _mode, \ .ignore_lockdep =3D true }, \ - .show =3D _show, \ - .store =3D _store, \ + __DEVICE_ATTR_SHOW_STORE(_show, _store) \ } #else #define __DEVICE_ATTR_IGNORE_LOCKDEP __DEVICE_ATTR --=20 2.54.0 From nobody Sun Jun 14 04:20:58 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8F0321B905 for ; Mon, 4 May 2026 05:33:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872839; cv=none; b=luLaKrdjo16siNP8cWsskiJjF8K8lioRz44iqiohnnI1IOsvzQGR9srw8aeYP+Qwd+exr6a/I7eFapYTpiAQYSDFfls4ZW4KCPm/51g/lYVdD7sJjmyTH+VzoaAve28O0WJU1yjuUlQIYtxSE823Q4G6phpZD7YuR/0/hoqvAo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777872839; c=relaxed/simple; bh=91686VJ9d78AeJ13E3LIE9Z7m4b6KFjCUuhCxUwlX6o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=So+laWFBXPPgXkEnjApka7/egM9hKjwjpH4zyoMQduQiu2feIeR6+9XxwK4IFs2O6b0hXbTiCq6R0lAKDSmEg124c4uymwA2Avpsq2MB4fxBdOMeZ1LpiDFg5vLtfjayyvTEgvRO/pLUctNOg9FhB4JgG5sflQRSL1mX0Wy101I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=H5UCOYpN; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="H5UCOYpN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1777872835; bh=91686VJ9d78AeJ13E3LIE9Z7m4b6KFjCUuhCxUwlX6o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=H5UCOYpNEb1NByKKu2719XAOsYRKrogyr09pVwzDJK9fnuMy2UAu4yGvcw8yblqL/ FxQ6XgmRVc2bHNQ5/KO+wXaj3WjWrrNREb2nZkooDriksClFKZgYrgdDQxOAjQdIWK u74lXjITDLyfg0KwT5mL+SWpJDucR26uREevEvdA= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Mon, 04 May 2026 07:33:54 +0200 Subject: [PATCH v2 5/5] driver core: Constify core device attributes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260504-sysfs-const-attr-device_attr-prep-v2-5-79d291cb3071@weissschuh.net> References: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> In-Reply-To: <20260504-sysfs-const-attr-device_attr-prep-v2-0-79d291cb3071@weissschuh.net> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777872834; l=5281; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=91686VJ9d78AeJ13E3LIE9Z7m4b6KFjCUuhCxUwlX6o=; b=wZgmEyRJHyZZp0gMx5oMQkBEswXDetts381puEPVq4fSPWWfQfPWsy68bEfwUmOM2nme4iPS4 dOWpNKP5LERCGf/7Mb0ibmwOsoyA1cAhxhFTHNZYO9Qp5Znf1Zmgh0Y X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= To make sure these attributes are not modified by accident or by an attacker, move them to read-only memory. Signed-off-by: Thomas Wei=C3=9Fschuh --- drivers/base/core.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index 6e2ee6d55a0b..08f832c2846f 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -422,7 +422,7 @@ void device_pm_move_to_tail(struct device *dev) #define to_devlink(dev) container_of((dev), struct device_link, link_dev) =20 static ssize_t status_show(struct device *dev, - struct device_attribute *attr, char *buf) + const struct device_attribute *attr, char *buf) { const char *output; =20 @@ -452,10 +452,10 @@ static ssize_t status_show(struct device *dev, =20 return sysfs_emit(buf, "%s\n", output); } -static DEVICE_ATTR_RO(status); +static const DEVICE_ATTR_RO(status); =20 static ssize_t auto_remove_on_show(struct device *dev, - struct device_attribute *attr, char *buf) + const struct device_attribute *attr, char *buf) { struct device_link *link =3D to_devlink(dev); const char *output; @@ -469,27 +469,27 @@ static ssize_t auto_remove_on_show(struct device *dev, =20 return sysfs_emit(buf, "%s\n", output); } -static DEVICE_ATTR_RO(auto_remove_on); +static const DEVICE_ATTR_RO(auto_remove_on); =20 static ssize_t runtime_pm_show(struct device *dev, - struct device_attribute *attr, char *buf) + const struct device_attribute *attr, char *buf) { struct device_link *link =3D to_devlink(dev); =20 return sysfs_emit(buf, "%d\n", device_link_test(link, DL_FLAG_PM_RUNTIME)= ); } -static DEVICE_ATTR_RO(runtime_pm); +static const DEVICE_ATTR_RO(runtime_pm); =20 static ssize_t sync_state_only_show(struct device *dev, - struct device_attribute *attr, char *buf) + const struct device_attribute *attr, char *buf) { struct device_link *link =3D to_devlink(dev); =20 return sysfs_emit(buf, "%d\n", device_link_test(link, DL_FLAG_SYNC_STATE_= ONLY)); } -static DEVICE_ATTR_RO(sync_state_only); +static const DEVICE_ATTR_RO(sync_state_only); =20 -static struct attribute *devlink_attrs[] =3D { +static const struct attribute *const devlink_attrs[] =3D { &dev_attr_status.attr, &dev_attr_auto_remove_on.attr, &dev_attr_runtime_pm.attr, @@ -1233,7 +1233,7 @@ static void device_link_drop_managed(struct device_li= nk *link) } =20 static ssize_t waiting_for_supplier_show(struct device *dev, - struct device_attribute *attr, + const struct device_attribute *attr, char *buf) { bool val; @@ -1244,7 +1244,7 @@ static ssize_t waiting_for_supplier_show(struct devic= e *dev, device_unlock(dev); return sysfs_emit(buf, "%u\n", val); } -static DEVICE_ATTR_RO(waiting_for_supplier); +static const DEVICE_ATTR_RO(waiting_for_supplier); =20 /** * device_links_force_bind - Prepares device to be force bound @@ -2726,7 +2726,7 @@ static const struct kset_uevent_ops device_uevent_ops= =3D { .uevent =3D dev_uevent, }; =20 -static ssize_t uevent_show(struct device *dev, struct device_attribute *at= tr, +static ssize_t uevent_show(struct device *dev, const struct device_attribu= te *attr, char *buf) { struct kobject *top_kobj; @@ -2769,7 +2769,7 @@ static ssize_t uevent_show(struct device *dev, struct= device_attribute *attr, return len; } =20 -static ssize_t uevent_store(struct device *dev, struct device_attribute *a= ttr, +static ssize_t uevent_store(struct device *dev, const struct device_attrib= ute *attr, const char *buf, size_t count) { int rc; @@ -2783,9 +2783,9 @@ static ssize_t uevent_store(struct device *dev, struc= t device_attribute *attr, =20 return count; } -static DEVICE_ATTR_RW(uevent); +static const DEVICE_ATTR_RW(uevent); =20 -static ssize_t online_show(struct device *dev, struct device_attribute *at= tr, +static ssize_t online_show(struct device *dev, const struct device_attribu= te *attr, char *buf) { bool val; @@ -2796,7 +2796,7 @@ static ssize_t online_show(struct device *dev, struct= device_attribute *attr, return sysfs_emit(buf, "%u\n", val); } =20 -static ssize_t online_store(struct device *dev, struct device_attribute *a= ttr, +static ssize_t online_store(struct device *dev, const struct device_attrib= ute *attr, const char *buf, size_t count) { bool val; @@ -2814,9 +2814,9 @@ static ssize_t online_store(struct device *dev, struc= t device_attribute *attr, unlock_device_hotplug(); return ret < 0 ? ret : count; } -static DEVICE_ATTR_RW(online); +static const DEVICE_ATTR_RW(online); =20 -static ssize_t removable_show(struct device *dev, struct device_attribute = *attr, +static ssize_t removable_show(struct device *dev, const struct device_attr= ibute *attr, char *buf) { const char *loc; @@ -2833,7 +2833,7 @@ static ssize_t removable_show(struct device *dev, str= uct device_attribute *attr, } return sysfs_emit(buf, "%s\n", loc); } -static DEVICE_ATTR_RO(removable); +static const DEVICE_ATTR_RO(removable); =20 int device_add_groups(struct device *dev, const struct attribute_group *const *groups) --=20 2.54.0