mips: Free memory when load_module fails (#14453)

The mips reloc patch introduced new allocations which were done before
add_unformed_module but never freed them in case of an error. A new hook in
Linux 3.19 called module_arch_freeing_init can be used for freeing memory
which were allocated during this init phase.

The problem can be seen when trying to load a module (via busybox insmod)
when it was already loaded.

    free -m
    for i in `seq 1 100`; do
        /sbin/insmod /lib/modules/*/ath9k.ko >& /dev/null
    done
    free -m

This simple loop would leak ~3.2 MB.

Signed-off-by: Sven Eckelmann <sven@open-mesh.com>

SVN-Revision: 46247
This commit is contained in:
John Crispin
2015-07-07 13:48:27 +00:00
parent 7ab6409a89
commit 8f0e96ee11
4 changed files with 200 additions and 15 deletions

View File

@@ -316,7 +316,7 @@
return 0;
}
@@ -287,11 +528,32 @@ int module_finalize(const Elf_Ehdr *hdr,
@@ -287,9 +528,33 @@ int module_finalize(const Elf_Ehdr *hdr,
list_add(&me->arch.dbe_list, &dbe_list);
spin_unlock_irq(&dbe_lock);
}
@@ -335,8 +335,8 @@
return 0;
}
void module_arch_cleanup(struct module *mod)
{
+void module_arch_freeing_init(struct module *mod)
+{
+ if (mod->arch.phys_plt_tbl) {
+ __module_free(mod->arch.phys_plt_tbl);
+ mod->arch.phys_plt_tbl = NULL;
@@ -345,7 +345,8 @@
+ __module_free(mod->arch.virt_plt_tbl);
+ mod->arch.virt_plt_tbl = NULL;
+ }
+}
+
void module_arch_cleanup(struct module *mod)
{
spin_lock_irq(&dbe_lock);
list_del(&mod->arch.dbe_list);
spin_unlock_irq(&dbe_lock);