From: Rusty Russell , David Mosberger The patch below updates the other platforms with module_arch_cleanup(). Also, I added more debug output to kernel/module.c since I found it useful to be able to see the final section layout. arch/alpha/kernel/module.c | 5 +++++ arch/arm/kernel/module.c | 5 +++++ arch/i386/kernel/module.c | 4 ++++ arch/parisc/kernel/module.c | 4 ++++ arch/ppc/kernel/module.c | 4 ++++ arch/ppc64/kernel/module.c | 4 ++++ arch/s390/kernel/module.c | 4 ++++ arch/sparc/kernel/module.c | 4 ++++ arch/sparc64/kernel/module.c | 4 ++++ arch/v850/kernel/module.c | 5 +++++ arch/x86_64/kernel/module.c | 4 ++++ include/linux/moduleloader.h | 3 +++ kernel/module.c | 5 +++++ 13 files changed, 55 insertions(+) diff -puN arch/alpha/kernel/module.c~module_arch_cleanup-2 arch/alpha/kernel/module.c --- 25/arch/alpha/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/alpha/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -300,3 +300,8 @@ module_finalize(const Elf_Ehdr *hdr, con { return 0; } + +void +module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/arm/kernel/module.c~module_arch_cleanup-2 arch/arm/kernel/module.c --- 25/arch/arm/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/arm/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -159,3 +159,8 @@ module_finalize(const Elf32_Ehdr *hdr, c { return 0; } + +void +module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/i386/kernel/module.c~module_arch_cleanup-2 arch/i386/kernel/module.c --- 25/arch/i386/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/i386/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -123,3 +123,7 @@ int module_finalize(const Elf_Ehdr *hdr, } return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/parisc/kernel/module.c~module_arch_cleanup-2 arch/parisc/kernel/module.c --- 25/arch/parisc/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/parisc/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -568,3 +568,7 @@ int module_finalize(const Elf_Ehdr *hdr, #endif return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/ppc64/kernel/module.c~module_arch_cleanup-2 arch/ppc64/kernel/module.c --- 25/arch/ppc64/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/ppc64/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -384,3 +384,7 @@ int module_finalize(const Elf_Ehdr *hdr, me->num_exentries); return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/ppc/kernel/module.c~module_arch_cleanup-2 arch/ppc/kernel/module.c --- 25/arch/ppc/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/ppc/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -269,3 +269,7 @@ int module_finalize(const Elf_Ehdr *hdr, { return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/s390/kernel/module.c~module_arch_cleanup-2 arch/s390/kernel/module.c --- 25/arch/s390/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/s390/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -386,3 +386,7 @@ int module_finalize(const Elf_Ehdr *hdr, kfree(me->arch.syminfo); return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/sparc64/kernel/module.c~module_arch_cleanup-2 arch/sparc64/kernel/module.c --- 25/arch/sparc64/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/sparc64/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -273,3 +273,7 @@ int module_finalize(const Elf_Ehdr *hdr, { return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/sparc/kernel/module.c~module_arch_cleanup-2 arch/sparc/kernel/module.c --- 25/arch/sparc/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/sparc/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -145,3 +145,7 @@ int module_finalize(const Elf_Ehdr *hdr, { return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/v850/kernel/module.c~module_arch_cleanup-2 arch/v850/kernel/module.c --- 25/arch/v850/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/v850/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -230,3 +230,8 @@ int apply_relocate_add (Elf32_Shdr *sech return 0; } + +void +module_arch_cleanup(struct module *mod) +{ +} diff -puN arch/x86_64/kernel/module.c~module_arch_cleanup-2 arch/x86_64/kernel/module.c --- 25/arch/x86_64/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/arch/x86_64/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -231,3 +231,7 @@ int module_finalize(const Elf_Ehdr *hdr, { return 0; } + +void module_arch_cleanup(struct module *mod) +{ +} diff -puN include/linux/moduleloader.h~module_arch_cleanup-2 include/linux/moduleloader.h --- 25/include/linux/moduleloader.h~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/include/linux/moduleloader.h 2003-05-12 21:23:07.000000000 -0700 @@ -41,4 +41,7 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod); +/* Any cleanup needed when module leaves. */ +void module_arch_cleanup(struct module *mod); + #endif diff -puN kernel/module.c~module_arch_cleanup-2 kernel/module.c --- 25/kernel/module.c~module_arch_cleanup-2 2003-05-12 21:23:07.000000000 -0700 +++ 25-akpm/kernel/module.c 2003-05-12 21:23:07.000000000 -0700 @@ -910,6 +910,9 @@ static void free_module(struct module *m list_del(&mod->list); spin_unlock_irq(&modlist_lock); + /* Arch-specific cleanup. */ + module_arch_cleanup(mod); + /* Module unload stuff */ module_unload_free(mod); @@ -1276,6 +1279,7 @@ static struct module *load_module(void _ mod->module_init = ptr; /* Transfer each section which specifies SHF_ALLOC */ + DEBUGP("final section addresses:\n"); for (i = 0; i < hdr->e_shnum; i++) { void *dest; @@ -1293,6 +1297,7 @@ static struct module *load_module(void _ sechdrs[i].sh_size); /* Update sh_addr to point to copy in image. */ sechdrs[i].sh_addr = (unsigned long)dest; + DEBUGP("\t0x%lx %s\n", sechdrs[i].sh_addr, secstrings + sechdrs[i].sh_name); } /* Module has been moved. */ mod = (void *)sechdrs[modindex].sh_addr; _