kernel: fix crashes on MIPS when loading kernel modules under memory pressure
[openwrt/staging/yousong.git] / target / linux / generic / patches-3.18 / 305-mips_module_reloc.patch
index 8818675a0fc83c44ae9f3625c411bd606db30980..fae7e70f0e54ea37b458419674b271a9bacf081a 100644 (file)
@@ -3,7 +3,7 @@
 @@ -90,8 +90,13 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
  cflags-y                      += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
  cflags-y                      += -msoft-float
- LDFLAGS_vmlinux                       += -G 0 -static -n -nostdlib
+ LDFLAGS_vmlinux                       += -G 0 -static -n -nostdlib --gc-sections
 +ifdef CONFIG_64BIT
  KBUILD_AFLAGS_MODULE          += -mlong-calls
  KBUILD_CFLAGS_MODULE          += -mlong-calls
@@ -12,8 +12,8 @@
 +KBUILD_CFLAGS_MODULE          += -mno-long-calls
 +endif
  
- cflags-y += -ffreestanding
+ ifndef CONFIG_FUNCTION_TRACER
+ KBUILD_CFLAGS_KERNEL          += -ffunction-sections -fdata-sections
 --- a/arch/mips/include/asm/module.h
 +++ b/arch/mips/include/asm/module.h
 @@ -11,6 +11,11 @@ struct mod_arch_specific {
  
        return 0;
  }
-@@ -287,11 +529,32 @@ int module_finalize(const Elf_Ehdr *hdr,
+@@ -287,9 +529,36 @@ int module_finalize(const Elf_Ehdr *hdr,
                list_add(&me->arch.dbe_list, &dbe_list);
                spin_unlock_irq(&dbe_lock);
        }
        return 0;
  }
  
- void module_arch_cleanup(struct module *mod)
- {
++void module_arch_freeing_init(struct module *mod)
++{
++      if (mod->state == MODULE_STATE_LIVE)
++              return;
++
 +      if (mod->arch.phys_plt_tbl) {
 +              __module_free(mod->arch.phys_plt_tbl);
 +              mod->arch.phys_plt_tbl = NULL;
 +              __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);