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 |
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 --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);
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(-)