All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] modules: add default loader hook implementations
@ 2011-06-25  7:38 Jonas Bonn
  2011-06-25 10:04 ` Ingo Molnar
  0 siblings, 1 reply; 19+ messages in thread
From: Jonas Bonn @ 2011-06-25  7:38 UTC (permalink / raw)
  To: rusty; +Cc: arnd, linux-kernel, linux-arch, monstr, cmetcalf, Jonas Bonn


The module loader code allows architectures to hook into the code by
providing a small number of entry points that each arch must implement.  This
patch provides generic implementations of these entry points for arch's
that don't need to do anything special.

The generic implementations are set to be used by default only for those
architectures that use asm-generic/module.h.  Architectures that do not use
this generic header will be required to implement all of the hooks as before.

Architectures that do use asm-generic/module.h get the default implementation
automatically and will need to provide a #define in their asm/module.h for
each of the hooks that they wish to override.  Being explicit about needing
to override the function should reduce some confusion as to which hook is
actually being used, and throws a nice link-time error if you try to
override the hook without providing the implementation.

An alternative would have been to provide the hooks and just mark them as
__weak, but there's reluctance to do so as it makes it more difficult to figure
out where the code that finally gets linked in is actually located.

This patch is as non-invasive as possible, changing the default behaviour
only for architectures that use asm-generic.  A review of the other arch's
should follow, as many of them can presumably also be simplified by making
use of these default hooks.

Signed-off-by: Jonas Bonn <jonas@southpole.se>
---

Hi Rusty,

The alternative implementation, just marking the default implementations as
__weak, is less invasive, but this patch is more along the lines of what
Arnd preferred.  If this version isn't to your liking, I can submit the
__weak alternative instead.

Tested on the OpenRISC architecture and build-tested for x86.

/Jonas

 arch/microblaze/include/asm/module.h |    4 ++
 arch/microblaze/kernel/module.c      |   35 -------------------
 arch/tile/include/asm/module.h       |   10 +++++
 arch/tile/kernel/module.c            |   31 ----------------
 arch/x86/include/asm/module.h        |   10 +++++
 arch/x86/kernel/module.c             |   37 --------------------
 include/asm-generic/module.h         |   13 +++++++
 include/linux/moduleloader.h         |   29 +++++++++++++++-
 kernel/module.c                      |   63 ++++++++++++++++++++++++++++++++++
 9 files changed, 128 insertions(+), 104 deletions(-)

diff --git a/arch/microblaze/include/asm/module.h b/arch/microblaze/include/asm/module.h
index 7be1347..e2d51d6 100644
--- a/arch/microblaze/include/asm/module.h
+++ b/arch/microblaze/include/asm/module.h
@@ -28,4 +28,8 @@
 
 typedef struct { volatile int counter; } module_t;
 
+/* Set defines for the moduleloader hooks that need to be overridden */
+#define apply_relocate_add apply_relocate_add
+#define module_finalize module_finalize
+
 #endif /* _ASM_MICROBLAZE_MODULE_H */
diff --git a/arch/microblaze/kernel/module.c b/arch/microblaze/kernel/module.c
index 0e73f66..142426f 100644
--- a/arch/microblaze/kernel/module.c
+++ b/arch/microblaze/kernel/module.c
@@ -18,37 +18,6 @@
 #include <asm/pgtable.h>
 #include <asm/cacheflush.h>
 
-void *module_alloc(unsigned long size)
-{
-	void *ret;
-	ret = (size == 0) ? NULL : vmalloc(size);
-	pr_debug("module_alloc (%08lx@%08lx)\n", size, (unsigned long int)ret);
-	return ret;
-}
-
-void module_free(struct module *module, void *region)
-{
-	pr_debug("module_free(%s,%08lx)\n", module->name,
-					(unsigned long)region);
-	vfree(region);
-}
-
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-				Elf_Shdr *sechdrs,
-				char *secstrings,
-				struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab,
-	unsigned int symindex, unsigned int relsec, struct module *module)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-		module->name);
-	return -ENOEXEC;
-}
-
 int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 	unsigned int symindex, unsigned int relsec, struct module *module)
 {
@@ -155,7 +124,3 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
 	flush_dcache();
 	return 0;
 }
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/tile/include/asm/module.h b/arch/tile/include/asm/module.h
index 1e4b79f..670d266 100644
--- a/arch/tile/include/asm/module.h
+++ b/arch/tile/include/asm/module.h
@@ -1 +1,11 @@
+#ifndef _ASM_TILE_SYSTEM_H
+#define _ASM_TILE_SYSTEM_H
+
 #include <asm-generic/module.h>
+
+/* Set defines for the moduleloader hooks that need to be overridden */
+#define module_alloc module_alloc
+#define module_free module_free
+#define apply_relocate_add apply_relocate_add
+
+#endif
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c
index f68df69..28fa6ec 100644
--- a/arch/tile/kernel/module.c
+++ b/arch/tile/kernel/module.c
@@ -98,25 +98,6 @@ void module_free(struct module *mod, void *module_region)
 	 */
 }
 
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	pr_err("module %s: .rel relocation unsupported\n", me->name);
-	return -ENOEXEC;
-}
-
 #ifdef __tilegx__
 /*
  * Validate that the high 16 bits of "value" is just the sign-extension of
@@ -249,15 +230,3 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	/* FIXME: perhaps remove the "writable" bit from the TLB? */
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h
index 9eae775..8ec7dc3 100644
--- a/arch/x86/include/asm/module.h
+++ b/arch/x86/include/asm/module.h
@@ -63,4 +63,14 @@
 # define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
 #endif
 
+/* Set defines for the moduleloader hooks that need to be overridden */
+#define module_alloc module_alloc
+#ifdef CONFIG_X86_32
+#define apply_relocate apply_relocate
+#else
+#define apply_relocate_add apply_relocate_add
+#endif
+#define module_finalize module_finalize
+#define module_arch_cleanup module_arch_cleanup
+
 #endif /* _ASM_X86_MODULE_H */
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
index 52f256f..925179f 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -45,21 +45,6 @@ void *module_alloc(unsigned long size)
 				-1, __builtin_return_address(0));
 }
 
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 #ifdef CONFIG_X86_32
 int apply_relocate(Elf32_Shdr *sechdrs,
 		   const char *strtab,
@@ -100,17 +85,6 @@ int apply_relocate(Elf32_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-int apply_relocate_add(Elf32_Shdr *sechdrs,
-		       const char *strtab,
-		       unsigned int symindex,
-		       unsigned int relsec,
-		       struct module *me)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
 #else /*X86_64*/
 int apply_relocate_add(Elf64_Shdr *sechdrs,
 		   const char *strtab,
@@ -181,17 +155,6 @@ overflow:
 	       me->name);
 	return -ENOEXEC;
 }
-
-int apply_relocate(Elf_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "non add relocation not supported\n");
-	return -ENOSYS;
-}
-
 #endif
 
 int module_finalize(const Elf_Ehdr *hdr,
diff --git a/include/asm-generic/module.h b/include/asm-generic/module.h
index ed5b44d..4e5dec8 100644
--- a/include/asm-generic/module.h
+++ b/include/asm-generic/module.h
@@ -19,4 +19,17 @@ struct mod_arch_specific
 #define Elf_Ehdr Elf32_Ehdr
 #endif
 
+/* This configures the module loader code to use the default implementations
+ * for the architecture specific hooks.  Architectures should set a #define
+ * for each of the hooks that it needs to override.
+ */
+#define asm_generic_moduleloader_hooks 1
+#undef module_frob_arch_sections
+#undef module_alloc
+#undef module_free
+#undef apply_relocate
+#undef apply_relocate_add
+#undef module_finalize
+#undef module_arch_cleanup
+
 #endif /* __ASM_GENERIC_MODULE_H */
diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h
index c1f40c2..a21589b 100644
--- a/include/linux/moduleloader.h
+++ b/include/linux/moduleloader.h
@@ -1,6 +1,33 @@
 #ifndef _LINUX_MODULELOADER_H
 #define _LINUX_MODULELOADER_H
-/* The stuff needed for archs to support modules. */
+
+/* Architecture specific hooks into the module loader code */
+
+/* The hooks declared in this file all have trivial default implementations
+ * that can be used by architectures that don't have special requirements for
+ * these entry points.  They are 'effectively weak':  they can be overridden
+ * but require an explicit 'declaration of intent' in that they require the
+ * architecture to set a #define in their asm/module.h for each of the hooks
+ * they wish to override.  If no define is set, the default hook will be
+ * called and you'll get a link error if you try to override the function
+ * elsewhere.  This (hopefully) will prevent some confusion as to which
+ * implementation of the hook is actually being used...
+ */
+
+/* The default behaviour requires that an architecture implement each of
+ * these hooks.  The asm-generic/module.h header reverses this behaviour
+ * and defaults to using the default hooks, which should be reasonable
+ * for new architectures.
+ */
+#ifndef asm_generic_moduleloader_hooks
+#define module_frob_arch_sections module_frob_arch_sections
+#define module_alloc module_alloc
+#define module_free module_free
+#define apply_relocate apply_relocate
+#define apply_relocate_add apply_relocate_add
+#define module_finalize module_finalize
+#define module_arch_cleanup module_arch_cleanup
+#endif
 
 #include <linux/module.h>
 #include <linux/elf.h>
diff --git a/kernel/module.c b/kernel/module.c
index 795bdc7..71a2dbe4 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1697,6 +1697,19 @@ static void unset_module_core_ro_nx(struct module *mod) { }
 static void unset_module_init_ro_nx(struct module *mod) { }
 #endif
 
+#ifndef module_free
+void module_free(struct module *mod, void *module_region)
+{
+	vfree(module_region);
+}
+#endif
+
+#ifndef module_arch_cleanup
+void module_arch_cleanup(struct module *mod)
+{
+}
+#endif
+
 /* Free a module, remove from lists, etc. */
 static void free_module(struct module *mod)
 {
@@ -1851,6 +1864,30 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
 	return ret;
 }
 
+#ifndef apply_relocate
+int apply_relocate(Elf_Shdr *sechdrs,
+                   const char *strtab,
+                   unsigned int symindex,
+                   unsigned int relsec,
+                   struct module *me)
+{
+	pr_err("module %s: REL relocation unsupported\n", me->name);
+	return -ENOEXEC;
+}
+#endif
+
+#ifndef apply_relocate_add
+int apply_relocate_add(Elf_Shdr *sechdrs,
+                   const char *strtab,
+                   unsigned int symindex,
+                   unsigned int relsec,
+                   struct module *me)
+{
+	pr_err("module %s: RELA relocation unsupported\n", me->name);
+	return -ENOEXEC;
+}
+#endif
+
 static int apply_relocations(struct module *mod, const struct load_info *info)
 {
 	unsigned int i;
@@ -2235,6 +2272,13 @@ static void dynamic_debug_remove(struct _ddebug *debug)
 		ddebug_remove_module(debug->modname);
 }
 
+#ifndef module_alloc
+void *module_alloc(unsigned long size)
+{
+	return size == 0 ? NULL : vmalloc(size);
+}
+#endif
+
 static void *module_alloc_update_bounds(unsigned long size)
 {
 	void *ret = module_alloc(size);
@@ -2645,6 +2689,16 @@ static void flush_module_icache(const struct module *mod)
 	set_fs(old_fs);
 }
 
+#ifndef module_frob_arch_sections
+int module_frob_arch_sections(Elf_Ehdr *hdr,
+                              Elf_Shdr *sechdrs,
+                              char *secstrings,
+                              struct module *mod)
+{
+	return 0;
+}
+#endif
+
 static struct module *layout_and_allocate(struct load_info *info)
 {
 	/* Module within temporary copy. */
@@ -2716,6 +2770,15 @@ static void module_deallocate(struct module *mod, struct load_info *info)
 	module_free(mod, mod->module_core);
 }
 
+#ifndef module_finalize
+int module_finalize(const Elf_Ehdr *hdr,
+                    const Elf_Shdr *sechdrs,
+                    struct module *me)
+{
+	return 0;
+}
+#endif
+
 static int post_relocation(struct module *mod, const struct load_info *info)
 {
 	/* Sort exception table now relocations are done. */
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-25  7:38 [PATCH] modules: add default loader hook implementations Jonas Bonn
@ 2011-06-25 10:04 ` Ingo Molnar
  2011-06-25 10:39   ` Jonas Bonn
  0 siblings, 1 reply; 19+ messages in thread
From: Ingo Molnar @ 2011-06-25 10:04 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: rusty, arnd, linux-kernel, linux-arch, monstr, cmetcalf,
	Linus Torvalds, Andrew Morton


* Jonas Bonn <jonas@southpole.se> wrote:

> +/* This configures the module loader code to use the default implementations
> + * for the architecture specific hooks.  Architectures should set a #define
> + * for each of the hooks that it needs to override.
> + */

please use the standard (multi-line) comment style:

  /*
   * Comment .....
   * ...... goes here.
   */

specified in Documentation/CodingStyle.

(there are similar problems elsewhere in the patch as well.)

Also, and more importantly, don't we generally do such things via 
__weak aliases, because the result looks cleaner and needs no changes 
for architectures beyond the removal of the generic functions? We 
have excluded broken toolchains that miscompile/mislink __weak IIRC 
so __weak ought to work.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-25 10:04 ` Ingo Molnar
@ 2011-06-25 10:39   ` Jonas Bonn
  2011-06-25 13:08     ` Arnd Bergmann
  0 siblings, 1 reply; 19+ messages in thread
From: Jonas Bonn @ 2011-06-25 10:39 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: rusty, arnd, linux-kernel, linux-arch, monstr, cmetcalf,
	Linus Torvalds, Andrew Morton


On Sat, 2011-06-25 at 12:04 +0200, Ingo Molnar wrote:
> Also, and more importantly, don't we generally do such things via 
> __weak aliases, because the result looks cleaner and needs no changes 
> for architectures beyond the removal of the generic functions? We 
> have excluded broken toolchains that miscompile/mislink __weak IIRC 
> so __weak ought to work.

When we discussed this briefly yesterday, both Rusty and Arnd showed a
preference for not using __weak aliases... I'll leave it to them to
comment further.

The alternative patch that just provides __weak implementations for
these hooks is much less invasive than the patch I sent, effectively
touching only kernel/module.c

Let me know which is preferable.

/Jonas



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-25 10:39   ` Jonas Bonn
@ 2011-06-25 13:08     ` Arnd Bergmann
  2011-06-27  9:07       ` Rusty Russell
  0 siblings, 1 reply; 19+ messages in thread
From: Arnd Bergmann @ 2011-06-25 13:08 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: Ingo Molnar, rusty, linux-kernel, linux-arch, monstr, cmetcalf,
	Linus Torvalds, Andrew Morton

On Saturday 25 June 2011, Jonas Bonn wrote:
> On Sat, 2011-06-25 at 12:04 +0200, Ingo Molnar wrote:
> > Also, and more importantly, don't we generally do such things via 
> > __weak aliases, because the result looks cleaner and needs no changes 
> > for architectures beyond the removal of the generic functions? We 
> > have excluded broken toolchains that miscompile/mislink __weak IIRC 
> > so __weak ought to work.
> 
> When we discussed this briefly yesterday, both Rusty and Arnd showed a
> preference for not using __weak aliases... I'll leave it to them to
> comment further.
> 
> The alternative patch that just provides __weak implementations for
> these hooks is much less invasive than the patch I sent, effectively
> touching only kernel/module.c
> 
> Let me know which is preferable.

I don't care much either way, you would get my Ack for both solutions.
The __weak approach would definitely make a simpler patch, and the
patch you sent adds extra complexity because of the
asm_generic_moduleloader_hooks macro you used to avoid having to
change all other architectures.

	Arnd

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-25 13:08     ` Arnd Bergmann
@ 2011-06-27  9:07       ` Rusty Russell
  2011-06-27  9:25         ` Geert Uytterhoeven
  0 siblings, 1 reply; 19+ messages in thread
From: Rusty Russell @ 2011-06-27  9:07 UTC (permalink / raw)
  To: Arnd Bergmann, Jonas Bonn
  Cc: Ingo Molnar, linux-kernel, linux-arch, monstr, cmetcalf,
	Linus Torvalds, Andrew Morton

On Sat, 25 Jun 2011 15:08:49 +0200, Arnd Bergmann <arnd@arndb.de> wrote:
> On Saturday 25 June 2011, Jonas Bonn wrote:
> > On Sat, 2011-06-25 at 12:04 +0200, Ingo Molnar wrote:
> > > Also, and more importantly, don't we generally do such things via 
> > > __weak aliases, because the result looks cleaner and needs no changes 
> > > for architectures beyond the removal of the generic functions? We 
> > > have excluded broken toolchains that miscompile/mislink __weak IIRC 
> > > so __weak ought to work.
> > 
> > When we discussed this briefly yesterday, both Rusty and Arnd showed a
> > preference for not using __weak aliases... I'll leave it to them to
> > comment further.
> > 
> > The alternative patch that just provides __weak implementations for
> > these hooks is much less invasive than the patch I sent, effectively
> > touching only kernel/module.c
> > 
> > Let me know which is preferable.
> 
> I don't care much either way, you would get my Ack for both solutions.
> The __weak approach would definitely make a simpler patch, and the
> patch you sent adds extra complexity because of the
> asm_generic_moduleloader_hooks macro you used to avoid having to
> change all other architectures.

I think you misread me.  If all else is equal, I dislike weak functions.
But AFAICT the two standard mechanisms are #ifdef HAVE_ARCH and __weak.
Inventing a third one is not going to be a win.

And given where we are, __weak seems the easier path than HAVE_ARCH.
A followup patch to toss out the now-unneeded empty arch functions would
be nice, too.

Thanks,
Rusty.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-27  9:07       ` Rusty Russell
@ 2011-06-27  9:25         ` Geert Uytterhoeven
  2011-06-27 11:05           ` Arnd Bergmann
  0 siblings, 1 reply; 19+ messages in thread
From: Geert Uytterhoeven @ 2011-06-27  9:25 UTC (permalink / raw)
  To: Rusty Russell
  Cc: Arnd Bergmann, Jonas Bonn, Ingo Molnar, linux-kernel, linux-arch,
	monstr, cmetcalf, Linus Torvalds, Andrew Morton

On Mon, Jun 27, 2011 at 11:07, Rusty Russell <rusty@rustcorp.com.au> wrote:
> On Sat, 25 Jun 2011 15:08:49 +0200, Arnd Bergmann <arnd@arndb.de> wrote:
>> On Saturday 25 June 2011, Jonas Bonn wrote:
>> > On Sat, 2011-06-25 at 12:04 +0200, Ingo Molnar wrote:
>> > > Also, and more importantly, don't we generally do such things via
>> > > __weak aliases, because the result looks cleaner and needs no changes
>> > > for architectures beyond the removal of the generic functions? We
>> > > have excluded broken toolchains that miscompile/mislink __weak IIRC
>> > > so __weak ought to work.
>> >
>> > When we discussed this briefly yesterday, both Rusty and Arnd showed a
>> > preference for not using __weak aliases... I'll leave it to them to
>> > comment further.
>> >
>> > The alternative patch that just provides __weak implementations for
>> > these hooks is much less invasive than the patch I sent, effectively
>> > touching only kernel/module.c
>> >
>> > Let me know which is preferable.
>>
>> I don't care much either way, you would get my Ack for both solutions.
>> The __weak approach would definitely make a simpler patch, and the
>> patch you sent adds extra complexity because of the
>> asm_generic_moduleloader_hooks macro you used to avoid having to
>> change all other architectures.
>
> I think you misread me.  If all else is equal, I dislike weak functions.
> But AFAICT the two standard mechanisms are #ifdef HAVE_ARCH and __weak.
> Inventing a third one is not going to be a win.

It's not inventing a new one, the third one is already in use.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-27  9:25         ` Geert Uytterhoeven
@ 2011-06-27 11:05           ` Arnd Bergmann
  2011-06-28  1:23             ` Rusty Russell
  0 siblings, 1 reply; 19+ messages in thread
From: Arnd Bergmann @ 2011-06-27 11:05 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Rusty Russell, Jonas Bonn, Ingo Molnar, linux-kernel, linux-arch,
	monstr, cmetcalf, Linus Torvalds, Andrew Morton

On Monday 27 June 2011, Geert Uytterhoeven wrote:
> >> I don't care much either way, you would get my Ack for both solutions.
> >> The __weak approach would definitely make a simpler patch, and the
> >> patch you sent adds extra complexity because of the
> >> asm_generic_moduleloader_hooks macro you used to avoid having to
> >> change all other architectures.
> >
> > I think you misread me.  If all else is equal, I dislike weak functions.
> > But AFAICT the two standard mechanisms are #ifdef HAVE_ARCH and __weak.
> > Inventing a third one is not going to be a win.
> 
> It's not inventing a new one, the third one is already in use.

True. In fact, we are (slowly) migrating away from HAVE_ARCH_* elsewhere.
In include/asm-generic/*.h, the common method is now to #define the exact
symbol if an architecture wants to override the generic version.

Weak symbols are fairly obscure in comparison, but they are actively
used by a few architectures (mips, sh) and some core code in kernel/
and mm/.

	Arnd

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-27 11:05           ` Arnd Bergmann
@ 2011-06-28  1:23             ` Rusty Russell
  2011-06-28 10:45               ` Arnd Bergmann
  0 siblings, 1 reply; 19+ messages in thread
From: Rusty Russell @ 2011-06-28  1:23 UTC (permalink / raw)
  To: Arnd Bergmann, Geert Uytterhoeven
  Cc: Jonas Bonn, Ingo Molnar, linux-kernel, linux-arch, monstr,
	cmetcalf, Linus Torvalds, Andrew Morton

On Mon, 27 Jun 2011 13:05:44 +0200, Arnd Bergmann <arnd@arndb.de> wrote:
> On Monday 27 June 2011, Geert Uytterhoeven wrote:
> > >> I don't care much either way, you would get my Ack for both solutions.
> > >> The __weak approach would definitely make a simpler patch, and the
> > >> patch you sent adds extra complexity because of the
> > >> asm_generic_moduleloader_hooks macro you used to avoid having to
> > >> change all other architectures.
> > >
> > > I think you misread me.  If all else is equal, I dislike weak functions.
> > > But AFAICT the two standard mechanisms are #ifdef HAVE_ARCH and __weak.
> > > Inventing a third one is not going to be a win.
> > 
> > It's not inventing a new one, the third one is already in use.
> 
> True. In fact, we are (slowly) migrating away from HAVE_ARCH_* elsewhere.
> In include/asm-generic/*.h, the common method is now to #define the exact
> symbol if an architecture wants to override the generic version.
> 
> Weak symbols are fairly obscure in comparison, but they are actively
> used by a few architectures (mips, sh) and some core code in kernel/
> and mm/.

I stand corrected.  It seems to be done one way or another pretty much
on a whim.

To avoid more bikeshedding, smallest patch wins.  That's __weak, right?

Thanks,
Rusty.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-28  1:23             ` Rusty Russell
@ 2011-06-28 10:45               ` Arnd Bergmann
  2011-06-28 16:50                 ` Jonas Bonn
  2011-06-30 19:22                 ` [PATCH 1/2] " Jonas Bonn
  0 siblings, 2 replies; 19+ messages in thread
From: Arnd Bergmann @ 2011-06-28 10:45 UTC (permalink / raw)
  To: Rusty Russell
  Cc: Geert Uytterhoeven, Jonas Bonn, Ingo Molnar, linux-kernel,
	linux-arch, monstr, cmetcalf, Linus Torvalds, Andrew Morton

On Tuesday 28 June 2011, Rusty Russell wrote:
> To avoid more bikeshedding, smallest patch wins.  That's __weak, right?

Sounds fine to me. Jonas, can you send that patch?

	Arnd

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] modules: add default loader hook implementations
  2011-06-28 10:45               ` Arnd Bergmann
@ 2011-06-28 16:50                 ` Jonas Bonn
  2011-06-30 19:22                 ` [PATCH 1/2] " Jonas Bonn
  1 sibling, 0 replies; 19+ messages in thread
From: Jonas Bonn @ 2011-06-28 16:50 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Rusty Russell, Geert Uytterhoeven, Ingo Molnar, linux-kernel,
	linux-arch, monstr, cmetcalf, Linus Torvalds, Andrew Morton


On Tue, 2011-06-28 at 12:45 +0200, Arnd Bergmann wrote:
> On Tuesday 28 June 2011, Rusty Russell wrote:
> > To avoid more bikeshedding, smallest patch wins.  That's __weak, right?
> 
> Sounds fine to me. Jonas, can you send that patch?
> 

Yes, for sure... just as soon as I get a spare moment, which will be in
a day or two.

/Jonas


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 1/2] modules: add default loader hook implementations
  2011-06-28 10:45               ` Arnd Bergmann
  2011-06-28 16:50                 ` Jonas Bonn
@ 2011-06-30 19:22                 ` Jonas Bonn
  2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
                                     ` (2 more replies)
  1 sibling, 3 replies; 19+ messages in thread
From: Jonas Bonn @ 2011-06-30 19:22 UTC (permalink / raw)
  To: rusty
  Cc: arnd, geert, mingo, linux-kernel, linux-arch, monstr, cmetcalf,
	torvalds, akpm, Jonas Bonn


The module loader code allows architectures to hook into the code by
providing a small number of entry points that each arch must implement.
This patch provides __weakly linked generic implementations of these
entry points for architectures that don't need to do anything special.

Signed-off-by: Jonas Bonn <jonas@southpole.se>
---
 include/linux/moduleloader.h |    7 +++++-
 kernel/module.c              |   49 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletions(-)

diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h
index c1f40c2..b2be02e 100644
--- a/include/linux/moduleloader.h
+++ b/include/linux/moduleloader.h
@@ -5,7 +5,12 @@
 #include <linux/module.h>
 #include <linux/elf.h>
 
-/* These must be implemented by the specific architecture */
+/* These may be implemented by architectures that need to hook into the
+ * module loader code.  Architectures that don't need to do anything special
+ * can just rely on the 'weak' default hooks defined in kernel/module.c.
+ * Note, however, that at least one of apply_relocate or apply_relocate_add
+ * must be implemented by each architecture.
+ */
 
 /* Adjust arch-specific sections.  Return 0 on success.  */
 int module_frob_arch_sections(Elf_Ehdr *hdr,
diff --git a/kernel/module.c b/kernel/module.c
index 795bdc7..6301d6e 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1697,6 +1697,15 @@ static void unset_module_core_ro_nx(struct module *mod) { }
 static void unset_module_init_ro_nx(struct module *mod) { }
 #endif
 
+void __weak module_free(struct module *mod, void *module_region)
+{
+	vfree(module_region);
+}
+
+void __weak module_arch_cleanup(struct module *mod)
+{
+}
+
 /* Free a module, remove from lists, etc. */
 static void free_module(struct module *mod)
 {
@@ -1851,6 +1860,26 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
 	return ret;
 }
 
+int __weak apply_relocate(Elf_Shdr *sechdrs,
+			  const char *strtab,
+			  unsigned int symindex,
+			  unsigned int relsec,
+			  struct module *me)
+{
+	pr_err("module %s: REL relocation unsupported\n", me->name);
+	return -ENOEXEC;
+}
+
+int __weak apply_relocate_add(Elf_Shdr *sechdrs,
+			      const char *strtab,
+			      unsigned int symindex,
+			      unsigned int relsec,
+			      struct module *me)
+{
+	pr_err("module %s: RELA relocation unsupported\n", me->name);
+	return -ENOEXEC;
+}
+
 static int apply_relocations(struct module *mod, const struct load_info *info)
 {
 	unsigned int i;
@@ -2235,6 +2264,11 @@ static void dynamic_debug_remove(struct _ddebug *debug)
 		ddebug_remove_module(debug->modname);
 }
 
+void * __weak module_alloc(unsigned long size)
+{
+	return size == 0 ? NULL : vmalloc_exec(size);
+}
+
 static void *module_alloc_update_bounds(unsigned long size)
 {
 	void *ret = module_alloc(size);
@@ -2645,6 +2679,14 @@ static void flush_module_icache(const struct module *mod)
 	set_fs(old_fs);
 }
 
+int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
+				     Elf_Shdr *sechdrs,
+				     char *secstrings,
+				     struct module *mod)
+{
+	return 0;
+}
+
 static struct module *layout_and_allocate(struct load_info *info)
 {
 	/* Module within temporary copy. */
@@ -2716,6 +2758,13 @@ static void module_deallocate(struct module *mod, struct load_info *info)
 	module_free(mod, mod->module_core);
 }
 
+int __weak module_finalize(const Elf_Ehdr *hdr,
+			   const Elf_Shdr *sechdrs,
+			   struct module *me)
+{
+	return 0;
+}
+
 static int post_relocation(struct module *mod, const struct load_info *info)
 {
 	/* Sort exception table now relocations are done. */
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 2/2] modules: make arch's use default loader hooks
  2011-06-30 19:22                 ` [PATCH 1/2] " Jonas Bonn
@ 2011-06-30 19:22                   ` Jonas Bonn
  2011-06-30 19:46                     ` Mike Frysinger
                                       ` (2 more replies)
  2011-06-30 19:43                   ` [PATCH 1/2] modules: add default loader hook implementations Mike Frysinger
  2011-06-30 20:02                   ` Linus Torvalds
  2 siblings, 3 replies; 19+ messages in thread
From: Jonas Bonn @ 2011-06-30 19:22 UTC (permalink / raw)
  To: rusty
  Cc: arnd, geert, mingo, linux-kernel, linux-arch, monstr, cmetcalf,
	torvalds, akpm, Jonas Bonn


This patch removes all the module loader hook implementations in the
architecture specific code where the functionality is the same as that
now provided by the recently added default hooks.

Signed-off-by: Jonas Bonn <jonas@southpole.se>
---
 arch/alpha/kernel/module.c      |   34 ---------------------
 arch/arm/kernel/module.c        |   29 +------------------
 arch/avr32/kernel/module.c      |   20 -------------
 arch/blackfin/kernel/module.c   |   21 -------------
 arch/cris/kernel/module.c       |   43 ++-------------------------
 arch/frv/kernel/module.c        |   57 ++----------------------------------
 arch/h8300/kernel/module.c      |   45 ----------------------------
 arch/ia64/kernel/module.c       |   16 ----------
 arch/m32r/kernel/module.c       |   38 ------------------------
 arch/m68k/kernel/module_mm.c    |   27 -----------------
 arch/m68k/kernel/module_no.c    |   34 ---------------------
 arch/microblaze/kernel/module.c |   35 ----------------------
 arch/mips/kernel/module.c       |   20 +-----------
 arch/mn10300/kernel/module.c    |   61 ---------------------------------------
 arch/parisc/kernel/module.c     |   12 -------
 arch/powerpc/kernel/module.c    |   18 -----------
 arch/powerpc/kernel/module_32.c |   11 -------
 arch/powerpc/kernel/module_64.c |   10 ------
 arch/s390/kernel/module.c       |   20 -------------
 arch/score/kernel/module.c      |   29 ++----------------
 arch/sh/kernel/module.c         |   35 ----------------------
 arch/sparc/kernel/module.c      |   28 ------------------
 arch/tile/kernel/module.c       |   31 --------------------
 arch/unicore32/kernel/module.c  |   35 ----------------------
 arch/x86/kernel/module.c        |   37 -----------------------
 arch/xtensa/kernel/module.c     |   43 ---------------------------
 26 files changed, 12 insertions(+), 777 deletions(-)

diff --git a/arch/alpha/kernel/module.c b/arch/alpha/kernel/module.c
index ebc3c89..2fd00b7 100644
--- a/arch/alpha/kernel/module.c
+++ b/arch/alpha/kernel/module.c
@@ -29,20 +29,6 @@
 #define DEBUGP(fmt...)
 #endif
 
-void *
-module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
-void
-module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
 /* Allocate the GOT at the end of the core sections.  */
 
 struct got_entry {
@@ -156,14 +142,6 @@ module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs,
 }
 
 int
-apply_relocate(Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
-	       unsigned int relsec, struct module *me)
-{
-	printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name);
-	return -ENOEXEC;
-}
-
-int
 apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
 		   unsigned int symindex, unsigned int relsec,
 		   struct module *me)
@@ -302,15 +280,3 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
 
 	return 0;
 }
-
-int
-module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-		struct module *me)
-{
-	return 0;
-}
-
-void
-module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
index fee7c36..85a68b1 100644
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
@@ -43,25 +43,7 @@ void *module_alloc(unsigned long size)
 				GFP_KERNEL, PAGE_KERNEL_EXEC, -1,
 				__builtin_return_address(0));
 }
-#else /* CONFIG_MMU */
-void *module_alloc(unsigned long size)
-{
-	return size == 0 ? NULL : vmalloc(size);
-}
-#endif /* !CONFIG_MMU */
-
-void module_free(struct module *module, void *region)
-{
-	vfree(region);
-}
-
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
+#endif
 
 int
 apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
@@ -256,15 +238,6 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
 	return 0;
 }
 
-int
-apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
-		   unsigned int symindex, unsigned int relsec, struct module *module)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-	       module->name);
-	return -ENOEXEC;
-}
-
 struct mod_unwind_map {
 	const Elf_Shdr *unw_sec;
 	const Elf_Shdr *txt_sec;
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c
index a727f54..596f730 100644
--- a/arch/avr32/kernel/module.c
+++ b/arch/avr32/kernel/module.c
@@ -19,13 +19,6 @@
 #include <linux/moduleloader.h>
 #include <linux/vmalloc.h>
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
 void module_free(struct module *mod, void *module_region)
 {
 	vfree(mod->arch.syminfo);
@@ -299,15 +292,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 	return ret;
 }
 
-int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab,
-		   unsigned int symindex, unsigned int relindex,
-		   struct module *module)
-{
-	printk(KERN_ERR "module %s: REL relocations are not supported\n",
-		module->name);
-	return -ENOEXEC;
-}
-
 int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
 		    struct module *module)
 {
@@ -316,7 +300,3 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
 
 	return 0;
 }
-
-void module_arch_cleanup(struct module *module)
-{
-}
diff --git a/arch/blackfin/kernel/module.c b/arch/blackfin/kernel/module.c
index 35e350c..4489efc 100644
--- a/arch/blackfin/kernel/module.c
+++ b/arch/blackfin/kernel/module.c
@@ -16,19 +16,6 @@
 #include <asm/cacheflush.h>
 #include <asm/uaccess.h>
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
 /* Transfer the section to the L1 memory */
 int
 module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
@@ -150,14 +137,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
 	return 0;
 }
 
-int
-apply_relocate(Elf_Shdr * sechdrs, const char *strtab,
-	       unsigned int symindex, unsigned int relsec, struct module *mod)
-{
-	pr_err(".rel unsupported\n");
-	return -ENOEXEC;
-}
-
 /*************************************************************************/
 /* FUNCTION : apply_relocate_add                                         */
 /* ABSTRACT : Blackfin specific relocation handling for the loadable     */
diff --git a/arch/cris/kernel/module.c b/arch/cris/kernel/module.c
index bcd502f..37400f5 100644
--- a/arch/cris/kernel/module.c
+++ b/arch/cris/kernel/module.c
@@ -30,45 +30,19 @@
 #endif
 
 #ifdef CONFIG_ETRAX_KMALLOCED_MODULES
-#define MALLOC_MODULE(size) kmalloc(size, GFP_KERNEL)
-#define FREE_MODULE(region) kfree(region)
-#else
-#define MALLOC_MODULE(size) vmalloc_exec(size)
-#define FREE_MODULE(region) vfree(region)
-#endif
-
 void *module_alloc(unsigned long size)
 {
 	if (size == 0)
 		return NULL;
-	return MALLOC_MODULE(size);
+	return kmalloc(size, GFP_KERNEL);
 }
 
-
 /* Free memory returned from module_alloc */
 void module_free(struct module *mod, void *module_region)
 {
-	FREE_MODULE(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf32_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name);
-	return -ENOEXEC;
+	kfree(module_region);
 }
+#endif
 
 int apply_relocate_add(Elf32_Shdr *sechdrs,
 		       const char *strtab,
@@ -108,14 +82,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 
 	return 0;
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
- 	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/frv/kernel/module.c b/arch/frv/kernel/module.c
index 711763c..9d9835f 100644
--- a/arch/frv/kernel/module.c
+++ b/arch/frv/kernel/module.c
@@ -22,57 +22,6 @@
 #define DEBUGP(fmt...)
 #endif
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-
-	return vmalloc_exec(size);
-}
-
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf32_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", me->name);
-	return -ENOEXEC;
-}
-
-int apply_relocate_add(Elf32_Shdr *sechdrs,
-		       const char *strtab,
-		       unsigned int symindex,
-		       unsigned int relsec,
-		       struct module *me)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", me->name);
-	return -ENOEXEC;
-}
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
+/* TODO: At least one of apply_relocate or apply_relocate_add must be
+ * implemented in order to get working module support.
+ */
diff --git a/arch/h8300/kernel/module.c b/arch/h8300/kernel/module.c
index db4953d..1d526e0 100644
--- a/arch/h8300/kernel/module.c
+++ b/arch/h8300/kernel/module.c
@@ -11,40 +11,6 @@
 #define DEBUGP(fmt...)
 #endif
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf32_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "module %s: RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
 int apply_relocate_add(Elf32_Shdr *sechdrs,
 		       const char *strtab,
 		       unsigned int symindex,
@@ -107,14 +73,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 	       me->name, rela[i].r_offset);
 	return -ENOEXEC;
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
index 1481b0a..24603be 100644
--- a/arch/ia64/kernel/module.c
+++ b/arch/ia64/kernel/module.c
@@ -304,14 +304,6 @@ plt_target (struct plt_entry *plt)
 
 #endif /* !USE_BRL */
 
-void *
-module_alloc (unsigned long size)
-{
-	if (!size)
-		return NULL;
-	return vmalloc(size);
-}
-
 void
 module_free (struct module *mod, void *module_region)
 {
@@ -853,14 +845,6 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
 	return 0;
 }
 
-int
-apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
-		unsigned int relsec, struct module *mod)
-{
-	printk(KERN_ERR "module %s: REL relocs in section %u unsupported\n", mod->name, relsec);
-	return -ENOEXEC;
-}
-
 /*
  * Modules contain a single unwind table which covers both the core and the init text
  * sections but since the two are not contiguous, we need to split this table up such that
diff --git a/arch/m32r/kernel/module.c b/arch/m32r/kernel/module.c
index cb5f37d..3071fe8 100644
--- a/arch/m32r/kernel/module.c
+++ b/arch/m32r/kernel/module.c
@@ -28,33 +28,6 @@
 #define DEBUGP(fmt...)
 #endif
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-#ifdef CONFIG_MMU
-	return vmalloc_exec(size);
-#else
-	return vmalloc(size);
-#endif
-}
-
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 #define COPY_UNALIGNED_WORD(sw, tw, align) \
 { \
 	void *__s = &(sw), *__t = &(tw); \
@@ -243,14 +216,3 @@ int apply_relocate(Elf32_Shdr *sechdrs,
 	return 0;
 
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/m68k/kernel/module_mm.c b/arch/m68k/kernel/module_mm.c
index cd6bcb1..ceafc47 100644
--- a/arch/m68k/kernel/module_mm.c
+++ b/arch/m68k/kernel/module_mm.c
@@ -19,29 +19,6 @@
 
 #ifdef CONFIG_MODULES
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 int apply_relocate(Elf32_Shdr *sechdrs,
 		   const char *strtab,
 		   unsigned int symindex,
@@ -131,10 +108,6 @@ int module_finalize(const Elf_Ehdr *hdr,
 	return 0;
 }
 
-void module_arch_cleanup(struct module *mod)
-{
-}
-
 #endif /* CONFIG_MODULES */
 
 void module_fixup(struct module *mod, struct m68k_fixup_info *start,
diff --git a/arch/m68k/kernel/module_no.c b/arch/m68k/kernel/module_no.c
index d11ffae..5a097c6 100644
--- a/arch/m68k/kernel/module_no.c
+++ b/arch/m68k/kernel/module_no.c
@@ -11,29 +11,6 @@
 #define DEBUGP(fmt...)
 #endif
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 int apply_relocate(Elf32_Shdr *sechdrs,
 		   const char *strtab,
 		   unsigned int symindex,
@@ -113,14 +90,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/microblaze/kernel/module.c b/arch/microblaze/kernel/module.c
index 0e73f66..142426f 100644
--- a/arch/microblaze/kernel/module.c
+++ b/arch/microblaze/kernel/module.c
@@ -18,37 +18,6 @@
 #include <asm/pgtable.h>
 #include <asm/cacheflush.h>
 
-void *module_alloc(unsigned long size)
-{
-	void *ret;
-	ret = (size == 0) ? NULL : vmalloc(size);
-	pr_debug("module_alloc (%08lx@%08lx)\n", size, (unsigned long int)ret);
-	return ret;
-}
-
-void module_free(struct module *module, void *region)
-{
-	pr_debug("module_free(%s,%08lx)\n", module->name,
-					(unsigned long)region);
-	vfree(region);
-}
-
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-				Elf_Shdr *sechdrs,
-				char *secstrings,
-				struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab,
-	unsigned int symindex, unsigned int relsec, struct module *module)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-		module->name);
-	return -ENOEXEC;
-}
-
 int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 	unsigned int symindex, unsigned int relsec, struct module *module)
 {
@@ -155,7 +124,3 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
 	flush_dcache();
 	return 0;
 }
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c
index dd940b7..4b930ac 100644
--- a/arch/mips/kernel/module.c
+++ b/arch/mips/kernel/module.c
@@ -45,30 +45,14 @@ static struct mips_hi16 *mips_hi16_list;
 static LIST_HEAD(dbe_list);
 static DEFINE_SPINLOCK(dbe_lock);
 
+#ifdef MODULE_START
 void *module_alloc(unsigned long size)
 {
-#ifdef MODULE_START
 	return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END,
 				GFP_KERNEL, PAGE_KERNEL, -1,
 				__builtin_return_address(0));
-#else
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-#endif
-}
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
-			      char *secstrings, struct module *mod)
-{
-	return 0;
 }
+#endif
 
 static int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v)
 {
diff --git a/arch/mn10300/kernel/module.c b/arch/mn10300/kernel/module.c
index 196a111..216ad23 100644
--- a/arch/mn10300/kernel/module.c
+++ b/arch/mn10300/kernel/module.c
@@ -32,36 +32,6 @@
 #define DEBUGP(fmt, ...)
 #endif
 
-/*
- * allocate storage for a module
- */
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc_exec(size);
-}
-
-/*
- * free memory returned from module_alloc()
- */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/*
- * allow the arch to fix up the section table
- * - we don't need anything special
- */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 static void reloc_put16(uint8_t *p, uint32_t val)
 {
 	p[0] = val & 0xff;
@@ -81,20 +51,6 @@ static void reloc_put32(uint8_t *p, uint32_t val)
 }
 
 /*
- * apply a REL relocation
- */
-int apply_relocate(Elf32_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "module %s: RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
-/*
  * apply a RELA relocation
  */
 int apply_relocate_add(Elf32_Shdr *sechdrs,
@@ -198,20 +154,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-/*
- * finish loading the module
- */
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	return 0;
-}
-
-/*
- * finish clearing the module
- */
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c
index cedbbb8..5e34ccf 100644
--- a/arch/parisc/kernel/module.c
+++ b/arch/parisc/kernel/module.c
@@ -540,18 +540,6 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
 	return (Elf_Addr)stub;
 }
 
-int apply_relocate(Elf_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	/* parisc should not need this ... */
-	printk(KERN_ERR "module %s: RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
 #ifndef CONFIG_64BIT
 int apply_relocate_add(Elf_Shdr *sechdrs,
 		       const char *strtab,
diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c
index 49cee9d..a1cd701 100644
--- a/arch/powerpc/kernel/module.c
+++ b/arch/powerpc/kernel/module.c
@@ -31,20 +31,6 @@
 
 LIST_HEAD(module_bug_list);
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-
-	return vmalloc_exec(size);
-}
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
 static const Elf_Shdr *find_section(const Elf_Ehdr *hdr,
 				    const Elf_Shdr *sechdrs,
 				    const char *name)
@@ -93,7 +79,3 @@ int module_finalize(const Elf_Ehdr *hdr,
 
 	return 0;
 }
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c
index f832773..0b6d796 100644
--- a/arch/powerpc/kernel/module_32.c
+++ b/arch/powerpc/kernel/module_32.c
@@ -174,17 +174,6 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr,
 	return 0;
 }
 
-int apply_relocate(Elf32_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *module)
-{
-	printk(KERN_ERR "%s: Non-ADD RELOCATION unsupported\n",
-	       module->name);
-	return -ENOEXEC;
-}
-
 static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
 {
 	if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16)
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index 8fbb125..9f44a77 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -243,16 +243,6 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr,
 	return 0;
 }
 
-int apply_relocate(Elf64_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "%s: Non-ADD RELOCATION unsupported\n", me->name);
-	return -ENOEXEC;
-}
-
 /* r2 is the TOC pointer: it actually points 0x8000 into the TOC (this
    gives the value maximum span in an instruction which uses a signed
    offset) */
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c
index f7167ee..dfcb343 100644
--- a/arch/s390/kernel/module.c
+++ b/arch/s390/kernel/module.c
@@ -45,13 +45,6 @@
 #define PLT_ENTRY_SIZE 20
 #endif /* CONFIG_64BIT */
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
 /* Free memory returned from module_alloc */
 void module_free(struct module *mod, void *module_region)
 {
@@ -176,15 +169,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
 	return 0;
 }
 
-int
-apply_relocate(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex,
-	       unsigned int relsec, struct module *me)
-{
-	printk(KERN_ERR "module %s: RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
 static int
 apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, 
 	   struct module *me)
@@ -409,7 +393,3 @@ int module_finalize(const Elf_Ehdr *hdr,
 	me->arch.syminfo = NULL;
 	return 0;
 }
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/score/kernel/module.c b/arch/score/kernel/module.c
index 4de8d47..469e3b6 100644
--- a/arch/score/kernel/module.c
+++ b/arch/score/kernel/module.c
@@ -27,23 +27,6 @@
 #include <linux/module.h>
 #include <linux/vmalloc.h>
 
-void *module_alloc(unsigned long size)
-{
-	return size ? vmalloc(size) : NULL;
-}
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
-			char *secstrings, struct module *mod)
-{
-	return 0;
-}
-
 int apply_relocate(Elf_Shdr *sechdrs, const char *strtab,
 		unsigned int symindex, unsigned int relindex,
 		struct module *me)
@@ -146,6 +129,9 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
 		unsigned int symindex, unsigned int relsec,
 		struct module *me)
 {
+	/* Non-standard return value... most other arch's return -ENOEXEC
+	 * for an unsupported relocation variant
+	 */
 	return 0;
 }
 
@@ -154,12 +140,3 @@ const struct exception_table_entry *search_module_dbetables(unsigned long addr)
 {
 	return NULL;
 }
-
-/* Put in dbe list if necessary. */
-int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-		struct module *me)
-{
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod) {}
diff --git a/arch/sh/kernel/module.c b/arch/sh/kernel/module.c
index 19b1f88..1b525de 100644
--- a/arch/sh/kernel/module.c
+++ b/arch/sh/kernel/module.c
@@ -34,30 +34,6 @@
 #include <asm/unaligned.h>
 #include <asm/dwarf.h>
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-
-	return vmalloc_exec(size);
-}
-
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 int apply_relocate_add(Elf32_Shdr *sechdrs,
 		   const char *strtab,
 		   unsigned int symindex,
@@ -133,17 +109,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 	return 0;
 }
 
-int apply_relocate(Elf32_Shdr *sechdrs,
-		       const char *strtab,
-		       unsigned int symindex,
-		       unsigned int relsec,
-		       struct module *me)
-{
-	printk(KERN_ERR "module %s: REL RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
 int module_finalize(const Elf_Ehdr *hdr,
 		    const Elf_Shdr *sechdrs,
 		    struct module *me)
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c
index 8d348c4..fe51fe60 100644
--- a/arch/sparc/kernel/module.c
+++ b/arch/sparc/kernel/module.c
@@ -68,12 +68,6 @@ void *module_alloc(unsigned long size)
 	return ret;
 }
 
-/* Free memory returned from module_core_alloc/module_init_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
 /* Make generic code ignore STT_REGISTER dummy undefined symbols.  */
 int module_frob_arch_sections(Elf_Ehdr *hdr,
 			      Elf_Shdr *sechdrs,
@@ -107,17 +101,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr,
 	return 0;
 }
 
-int apply_relocate(Elf_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "module %s: non-ADD RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
 int apply_relocate_add(Elf_Shdr *sechdrs,
 		       const char *strtab,
 		       unsigned int symindex,
@@ -239,15 +222,4 @@ int module_finalize(const Elf_Ehdr *hdr,
 
 	return 0;
 }
-#else
-int module_finalize(const Elf_Ehdr *hdr,
-                    const Elf_Shdr *sechdrs,
-                    struct module *me)
-{
-        return 0;
-}
 #endif /* CONFIG_SPARC64 */
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c
index f68df69..28fa6ec 100644
--- a/arch/tile/kernel/module.c
+++ b/arch/tile/kernel/module.c
@@ -98,25 +98,6 @@ void module_free(struct module *mod, void *module_region)
 	 */
 }
 
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
-int apply_relocate(Elf_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	pr_err("module %s: .rel relocation unsupported\n", me->name);
-	return -ENOEXEC;
-}
-
 #ifdef __tilegx__
 /*
  * Validate that the high 16 bits of "value" is just the sign-extension of
@@ -249,15 +230,3 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	/* FIXME: perhaps remove the "writable" bit from the TLB? */
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/unicore32/kernel/module.c b/arch/unicore32/kernel/module.c
index 3e5a38d..8fbe857 100644
--- a/arch/unicore32/kernel/module.c
+++ b/arch/unicore32/kernel/module.c
@@ -37,19 +37,6 @@ void *module_alloc(unsigned long size)
 	return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC);
 }
 
-void module_free(struct module *module, void *region)
-{
-	vfree(region);
-}
-
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 int
 apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
 	       unsigned int relindex, struct module *module)
@@ -128,25 +115,3 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
 	}
 	return 0;
 }
-
-int
-apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
-		   unsigned int symindex, unsigned int relsec,
-		   struct module *module)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-	       module->name);
-	return -ENOEXEC;
-}
-
-int
-module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
-		struct module *module)
-{
-	return 0;
-}
-
-void
-module_arch_cleanup(struct module *mod)
-{
-}
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
index 52f256f..925179f 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -45,21 +45,6 @@ void *module_alloc(unsigned long size)
 				-1, __builtin_return_address(0));
 }
 
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-/* We don't need anything special. */
-int module_frob_arch_sections(Elf_Ehdr *hdr,
-			      Elf_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 #ifdef CONFIG_X86_32
 int apply_relocate(Elf32_Shdr *sechdrs,
 		   const char *strtab,
@@ -100,17 +85,6 @@ int apply_relocate(Elf32_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-int apply_relocate_add(Elf32_Shdr *sechdrs,
-		       const char *strtab,
-		       unsigned int symindex,
-		       unsigned int relsec,
-		       struct module *me)
-{
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
 #else /*X86_64*/
 int apply_relocate_add(Elf64_Shdr *sechdrs,
 		   const char *strtab,
@@ -181,17 +155,6 @@ overflow:
 	       me->name);
 	return -ENOEXEC;
 }
-
-int apply_relocate(Elf_Shdr *sechdrs,
-		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *me)
-{
-	printk(KERN_ERR "non add relocation not supported\n");
-	return -ENOSYS;
-}
-
 #endif
 
 int module_finalize(const Elf_Ehdr *hdr,
diff --git a/arch/xtensa/kernel/module.c b/arch/xtensa/kernel/module.c
index c1accea..451dda9 100644
--- a/arch/xtensa/kernel/module.c
+++ b/arch/xtensa/kernel/module.c
@@ -24,26 +24,6 @@
 
 #undef DEBUG_RELOCATE
 
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc_exec(size);
-}
-
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-}
-
-int module_frob_arch_sections(Elf32_Ehdr *hdr,
-    			      Elf32_Shdr *sechdrs,
-			      char *secstrings,
-			      struct module *mod)
-{
-	return 0;
-}
-
 static int
 decode_calln_opcode (unsigned char *location)
 {
@@ -66,18 +46,6 @@ decode_l32r_opcode (unsigned char *location)
 #endif
 }
 
-int apply_relocate(Elf32_Shdr *sechdrs,
-    		   const char *strtab,
-		   unsigned int symindex,
-		   unsigned int relsec,
-		   struct module *mod)
-{
-        printk(KERN_ERR "module %s: REL RELOCATION unsupported\n",
-               mod->name);
-        return -ENOEXEC;
-
-}
-
 int apply_relocate_add(Elf32_Shdr *sechdrs,
 		       const char *strtab,
 		       unsigned int symindex,
@@ -222,14 +190,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 	}
 	return 0;
 }
-
-int module_finalize(const Elf_Ehdr *hdr,
-    		    const Elf_Shdr *sechdrs,
-		    struct module *mod)
-{
-	return 0;
-}
-
-void module_arch_cleanup(struct module *mod)
-{
-}
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/2] modules: add default loader hook implementations
  2011-06-30 19:22                 ` [PATCH 1/2] " Jonas Bonn
  2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
@ 2011-06-30 19:43                   ` Mike Frysinger
  2011-06-30 20:02                   ` Linus Torvalds
  2 siblings, 0 replies; 19+ messages in thread
From: Mike Frysinger @ 2011-06-30 19:43 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: rusty, arnd, geert, mingo, linux-kernel, linux-arch, monstr,
	cmetcalf, torvalds, akpm

On Thu, Jun 30, 2011 at 15:22, Jonas Bonn wrote:
> -/* These must be implemented by the specific architecture */
> +/* These may be implemented by architectures that need to hook into the
> + * module loader code.  Architectures that don't need to do anything special
> + * can just rely on the 'weak' default hooks defined in kernel/module.c.
> + * Note, however, that at least one of apply_relocate or apply_relocate_add
> + * must be implemented by each architecture.
> + */

still need to update this multi-line comment ;)
-mike

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 2/2] modules: make arch's use default loader hooks
  2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
@ 2011-06-30 19:46                     ` Mike Frysinger
  2011-07-01  7:00                     ` Geert Uytterhoeven
  2011-07-05 11:25                     ` Michal Simek
  2 siblings, 0 replies; 19+ messages in thread
From: Mike Frysinger @ 2011-06-30 19:46 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: rusty, arnd, geert, mingo, linux-kernel, linux-arch, monstr,
	cmetcalf, torvalds, akpm

On Thu, Jun 30, 2011 at 15:22, Jonas Bonn wrote:
>  arch/blackfin/kernel/module.c   |   21 -------------

Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/2] modules: add default loader hook implementations
  2011-06-30 19:22                 ` [PATCH 1/2] " Jonas Bonn
  2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
  2011-06-30 19:43                   ` [PATCH 1/2] modules: add default loader hook implementations Mike Frysinger
@ 2011-06-30 20:02                   ` Linus Torvalds
  2011-07-01  5:00                     ` Jonas Bonn
  2 siblings, 1 reply; 19+ messages in thread
From: Linus Torvalds @ 2011-06-30 20:02 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: rusty, arnd, geert, mingo, linux-kernel, linux-arch, monstr,
	cmetcalf, akpm

On Thu, Jun 30, 2011 at 12:22 PM, Jonas Bonn <jonas@southpole.se> wrote:
>
> The module loader code allows architectures to hook into the code by
> providing a small number of entry points that each arch must implement.
> This patch provides __weakly linked generic implementations of these
> entry points for architectures that don't need to do anything special.

Hmm. I know we used to have problems with gcc versions (or maybe
binutils) that had bugs wrt "weak" functions being declared in the
same compilation unit they were used. They would either inline the
weak function, or bind it early, and never let the linker see the
weak/strong functions and do the right thing.

I just don't remember if we disallowed those gcc/binutils versions and
check for it, or whether we decided that __weak function smust be
defined in a compilation unit separate from the user.

Because you now added all the weak functions to the same file
(module.c) that actually uses them.

Commit f9d14250071e ("Disallow gcc versions 4.1.{0,1}") implies we
disallowed the broken versions entirely, but I'm not entirely sure
those were the only cases.

Anybody remember?

                     Linus

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/2] modules: add default loader hook implementations
  2011-06-30 20:02                   ` Linus Torvalds
@ 2011-07-01  5:00                     ` Jonas Bonn
  2011-07-04  4:34                       ` Rusty Russell
  0 siblings, 1 reply; 19+ messages in thread
From: Jonas Bonn @ 2011-07-01  5:00 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: rusty, arnd, geert, mingo, linux-kernel, linux-arch, monstr,
	cmetcalf, akpm


On Thu, 2011-06-30 at 13:02 -0700, Linus Torvalds wrote:
> On Thu, Jun 30, 2011 at 12:22 PM, Jonas Bonn <jonas@southpole.se> wrote:
> >
> > The module loader code allows architectures to hook into the code by
> > providing a small number of entry points that each arch must implement.
> > This patch provides __weakly linked generic implementations of these
> > entry points for architectures that don't need to do anything special.
> 
> Hmm. I know we used to have problems with gcc versions (or maybe
> binutils) that had bugs wrt "weak" functions being declared in the
> same compilation unit they were used. They would either inline the
> weak function, or bind it early, and never let the linker see the
> weak/strong functions and do the right thing.
> 
> I just don't remember if we disallowed those gcc/binutils versions and
> check for it, or whether we decided that __weak function smust be
> defined in a compilation unit separate from the user.
> 
> Because you now added all the weak functions to the same file
> (module.c) that actually uses them.

There was precedent for this.  The function arch_mod_section_prepend was
already defined as __weak in kernel/module.c.

And just looking around the kernel tree, there are lots of other files
that have their weak variants in the same file as the functions that
rely on them.  'git grep __weak' turns up a whole slew of them.

/Jonas



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 2/2] modules: make arch's use default loader hooks
  2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
  2011-06-30 19:46                     ` Mike Frysinger
@ 2011-07-01  7:00                     ` Geert Uytterhoeven
  2011-07-05 11:25                     ` Michal Simek
  2 siblings, 0 replies; 19+ messages in thread
From: Geert Uytterhoeven @ 2011-07-01  7:00 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: rusty, arnd, mingo, linux-kernel, linux-arch, monstr, cmetcalf,
	torvalds, akpm

On Thu, Jun 30, 2011 at 21:22, Jonas Bonn <jonas@southpole.se> wrote:
> This patch removes all the module loader hook implementations in the
> architecture specific code where the functionality is the same as that
> now provided by the recently added default hooks.
>
> Signed-off-by: Jonas Bonn <jonas@southpole.se>

>  arch/m68k/kernel/module_mm.c    |   27 -----------------
>  arch/m68k/kernel/module_no.c    |   34 ---------------------

Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/2] modules: add default loader hook implementations
  2011-07-01  5:00                     ` Jonas Bonn
@ 2011-07-04  4:34                       ` Rusty Russell
  0 siblings, 0 replies; 19+ messages in thread
From: Rusty Russell @ 2011-07-04  4:34 UTC (permalink / raw)
  To: Jonas Bonn, Linus Torvalds
  Cc: arnd, geert, mingo, linux-kernel, linux-arch, monstr, cmetcalf, akpm

On Fri, 01 Jul 2011 07:00:33 +0200, Jonas Bonn <jonas@southpole.se> wrote:
> 
> On Thu, 2011-06-30 at 13:02 -0700, Linus Torvalds wrote:
> > On Thu, Jun 30, 2011 at 12:22 PM, Jonas Bonn <jonas@southpole.se> wrote:
> > >
> > > The module loader code allows architectures to hook into the code by
> > > providing a small number of entry points that each arch must implement.
> > > This patch provides __weakly linked generic implementations of these
> > > entry points for architectures that don't need to do anything special.
> > 
> > Hmm. I know we used to have problems with gcc versions (or maybe
> > binutils) that had bugs wrt "weak" functions being declared in the
> > same compilation unit they were used. They would either inline the
> > weak function, or bind it early, and never let the linker see the
> > weak/strong functions and do the right thing.
> > 
> > I just don't remember if we disallowed those gcc/binutils versions and
> > check for it, or whether we decided that __weak function smust be
> > defined in a compilation unit separate from the user.
> > 
> > Because you now added all the weak functions to the same file
> > (module.c) that actually uses them.
> 
> There was precedent for this.  The function arch_mod_section_prepend was
> already defined as __weak in kernel/module.c.
> 
> And just looking around the kernel tree, there are lots of other files
> that have their weak variants in the same file as the functions that
> rely on them.  'git grep __weak' turns up a whole slew of them.

OK, I've applied these.

Thanks,
Rusty.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 2/2] modules: make arch's use default loader hooks
  2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
  2011-06-30 19:46                     ` Mike Frysinger
  2011-07-01  7:00                     ` Geert Uytterhoeven
@ 2011-07-05 11:25                     ` Michal Simek
  2 siblings, 0 replies; 19+ messages in thread
From: Michal Simek @ 2011-07-05 11:25 UTC (permalink / raw)
  To: Jonas Bonn
  Cc: rusty, arnd, geert, mingo, linux-kernel, linux-arch, cmetcalf,
	torvalds, akpm

Jonas Bonn wrote:
> This patch removes all the module loader hook implementations in the
> architecture specific code where the functionality is the same as that
> now provided by the recently added default hooks.
> 
> Signed-off-by: Jonas Bonn <jonas@southpole.se>
> ---
>  arch/alpha/kernel/module.c      |   34 ---------------------
>  arch/arm/kernel/module.c        |   29 +------------------
>  arch/avr32/kernel/module.c      |   20 -------------
>  arch/blackfin/kernel/module.c   |   21 -------------
>  arch/cris/kernel/module.c       |   43 ++-------------------------
>  arch/frv/kernel/module.c        |   57 ++----------------------------------
>  arch/h8300/kernel/module.c      |   45 ----------------------------
>  arch/ia64/kernel/module.c       |   16 ----------
>  arch/m32r/kernel/module.c       |   38 ------------------------
>  arch/m68k/kernel/module_mm.c    |   27 -----------------
>  arch/m68k/kernel/module_no.c    |   34 ---------------------
>  arch/microblaze/kernel/module.c |   35 ----------------------

I tested it on Microblaze.

Tested-by: Michal Simek <monstr@monstr.eu>

Michal

-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
Microblaze U-BOOT custodian

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2011-07-05 11:25 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-25  7:38 [PATCH] modules: add default loader hook implementations Jonas Bonn
2011-06-25 10:04 ` Ingo Molnar
2011-06-25 10:39   ` Jonas Bonn
2011-06-25 13:08     ` Arnd Bergmann
2011-06-27  9:07       ` Rusty Russell
2011-06-27  9:25         ` Geert Uytterhoeven
2011-06-27 11:05           ` Arnd Bergmann
2011-06-28  1:23             ` Rusty Russell
2011-06-28 10:45               ` Arnd Bergmann
2011-06-28 16:50                 ` Jonas Bonn
2011-06-30 19:22                 ` [PATCH 1/2] " Jonas Bonn
2011-06-30 19:22                   ` [PATCH 2/2] modules: make arch's use default loader hooks Jonas Bonn
2011-06-30 19:46                     ` Mike Frysinger
2011-07-01  7:00                     ` Geert Uytterhoeven
2011-07-05 11:25                     ` Michal Simek
2011-06-30 19:43                   ` [PATCH 1/2] modules: add default loader hook implementations Mike Frysinger
2011-06-30 20:02                   ` Linus Torvalds
2011-07-01  5:00                     ` Jonas Bonn
2011-07-04  4:34                       ` Rusty Russell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.