From nobody Mon Jun 15 07:37:43 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 97B8C37757D for ; Wed, 8 Apr 2026 19:30:51 +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=1775676654; cv=none; b=nyZN8Bi/qshv9tfbttB30ERLyEtFO/QUHWNODRuq+DQuoKWFPWo6OMcCiF7l9h6nsJT7X2RyBedNPwCV8xfOPXjXFRuM9C+yTvXEUfdwc90Ons83Pc3vuoCyaLZZR7M+agZ+ajh/QPhhPRxj5W5jzlZzxJUqV0DvxvaXxWEY/lA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775676654; c=relaxed/simple; bh=Hbu+TXaOs92MaW0sZBsTU7SFGXW+DhMU4DUSLJtYWbY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d7PacGHRRGqxDb6VaSrFYz2zvu02d307iGUEctqSgnHN1XNqw8Bg9Lmzb1YYQ3DUcQwVHuYue63Y2kQ7q93I0SayrEPKeUYc1Fl714dFaM5hznVWBE5/OYMAFyUEykJ+uXDR5HnQU6r/OV4DOoB1w4bV4W43ONjNjeJP4g1NLLI= 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=XGlUgE8W; 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="XGlUgE8W" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1775676649; bh=Hbu+TXaOs92MaW0sZBsTU7SFGXW+DhMU4DUSLJtYWbY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XGlUgE8WkCUfkxr6XfIR181+ufwRBbuACP3RGScb7kqSMZBxhjO3iHeX1nm4lUJrC 3PapUeF9seelvZIZwsoOheBP5fTBBv+AgEFcC33NBxDXb/7CHheXsbIGCCEDkwvIUv UL69xKi7gVGUEoEkDSKV5t+os1GBry/4pRL/7VpM= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Wed, 08 Apr 2026 21:30:47 +0200 Subject: [PATCH 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: <20260408-sysfs-const-attr-device_attr-prep-v1-1-232934f77b3c@weissschuh.net> References: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@weissschuh.net> In-Reply-To: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@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.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775676649; l=1296; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=Hbu+TXaOs92MaW0sZBsTU7SFGXW+DhMU4DUSLJtYWbY=; b=+s8VdIUIDNVP/4EoxKvH5UfNlDCKroQnBni/BzC9hjufFwzCgbYLCCzTqAjszxmYRQGvkTbjI +vb3HmPcZLiAM06UobZH2HJnQI62hGYn3jZbB7/i28yH41GS6huVSTU 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 f0d52e1a6e07..8ba3168180e5 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.53.0 From nobody Mon Jun 15 07:37:43 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 54206352F9D for ; Wed, 8 Apr 2026 19:30:51 +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=1775676653; cv=none; b=jYW7CVL4N4JD4bv1BjXFho4kGP3TzWMn8lWj8cGXR2WdDGImtQEHcda+xMIOzUMQ1apzv7+QE2MNZNCeDcGKCcz+8WWOChEOlUDOTzwoMtDJc5GHtdV7ncPUwnvamEpBHVEZNx33rhNDwVXzuvfByu89sk5wQVlO5hi8UBHgNhs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775676653; c=relaxed/simple; bh=mlcewPKPxaP2lJBm90zUvK8H7itlW5p6M//h2z7TgMA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=N6b+Y2fH9BVHTx6UIS1ddaN4DjUDleUHVruchfbCf2mcIk9aMXjPkHerWkbq3NTYWdJmAZUoWEyikiPzm2USqorcXFJlUGk6Iji5uc/it5nLPZWMsSstSaby8HzuKoM4rRYwFN0NCM32ZiVZ5x1a2jmiSTjl16gpqXlNjjk22Ko= 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=cttF5Djz; 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="cttF5Djz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1775676649; bh=mlcewPKPxaP2lJBm90zUvK8H7itlW5p6M//h2z7TgMA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cttF5DjzuHAMGI5ft6Arcl94EQu6VIXZnf2DJdRawCsPTqKggyO8dpi6b9l5ZXfm0 RQx7uZRWPIHouLA0DO3eTt5Z45b5PyKRTO0tmh0kNYY7rS9a4FXTKG7xm+5hLgoNBV ZYoYOjBnmRgUoz0tyrWaqWGgxSep/kvUiMwA814U= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Wed, 08 Apr 2026 21:30:48 +0200 Subject: [PATCH 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: <20260408-sysfs-const-attr-device_attr-prep-v1-2-232934f77b3c@weissschuh.net> References: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@weissschuh.net> In-Reply-To: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@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.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775676649; l=5939; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=mlcewPKPxaP2lJBm90zUvK8H7itlW5p6M//h2z7TgMA=; b=G4PQun+/0McWbBB2edgI4uN1g1PQg/p5CdD/eFXASVs2CN7UJCjqIw7Za2lZEKRF01PUhcj+P kMJQwPX+PdGDqmatjnEM2DidJ864c+UVkjKlWoCoY608Zerc/Q/Sdn1 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 8ba3168180e5..a0384dac06ee 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_RO - Define a readable device attribute. @@ -183,7 +204,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. @@ -192,7 +213,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_WO - Define an admin-only writable device attribute. @@ -201,7 +222,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_ULONG_ATTR - Define a device attribute backed by an unsigned lon= g. @@ -214,7 +235,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. @@ -226,7 +247,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. @@ -238,7 +259,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. @@ -251,11 +272,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.53.0 From nobody Mon Jun 15 07:37:43 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 74E4E361679 for ; Wed, 8 Apr 2026 19:30:51 +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=1775676653; cv=none; b=JDEZM1U7ytqJojcM/Va9CXRsGlQk1Qy2W2zG2ozNQIQByd/0mLfLyHzDPfjgNwXd/9AOXcuSA9S7DnmSiRAIkm+P3lWoZJxr5u9gboty3P3dDxAwLhnR3cQnwQewB/vPbkCqDi3O+uZ+gsNXTOcFGSf4+96kwB7Keu1Jiz2K+aA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775676653; c=relaxed/simple; bh=5+dH3jR0AwZQvYGap1t8Z+5wOCcNFjWWNEfTEQJMtJc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cpCFzy1NrXpDYj9LiKZlF3SSWoGH49jS9ZNdOoMiVMyHKxa/hHRnCe23zlgMFzrPn1RZPgpiUsPQJSnaL4WkdeQu8cfPHfaPTdT9L4DvWpaouN3z+t6BtzBB3mFqsGReiTX4hQtoABvB+/csjLzQtgLaJdziQ+WmGQYIz0mPBfs= 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=oDvVKBvD; 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="oDvVKBvD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1775676649; bh=5+dH3jR0AwZQvYGap1t8Z+5wOCcNFjWWNEfTEQJMtJc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oDvVKBvDERFaCYQydKiNFRSt3tQEGfXc/B0+gos6lcvXn+Zaom1rndLeJHd+hPWxU BKjxDMmE9R1uCvGf1gMLKnCYaA3mU+X98EHYxaNrQfXwj8bILculkNLG1ITiTeij3R j05yhafZaqkni2IrWdHvVFnHLQVRBlRWg5domubg= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Wed, 08 Apr 2026 21:30:49 +0200 Subject: [PATCH 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: <20260408-sysfs-const-attr-device_attr-prep-v1-3-232934f77b3c@weissschuh.net> References: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@weissschuh.net> In-Reply-To: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@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.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775676649; l=2231; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=5+dH3jR0AwZQvYGap1t8Z+5wOCcNFjWWNEfTEQJMtJc=; b=j3k6LHi+phl0tL0kE9pjLFELzu8BMkCQsC/NeyU5uGQInILUEAGceMYJm8rzRTnaIhFtA247z xkZfvi5gcSCCPLLnK+k++zJuQeuqqhi71K4q05Q7w1eC1705gUi7atj 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 a0384dac06ee..714e36d610e3 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.53.0 From nobody Mon Jun 15 07:37:43 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 CC55D37B41A for ; Wed, 8 Apr 2026 19:30:54 +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=1775676656; cv=none; b=jfYfAmtX2JKJNOKVAYS9KLs5hKsE1cRrlTM2ZA+lNg/J6QhTe+yRMXQrcWFXFSXVxYSYn0HPVj1NuoLWTvlTgWh2dCKoKoIWJZDgPdyTDETBiac0FxUnoKApzcq6u/ZuKBMdXgHZA8JZJVtM5wY/x1aGmUzww1BSxKJ6hS6m6W8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775676656; c=relaxed/simple; bh=6hwBbCkSpU4vJNM/DAUBPxXilF6YuGEwR/N51hFz5QU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qp1Rxyn+8kilpEFTWCVEbhovquDmlJdWQlFJjtb9GDtWVCIo3ePDiFlMPnZviGzI0lnsuyTauPnKC8LgUB+UGfC5OMdF26rOpEBgOdnYFIgMtCpC+ne7ZUY/ORP6fL5w4p8PGFj3ubswJeLWSHNbJ+V1EuHKOUKtlu3sPXIQYwY= 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=Ye+ib3kR; 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="Ye+ib3kR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1775676649; bh=6hwBbCkSpU4vJNM/DAUBPxXilF6YuGEwR/N51hFz5QU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Ye+ib3kRdA57vx/7nVEPLP0qxFCB0HaGR7SFYrpPemRjqInVoQh89bDz6UFmmeX4f 5RWXIEgRljiA8IZR9DuE0BrP39auw5QKt2xjNJEtOobFgLMV/W5tVQ/Hj6y4VUUcDF mDTdNCssK9wopT2nToFf+1eDQTTNv5PlLpBjKcKg= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Wed, 08 Apr 2026 21:30:50 +0200 Subject: [PATCH 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: <20260408-sysfs-const-attr-device_attr-prep-v1-4-232934f77b3c@weissschuh.net> References: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@weissschuh.net> In-Reply-To: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@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.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775676649; l=5144; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=6hwBbCkSpU4vJNM/DAUBPxXilF6YuGEwR/N51hFz5QU=; b=uvjkhcbUwJMEP/tPwvklh4s0OsNG7X2m5d/LizfTgQmK7mlW6XpyeFATEU/Q1lW21cJvvh4iK sckNf2bgLrcAEmS6uIyUnyW2OcmRI6q0b0f7tRuOi3LDsgDDeyVPdgs 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 763e17e9f148..8a48cb2137ae 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 @@ -3048,10 +3052,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 714e36d610e3..a529a8eaaa9a 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.53.0 From nobody Mon Jun 15 07:37:43 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 25160378813 for ; Wed, 8 Apr 2026 19:30:52 +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=1775676654; cv=none; b=ZMGVCRGtZgcVV/liQiuJtTJ2FsJ+7CtY65uozSqHrwUVSzCh9wGZT8wfqHkgCjSInCQex75YSf5MxsNXFEVxKsXQ00u6CjFPLhZDuI8DefwCRIqdcslVd+wYFvvLcaKyoQ7aAaUfcM3l6J9th2Cn45dXBWDZxM7EQtgX5MTs+m4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775676654; c=relaxed/simple; bh=+nbPD7BwS/SUUadDJb/9lHBAT0OX4YEir/hK/GeyFkA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P6oO7H7KqGcPQgujtMDG9cuZkTxFRnu5z+NivgXaXOIml/uaP3XTgCOXJNMlPOg1qcIlwoig17kPl32Ykx56x1aTNoQUAzlZerjB/wLoWO+zdPwlJGHrUSd3WiTXr150/0MDSG++LjbJDqG+EfofveBV6E6SAYX7LkRMpYUfgAU= 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=YvjBE0ch; 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="YvjBE0ch" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1775676650; bh=+nbPD7BwS/SUUadDJb/9lHBAT0OX4YEir/hK/GeyFkA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YvjBE0chOnpb5vd8z4xnZlOmsr/vuTvzLHqMzbmkjY9XaOSsMTRSajOz5nqCwHxCI Y+vHT/sBuFj1UdUqyx1LfYWprVMI2rNLiy0mhHm8qwpF0lMQ04Iemd0og5JnQkorWZ DefAXrJMSOsyFriSiQlonEDFWAkS9IZ+8PxUV2PY= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Wed, 08 Apr 2026 21:30:51 +0200 Subject: [PATCH 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: <20260408-sysfs-const-attr-device_attr-prep-v1-5-232934f77b3c@weissschuh.net> References: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@weissschuh.net> In-Reply-To: <20260408-sysfs-const-attr-device_attr-prep-v1-0-232934f77b3c@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.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775676649; l=5281; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=+nbPD7BwS/SUUadDJb/9lHBAT0OX4YEir/hK/GeyFkA=; b=phO7B4RvbrhoGoDyzGJa6ZRa9cadragz1y5XEhYk8bXZmoLane21Yk7w0siQf4WXm28vZ1DiB FhFuwUnqy4AAy85Y2WezbmdJdvST4FhsQuthlbHIE7J1k3W1HaB+Dnc 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 8a48cb2137ae..0f314c83eb9d 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 @@ -2727,7 +2727,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; @@ -2770,7 +2770,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; @@ -2784,9 +2784,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; @@ -2797,7 +2797,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; @@ -2815,9 +2815,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; @@ -2834,7 +2834,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.53.0