Skip to contentSkip to conversation

modules: don't export section names of empty sections via sysfs

PATCH Applied Helge Deller 4 participants 4 messages Dec 2, 2009 – Dec 3, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 modules: don't export section names of empty sections via sysfs

[PATCH] modules: don't export section names of empty sections via sysfs

On the parisc architecture we face for each and every loaded kernel module this kernel "badness warning":
sysfs: cannot create duplicate filename '/module/ac97_bus/sections/.text' Badness at fs/sysfs/dir.c:487

Reason for that is, that on parisc all kernel modules do have multiple .text sections due to the usage of the -ffunction-sections compiler flag which is needed to reach all jump targets on this platform.

An objdump on such a kernel module gives:
Sections:
Idx Name Size VMA LMA File off Algn
0 .note.gnu.build-id 00000024 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .text 00000000 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .text.ac97_bus_match 0000001c 00000000 00000000 00000058 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .text 00000000 00000000 00000000 000000d4 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
...
Since the .text sections are empty (size of 0 bytes) and won't be loaded by the kernel module loader anyway, I don't see a reason why such sections need to be listed under /sys/module/<module_name>/sections/<section_name> either.

The attached patch does solve this issue by not exporting section names which are empty.

This fixes bugzilla http://bugzilla.kernel.org/show_bug.cgi?id=14703

kernel/module.c +4 -1
index 8b7d880..5842a71 100644
@@ -1187,7 +1187,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect,
 
 	/* Count loaded sections and allocate structures */
 	for (i = 0; i < nsect; i++)
-		if (sechdrs[i].sh_flags & SHF_ALLOC)
+		if (sechdrs[i].sh_flags & SHF_ALLOC
+		    && sechdrs[i].sh_size)
 			nloaded++;
 	size[0] = ALIGN(sizeof(*sect_attrs)
 			+ nloaded * sizeof(sect_attrs->attrs[0]),
@@ -1207,6 +1208,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect,
 	for (i = 0; i < nsect; i++) {
 		if (! (sechdrs[i].sh_flags & SHF_ALLOC))
 			continue;
+		if (!sechdrs[i].sh_size)
+			continue;
 		sattr->address = sechdrs[i].sh_addr;
 		sattr->name = kstrdup(secstrings + sechdrs[i].sh_name,
 					GFP_KERNEL);
#1 lore raw
Quoted 1 line · Helge Deller

[PATCH] modules: don't export section names of empty sections via sysfs

Thanks, applied.

Ah, I see Linus snuck this in before the release. Excellent. Rusty.

#2 lore raw
Quoted 6 lines · Rusty Russell
Quoted 1 line · Helge Deller

[PATCH] modules: don't export section names of empty sections via sysfs

Thanks, applied.

Ah, I see Linus snuck this in before the release. Excellent.

That's great. The next step is probably to find out why the toolchain is doing this ... generating zero length allocated segments seems to be somewhat deviant behaviour ...

James

#3 lore raw
In reply to Rusty Russell
Quoted 8 lines · Rusty Russell
Quoted 1 line · Helge Deller

[PATCH] modules: don't export section names of empty sections via sysfs

Thanks, applied.

Ah, I see Linus snuck this in before the release. Excellent. Rusty.

Thanks Rusty, Helge!

cheers, Kyle