Skip to contentSkip to conversation

Remove __dev* sections from the kernel

PATCH In review Greg Kroah-Hartman 4 participants 11 messages Nov 29, 2012 – Nov 30, 2012 Kbuild

lore
Share & tools
lore
#0 lore raw

cover Remove __dev* sections from the kernel

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So lets remove these false warnings by removing the check for them in the modpost.c tool. Also, lets stop marking the sections entirely, so define away the section markings in init.h

I'll queue these two patches up through my driver-core git tree, which has the bulk of the __dev* marking removal patches in it. If anyone has any objections to this, please let me know.

thanks,

greg k-h

---
 include/linux/init.h  |   18 +++++++-----------
 scripts/mod/modpost.c |   24 ++++++++++--------------
 2 files changed, 17 insertions(+), 25 deletions(-)
#1 lore raw

PATCH 1/2 init.h: Remove __dev* sections from the kernel

From: Greg Kroah-Hartman <[email protected]>

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So, stop marking the sections entirely, by defining them away the section markings in init.h

---
 include/linux/init.h |   18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)
include/linux/init.h +7 -11
index e59041e..f63692d 100644
@@ -93,13 +93,13 @@
 
 #define __exit          __section(.exit.text) __exitused __cold notrace
 
-/* Used for HOTPLUG */
-#define __devinit        __section(.devinit.text) __cold notrace
-#define __devinitdata    __section(.devinit.data)
-#define __devinitconst   __constsection(.devinit.rodata)
-#define __devexit        __section(.devexit.text) __exitused __cold notrace
-#define __devexitdata    __section(.devexit.data)
-#define __devexitconst   __constsection(.devexit.rodata)
+/* Used for HOTPLUG, but that is always enabled now, so just make them noops */
+#define __devinit
+#define __devinitdata
+#define __devinitconst
+#define __devexit
+#define __devexitdata
+#define __devexitconst
 
 /* Used for HOTPLUG_CPU */
 #define __cpuinit        __section(.cpuinit.text) __cold notrace
@@ -126,10 +126,6 @@
 #define __INITRODATA	.section	".init.rodata","a",%progbits
 #define __FINITDATA	.previous
 
-#define __DEVINIT        .section	".devinit.text", "ax"
-#define __DEVINITDATA    .section	".devinit.data", "aw"
-#define __DEVINITRODATA  .section	".devinit.rodata", "a"
-
 #define __CPUINIT        .section	".cpuinit.text", "ax"
 #define __CPUINITDATA    .section	".cpuinit.data", "aw"
 #define __CPUINITRODATA  .section	".cpuinit.rodata", "a"
#2 lore raw

Re: [PATCH 1/2] modpost.c: Stop checking __dev* section mismatches

From: Greg Kroah-Hartman <[email protected]>

Now that the __dev* sections are not being generated, we don't need to check for them in modpost.c.

---
 scripts/mod/modpost.c |   24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)
scripts/mod/modpost.c +10 -14
index 0d93856..ff36c50 100644
@@ -858,25 +858,23 @@ static void check_section(const char *modname, struct elf_info *elf,
 
 #define ALL_INIT_DATA_SECTIONS \
 	".init.setup$", ".init.rodata$", \
-	".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$", \
-	".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
+	".cpuinit.rodata$", ".meminit.rodata$", \
+	".init.data$", ".cpuinit.data$", ".meminit.data$"
 #define ALL_EXIT_DATA_SECTIONS \
-	".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
+	".exit.data$", ".cpuexit.data$", ".memexit.data$"
 
 #define ALL_INIT_TEXT_SECTIONS \
-	".init.text$", ".devinit.text$", ".cpuinit.text$", ".meminit.text$"
+	".init.text$", ".cpuinit.text$", ".meminit.text$"
 #define ALL_EXIT_TEXT_SECTIONS \
-	".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$"
+	".exit.text$", ".cpuexit.text$", ".memexit.text$"
 
 #define ALL_PCI_INIT_SECTIONS	\
 	".pci_fixup_early$", ".pci_fixup_header$", ".pci_fixup_final$", \
 	".pci_fixup_enable$", ".pci_fixup_resume$", \
 	".pci_fixup_resume_early$", ".pci_fixup_suspend$"
 
-#define ALL_XXXINIT_SECTIONS DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \
-	MEM_INIT_SECTIONS
-#define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \
-	MEM_EXIT_SECTIONS
+#define ALL_XXXINIT_SECTIONS CPU_INIT_SECTIONS, MEM_INIT_SECTIONS
+#define ALL_XXXEXIT_SECTIONS CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS
 
 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
@@ -885,12 +883,10 @@ static void check_section(const char *modname, struct elf_info *elf,
 #define TEXT_SECTIONS ".text$"
 
 #define INIT_SECTIONS      ".init.*"
-#define DEV_INIT_SECTIONS  ".devinit.*"
 #define CPU_INIT_SECTIONS  ".cpuinit.*"
 #define MEM_INIT_SECTIONS  ".meminit.*"
 
 #define EXIT_SECTIONS      ".exit.*"
-#define DEV_EXIT_SECTIONS  ".devexit.*"
 #define CPU_EXIT_SECTIONS  ".cpuexit.*"
 #define MEM_EXIT_SECTIONS  ".memexit.*"
 
@@ -979,7 +975,7 @@ const struct sectioncheck sectioncheck[] = {
 	.mismatch = DATA_TO_ANY_EXIT,
 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 },
-/* Do not reference init code/data from devinit/cpuinit/meminit code/data */
+/* Do not reference init code/data from cpuinit/meminit code/data */
 {
 	.fromsec = { ALL_XXXINIT_SECTIONS, NULL },
 	.tosec   = { INIT_SECTIONS, NULL },
@@ -1000,7 +996,7 @@ const struct sectioncheck sectioncheck[] = {
 	.mismatch = XXXINIT_TO_SOME_INIT,
 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 },
-/* Do not reference exit code/data from devexit/cpuexit/memexit code/data */
+/* Do not reference exit code/data from cpuexit/memexit code/data */
 {
 	.fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
 	.tosec   = { EXIT_SECTIONS, NULL },
@@ -1089,7 +1085,7 @@ static const struct sectioncheck *section_mismatch(
  * Pattern 2:
  *   Many drivers utilise a *driver container with references to
  *   add, remove, probe functions etc.
- *   These functions may often be marked __devinit and we do not want to
+ *   These functions may often be marked __cpuinit and we do not want to
  *   warn here.
  *   the pattern is identified by:
  *   tosec   = init or exit section
Acked-by on v1 1/2
#4 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

In reply to Greg Kroah-Hartman
Quoted 8 lines · Greg Kroah-Hartman

From: Greg Kroah-Hartman <[email protected]>

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So, stop marking the sections entirely, by defining them away the section markings in init.h

Quoted 11 lines
---
 include/linux/init.h |   18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)
include/linux/init.h +0 -0
index e59041e..f63692d 100644
@@ -93,13 +93,13 @@
 

include/linux/init.h line 96

Quoted 10 lines
include/linux/init.h +1 -7
 #define __exit          __section(.exit.text) __exitused __cold notrace
 
-/* Used for HOTPLUG */
-#define __devinit        __section(.devinit.text) __cold notrace
-#define __devinitdata    __section(.devinit.data)
-#define __devinitconst   __constsection(.devinit.rodata)
-#define __devexit        __section(.devexit.text) __exitused __cold notrace
-#define __devexitdata    __section(.devexit.data)
-#define __devexitconst   __constsection(.devexit.rodata)
+/* Used for HOTPLUG, but that is always enabled now, so just make them noops */

This comment should be explicit that these are provided only for backward compatibility and their usage is discouarged.

Sam

#5 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

Quoted 10 lines · Sam Ravnborg
Quoted 8 lines · Greg Kroah-Hartman

From: Greg Kroah-Hartman <[email protected]>

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So, stop marking the sections entirely, by defining them away the section markings in init.h

Thanks for the review of this and the other patch.

greg k-h

#6 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

In reply to Greg Kroah-Hartman
Quoted 7 lines · Greg Kroah-Hartman

From: Greg Kroah-Hartman <[email protected]>

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So, stop marking the sections entirely, by defining them away the section markings in init.h

Could we run a sed script over the kernel tree and generate patches to remove the markings completely?

-hpa

Signature · 2 lines
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.
#7 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

Quoted 4 lines · H. Peter Anvin
Quoted 2 lines · Greg Kroah-Hartman

From: Greg Kroah-Hartman <[email protected]>

Quoted 9 lines
Quoted 5 lines

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So, stop marking the sections entirely, by defining them away the section markings in init.h

Could we run a sed script over the kernel tree and generate patches to remove the markings completely?

That's how I've been generating the patches to remove the markings -- except it's a perl script.

Signature · 1 line
Bill
#8 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

In reply to H. Peter Anvin
Quoted 11 lines · H. Peter Anvin
Quoted 7 lines · Greg Kroah-Hartman

From: Greg Kroah-Hartman <[email protected]>

With the recent work to remove CONFIG_HOTPLUG, we are starting to get a bunch of __devinit section warnings, despite CONFIG_HOTPLUG always being enabled. So, stop marking the sections entirely, by defining them away the section markings in init.h

Could we run a sed script over the kernel tree and generate patches to remove the markings completely?

Yes, we can, and Bill's been generating patches that way. A number of them are already in linux-next and I'll sweep the tree after 3.8-rc1 is out and catch the rest.

thanks,

greg k-h

#9 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

In reply to Greg Kroah-Hartman
Quoted 6 lines · Greg Kroah-Hartman
include/linux/init.h +0 -4
-/* Used for HOTPLUG */
-#define __devinit        __section(.devinit.text) __cold notrace
-#define __devinitdata    __section(.devinit.data)
-#define __devinitconst   __constsection(.devinit.rodata)

include/linux/init.h line 102

Quoted 10 lines
include/linux/init.h +7 -3
-#define __devexit        __section(.devexit.text) __exitused __cold notrace
-#define __devexitdata    __section(.devexit.data)
-#define __devexitconst   __constsection(.devexit.rodata)
+/* Used for HOTPLUG, but that is always enabled now, so just make them noops */
+#define __devinit
+#define __devinitdata
+#define __devinitconst
+#define __devexit
+#define __devexitdata
+#define __devexitconst

Second question... what about the __exitused __cold notrace annotations?

-hpa

Signature · 2 lines
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.
#10 lore raw

Re: [PATCH 1/2] init.h: Remove __dev* sections from the kernel

Quoted 11 lines · H. Peter Anvin
Quoted 10 lines · Greg Kroah-Hartman
include/linux/init.h +2 -7
-/* Used for HOTPLUG */
-#define __devinit        __section(.devinit.text) __cold notrace
-#define __devinitdata    __section(.devinit.data)
-#define __devinitconst   __constsection(.devinit.rodata)
-#define __devexit        __section(.devexit.text) __exitused __cold notrace
-#define __devexitdata    __section(.devexit.data)
-#define __devexitconst   __constsection(.devexit.rodata)
+/* Used for HOTPLUG, but that is always enabled now, so just make them noops */
+#define __devinit
Quoted 8 lines

include/linux/init.h line 102

Quoted 6 lines
include/linux/init.h +5 -0
+#define __devinitdata
+#define __devinitconst
+#define __devexit
+#define __devexitdata
+#define __devexitconst

Second question... what about the __exitused __cold notrace annotations?

__exitused shouldn't matter, we shouldn't be optimizing these away at all anymore. I don't know about __cold and notrace, but given that these could be traced, I don't see why that marking got there in the first place.

In reading compiler-gcc4.h, and knowing just how infrequent these functions are ever called, I would be amazed if the __cold marking ever even helped anything out here.

thanks,

greg k-h