[source] kernel: fix crashes on MIPS when loading kernel modules under memory pressure

LEDE Commits lede-commits at lists.infradead.org
Wed Feb 15 04:24:34 PST 2017


nbd pushed a commit to source.git, branch lede-17.01:
https://git.lede-project.org/853bad5af293c6291894892237ddecbd24e370c8

commit 853bad5af293c6291894892237ddecbd24e370c8
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Wed Feb 15 12:33:03 2017 +0100

    kernel: fix crashes on MIPS when loading kernel modules under memory pressure
    
    When memory is tight, modules may need to be loaded into vmalloc()
    space. The code then has to generate jump trampolines which enable
    relocations between vmalloc space and physical address space.
    
    The code had a bug that was freeing these trampolines even when the
    module was successfully loaded.
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 target/linux/generic/patches-3.18/305-mips_module_reloc.patch | 5 ++++-
 target/linux/generic/patches-4.4/305-mips_module_reloc.patch  | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/target/linux/generic/patches-3.18/305-mips_module_reloc.patch b/target/linux/generic/patches-3.18/305-mips_module_reloc.patch
index f8ca914..fae7e70 100644
--- a/target/linux/generic/patches-3.18/305-mips_module_reloc.patch
+++ b/target/linux/generic/patches-3.18/305-mips_module_reloc.patch
@@ -317,7 +317,7 @@
  
  	return 0;
  }
-@@ -287,9 +529,33 @@ 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);
  	}
@@ -338,6 +338,9 @@
  
 +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;
diff --git a/target/linux/generic/patches-4.4/305-mips_module_reloc.patch b/target/linux/generic/patches-4.4/305-mips_module_reloc.patch
index 8b3975f..944921f 100644
--- a/target/linux/generic/patches-4.4/305-mips_module_reloc.patch
+++ b/target/linux/generic/patches-4.4/305-mips_module_reloc.patch
@@ -316,7 +316,7 @@
  
  	return 0;
  }
-@@ -287,9 +528,33 @@ int module_finalize(const Elf_Ehdr *hdr,
+@@ -287,9 +528,36 @@ int module_finalize(const Elf_Ehdr *hdr,
  		list_add(&me->arch.dbe_list, &dbe_list);
  		spin_unlock_irq(&dbe_lock);
  	}
@@ -337,6 +337,9 @@
  
 +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;



More information about the lede-commits mailing list