mirror of
https://github.com/torvalds/linux.git
synced 2025-04-12 06:49:52 +00:00
module: sysfs: Simplify section attribute allocation
The existing allocation logic manually stuffs two allocations into one. This is hard to understand and of limited value, given that all the section names are allocated on their own anyways. Une one allocation per datastructure. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Reviewed-by: Petr Pavlu <petr.pavlu@suse.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://lore.kernel.org/r/20241227-sysfs-const-bin_attr-module-v2-4-e267275f0f37@weissschuh.net Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
This commit is contained in:
parent
34f5ec0f82
commit
f47c0bebed
@ -58,34 +58,37 @@ static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
|
||||
|
||||
for (bin_attr = sect_attrs->grp.bin_attrs; *bin_attr; bin_attr++)
|
||||
kfree((*bin_attr)->attr.name);
|
||||
kfree(sect_attrs->grp.bin_attrs);
|
||||
kfree(sect_attrs);
|
||||
}
|
||||
|
||||
static int add_sect_attrs(struct module *mod, const struct load_info *info)
|
||||
{
|
||||
unsigned int nloaded = 0, i, size[2];
|
||||
struct module_sect_attrs *sect_attrs;
|
||||
struct bin_attribute **gattr;
|
||||
struct bin_attribute *sattr;
|
||||
unsigned int nloaded = 0, i;
|
||||
int ret;
|
||||
|
||||
/* Count loaded sections and allocate structures */
|
||||
for (i = 0; i < info->hdr->e_shnum; i++)
|
||||
if (!sect_empty(&info->sechdrs[i]))
|
||||
nloaded++;
|
||||
size[0] = ALIGN(struct_size(sect_attrs, attrs, nloaded),
|
||||
sizeof(sect_attrs->grp.bin_attrs[0]));
|
||||
size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.bin_attrs[0]);
|
||||
sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
|
||||
sect_attrs = kzalloc(struct_size(sect_attrs, attrs, nloaded), GFP_KERNEL);
|
||||
if (!sect_attrs)
|
||||
return -ENOMEM;
|
||||
|
||||
gattr = kcalloc(nloaded + 1, sizeof(*gattr), GFP_KERNEL);
|
||||
if (!gattr) {
|
||||
kfree(sect_attrs);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Setup section attributes. */
|
||||
sect_attrs->grp.name = "sections";
|
||||
sect_attrs->grp.bin_attrs = (void *)sect_attrs + size[0];
|
||||
sect_attrs->grp.bin_attrs = gattr;
|
||||
|
||||
sattr = §_attrs->attrs[0];
|
||||
gattr = §_attrs->grp.bin_attrs[0];
|
||||
for (i = 0; i < info->hdr->e_shnum; i++) {
|
||||
Elf_Shdr *sec = &info->sechdrs[i];
|
||||
|
||||
@ -104,7 +107,6 @@ static int add_sect_attrs(struct module *mod, const struct load_info *info)
|
||||
sattr->attr.mode = 0400;
|
||||
*(gattr++) = sattr++;
|
||||
}
|
||||
*gattr = NULL;
|
||||
|
||||
ret = sysfs_create_group(&mod->mkobj.kobj, §_attrs->grp);
|
||||
if (ret)
|
||||
|
Loading…
x
Reference in New Issue
Block a user