diff mbox series

[4/5] drm/amdgpu: Constify 'struct bin_attribute'

Message ID 20241216-sysfs-const-bin_attr-drm-v1-4-210f2b36b9bf@weissschuh.net (mailing list archive)
State New
Headers show
Series drm: Constify 'struct bin_attribute' | expand

Commit Message

Thomas Weißschuh Dec. 16, 2024, 11:34 a.m. UTC
The sysfs core now allows instances of 'struct bin_attribute' to be
moved into read-only memory. Make use of that to protect them against
accidental or malicious modifications.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  6 +++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c    | 14 +++++++-------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c    | 13 ++++++-------
 3 files changed, 16 insertions(+), 17 deletions(-)

Comments

Alex Deucher Dec. 16, 2024, 7:53 p.m. UTC | #1
On Mon, Dec 16, 2024 at 6:53 AM Thomas Weißschuh <linux@weissschuh.net> wrote:
>
> The sysfs core now allows instances of 'struct bin_attribute' to be
> moved into read-only memory. Make use of that to protect them against
> accidental or malicious modifications.
>
> Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  6 +++---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c    | 14 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c    | 13 ++++++-------
>  3 files changed, 16 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index d272d95dd5b2f5eb83be279281d55af323f7f508..88459de2cd2e47390d33e5939875c3322b740b4d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -223,7 +223,7 @@ static DEVICE_ATTR(pcie_replay_count, 0444,
>                 amdgpu_device_get_pcie_replay_count, NULL);
>
>  static ssize_t amdgpu_sysfs_reg_state_get(struct file *f, struct kobject *kobj,
> -                                         struct bin_attribute *attr, char *buf,
> +                                         const struct bin_attribute *attr, char *buf,
>                                           loff_t ppos, size_t count)
>  {
>         struct device *dev = kobj_to_dev(kobj);
> @@ -259,8 +259,8 @@ static ssize_t amdgpu_sysfs_reg_state_get(struct file *f, struct kobject *kobj,
>         return bytes_read;
>  }
>
> -BIN_ATTR(reg_state, 0444, amdgpu_sysfs_reg_state_get, NULL,
> -        AMDGPU_SYS_REG_STATE_END);
> +static const BIN_ATTR(reg_state, 0444, amdgpu_sysfs_reg_state_get, NULL,
> +                     AMDGPU_SYS_REG_STATE_END);
>
>  int amdgpu_reg_state_sysfs_init(struct amdgpu_device *adev)
>  {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index 448f9e742983f3ef0c5fccc18d85f0c2449aa08e..cda25174730a6852bcb6e01aeec858faad172b19 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -3969,7 +3969,7 @@ int is_psp_fw_valid(struct psp_bin_desc bin)
>  }
>
>  static ssize_t amdgpu_psp_vbflash_write(struct file *filp, struct kobject *kobj,
> -                                       struct bin_attribute *bin_attr,
> +                                       const struct bin_attribute *bin_attr,
>                                         char *buffer, loff_t pos, size_t count)
>  {
>         struct device *dev = kobj_to_dev(kobj);
> @@ -4005,7 +4005,7 @@ static ssize_t amdgpu_psp_vbflash_write(struct file *filp, struct kobject *kobj,
>  }
>
>  static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,
> -                                      struct bin_attribute *bin_attr, char *buffer,
> +                                      const struct bin_attribute *bin_attr, char *buffer,
>                                        loff_t pos, size_t count)
>  {
>         struct device *dev = kobj_to_dev(kobj);
> @@ -4057,11 +4057,11 @@ static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,
>   * Writing to this file will stage an IFWI for update. Reading from this file
>   * will trigger the update process.
>   */
> -static struct bin_attribute psp_vbflash_bin_attr = {
> +static const struct bin_attribute psp_vbflash_bin_attr = {
>         .attr = {.name = "psp_vbflash", .mode = 0660},
>         .size = 0,
> -       .write = amdgpu_psp_vbflash_write,
> -       .read = amdgpu_psp_vbflash_read,
> +       .write_new = amdgpu_psp_vbflash_write,
> +       .read_new = amdgpu_psp_vbflash_read,
>  };
>
>  /**
> @@ -4088,7 +4088,7 @@ static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
>  }
>  static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);
>
> -static struct bin_attribute *bin_flash_attrs[] = {
> +static const struct bin_attribute *const bin_flash_attrs[] = {
>         &psp_vbflash_bin_attr,
>         NULL
>  };
> @@ -4124,7 +4124,7 @@ static umode_t amdgpu_bin_flash_attr_is_visible(struct kobject *kobj,
>
>  const struct attribute_group amdgpu_flash_attr_group = {
>         .attrs = flash_attrs,
> -       .bin_attrs = bin_flash_attrs,
> +       .bin_attrs_new = bin_flash_attrs,
>         .is_bin_visible = amdgpu_bin_flash_attr_is_visible,
>         .is_visible = amdgpu_flash_attr_is_visible,
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> index 4c9fa24dd9726a405935907524ed7bf7862779d1..2991e0967b5bfc848328aaa59ddfb9a8f202bae9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> @@ -1732,7 +1732,7 @@ static char *amdgpu_ras_badpage_flags_str(unsigned int flags)
>   */
>
>  static ssize_t amdgpu_ras_sysfs_badpages_read(struct file *f,
> -               struct kobject *kobj, struct bin_attribute *attr,
> +               struct kobject *kobj, const struct bin_attribute *attr,
>                 char *buf, loff_t ppos, size_t count)
>  {
>         struct amdgpu_ras *con =
> @@ -2063,8 +2063,8 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
>  /* debugfs end */
>
>  /* ras fs */
> -static BIN_ATTR(gpu_vram_bad_pages, S_IRUGO,
> -               amdgpu_ras_sysfs_badpages_read, NULL, 0);
> +static const BIN_ATTR(gpu_vram_bad_pages, S_IRUGO,
> +                     amdgpu_ras_sysfs_badpages_read, NULL, 0);
>  static DEVICE_ATTR(features, S_IRUGO,
>                 amdgpu_ras_sysfs_features_read, NULL);
>  static DEVICE_ATTR(version, 0444,
> @@ -2086,7 +2086,7 @@ static int amdgpu_ras_fs_init(struct amdgpu_device *adev)
>                 &con->event_state_attr.attr,
>                 NULL
>         };
> -       struct bin_attribute *bin_attrs[] = {
> +       const struct bin_attribute *bin_attrs[] = {
>                 NULL,
>                 NULL,
>         };
> @@ -2112,11 +2112,10 @@ static int amdgpu_ras_fs_init(struct amdgpu_device *adev)
>
>         if (amdgpu_bad_page_threshold != 0) {
>                 /* add bad_page_features entry */
> -               bin_attr_gpu_vram_bad_pages.private = NULL;
>                 con->badpages_attr = bin_attr_gpu_vram_bad_pages;
> +               sysfs_bin_attr_init(&con->badpages_attr);
>                 bin_attrs[0] = &con->badpages_attr;
> -               group.bin_attrs = bin_attrs;
> -               sysfs_bin_attr_init(bin_attrs[0]);
> +               group.bin_attrs_new = bin_attrs;
>         }
>
>         r = sysfs_create_group(&adev->dev->kobj, &group);
>
> --
> 2.47.1
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index d272d95dd5b2f5eb83be279281d55af323f7f508..88459de2cd2e47390d33e5939875c3322b740b4d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -223,7 +223,7 @@  static DEVICE_ATTR(pcie_replay_count, 0444,
 		amdgpu_device_get_pcie_replay_count, NULL);
 
 static ssize_t amdgpu_sysfs_reg_state_get(struct file *f, struct kobject *kobj,
-					  struct bin_attribute *attr, char *buf,
+					  const struct bin_attribute *attr, char *buf,
 					  loff_t ppos, size_t count)
 {
 	struct device *dev = kobj_to_dev(kobj);
@@ -259,8 +259,8 @@  static ssize_t amdgpu_sysfs_reg_state_get(struct file *f, struct kobject *kobj,
 	return bytes_read;
 }
 
-BIN_ATTR(reg_state, 0444, amdgpu_sysfs_reg_state_get, NULL,
-	 AMDGPU_SYS_REG_STATE_END);
+static const BIN_ATTR(reg_state, 0444, amdgpu_sysfs_reg_state_get, NULL,
+		      AMDGPU_SYS_REG_STATE_END);
 
 int amdgpu_reg_state_sysfs_init(struct amdgpu_device *adev)
 {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 448f9e742983f3ef0c5fccc18d85f0c2449aa08e..cda25174730a6852bcb6e01aeec858faad172b19 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -3969,7 +3969,7 @@  int is_psp_fw_valid(struct psp_bin_desc bin)
 }
 
 static ssize_t amdgpu_psp_vbflash_write(struct file *filp, struct kobject *kobj,
-					struct bin_attribute *bin_attr,
+					const struct bin_attribute *bin_attr,
 					char *buffer, loff_t pos, size_t count)
 {
 	struct device *dev = kobj_to_dev(kobj);
@@ -4005,7 +4005,7 @@  static ssize_t amdgpu_psp_vbflash_write(struct file *filp, struct kobject *kobj,
 }
 
 static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,
-				       struct bin_attribute *bin_attr, char *buffer,
+				       const struct bin_attribute *bin_attr, char *buffer,
 				       loff_t pos, size_t count)
 {
 	struct device *dev = kobj_to_dev(kobj);
@@ -4057,11 +4057,11 @@  static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,
  * Writing to this file will stage an IFWI for update. Reading from this file
  * will trigger the update process.
  */
-static struct bin_attribute psp_vbflash_bin_attr = {
+static const struct bin_attribute psp_vbflash_bin_attr = {
 	.attr = {.name = "psp_vbflash", .mode = 0660},
 	.size = 0,
-	.write = amdgpu_psp_vbflash_write,
-	.read = amdgpu_psp_vbflash_read,
+	.write_new = amdgpu_psp_vbflash_write,
+	.read_new = amdgpu_psp_vbflash_read,
 };
 
 /**
@@ -4088,7 +4088,7 @@  static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
 }
 static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);
 
-static struct bin_attribute *bin_flash_attrs[] = {
+static const struct bin_attribute *const bin_flash_attrs[] = {
 	&psp_vbflash_bin_attr,
 	NULL
 };
@@ -4124,7 +4124,7 @@  static umode_t amdgpu_bin_flash_attr_is_visible(struct kobject *kobj,
 
 const struct attribute_group amdgpu_flash_attr_group = {
 	.attrs = flash_attrs,
-	.bin_attrs = bin_flash_attrs,
+	.bin_attrs_new = bin_flash_attrs,
 	.is_bin_visible = amdgpu_bin_flash_attr_is_visible,
 	.is_visible = amdgpu_flash_attr_is_visible,
 };
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 4c9fa24dd9726a405935907524ed7bf7862779d1..2991e0967b5bfc848328aaa59ddfb9a8f202bae9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -1732,7 +1732,7 @@  static char *amdgpu_ras_badpage_flags_str(unsigned int flags)
  */
 
 static ssize_t amdgpu_ras_sysfs_badpages_read(struct file *f,
-		struct kobject *kobj, struct bin_attribute *attr,
+		struct kobject *kobj, const struct bin_attribute *attr,
 		char *buf, loff_t ppos, size_t count)
 {
 	struct amdgpu_ras *con =
@@ -2063,8 +2063,8 @@  void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
 /* debugfs end */
 
 /* ras fs */
-static BIN_ATTR(gpu_vram_bad_pages, S_IRUGO,
-		amdgpu_ras_sysfs_badpages_read, NULL, 0);
+static const BIN_ATTR(gpu_vram_bad_pages, S_IRUGO,
+		      amdgpu_ras_sysfs_badpages_read, NULL, 0);
 static DEVICE_ATTR(features, S_IRUGO,
 		amdgpu_ras_sysfs_features_read, NULL);
 static DEVICE_ATTR(version, 0444,
@@ -2086,7 +2086,7 @@  static int amdgpu_ras_fs_init(struct amdgpu_device *adev)
 		&con->event_state_attr.attr,
 		NULL
 	};
-	struct bin_attribute *bin_attrs[] = {
+	const struct bin_attribute *bin_attrs[] = {
 		NULL,
 		NULL,
 	};
@@ -2112,11 +2112,10 @@  static int amdgpu_ras_fs_init(struct amdgpu_device *adev)
 
 	if (amdgpu_bad_page_threshold != 0) {
 		/* add bad_page_features entry */
-		bin_attr_gpu_vram_bad_pages.private = NULL;
 		con->badpages_attr = bin_attr_gpu_vram_bad_pages;
+		sysfs_bin_attr_init(&con->badpages_attr);
 		bin_attrs[0] = &con->badpages_attr;
-		group.bin_attrs = bin_attrs;
-		sysfs_bin_attr_init(bin_attrs[0]);
+		group.bin_attrs_new = bin_attrs;
 	}
 
 	r = sysfs_create_group(&adev->dev->kobj, &group);