Changeset 44590


Ignore:
Timestamp:
2015-03-02T05:42:17+01:00 (3 years ago)
Author:
nbd
Message:

kernel: fix the mips module relocation patch for 3.19+

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/target/linux/generic
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/patches-3.19/305-mips_module_reloc.patch

    r43095 r44590  
    3131--- a/arch/mips/kernel/module.c 
    3232+++ b/arch/mips/kernel/module.c 
    33 @@ -43,14 +43,222 @@ struct mips_hi16 { 
     33@@ -43,14 +43,221 @@ struct mips_hi16 { 
    3434 static LIST_HEAD(dbe_list); 
    3535 static DEFINE_SPINLOCK(dbe_lock); 
     
    127127+       split_page(page, order); 
    128128+ 
     129+       /* mark all pages except for the last one */ 
     130+       for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p) 
     131+               set_bit(PG_owner_priv_1, &p->flags); 
     132+ 
    129133+       for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p) 
    130134+               __free_page(p); 
     
    134138+#endif 
    135139+ 
    136 +static void free_phys(void *ptr, unsigned long size) 
     140+static void free_phys(void *ptr) 
    137141+{ 
    138142+       struct page *page; 
    139 +       struct page *end; 
     143+       bool free; 
    140144+ 
    141145+       page = virt_to_page(ptr); 
    142 +       end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT); 
    143 + 
    144 +       for (; page < end; ++page) 
     146+       do { 
     147+               free = test_and_clear_bit(PG_owner_priv_1, &page->flags); 
    145148+               __free_page(page); 
     149+               page++; 
     150+       } while (free); 
    146151+} 
    147152+ 
     
    181186+ 
    182187+/* Free memory returned from module_alloc */ 
    183 +void module_free(struct module *mod, void *module_region) 
    184 +{ 
    185 +       if (is_phys_addr(module_region)) { 
    186 +               if (mod->module_init == module_region) 
    187 +                       free_phys(module_region, mod->init_size); 
    188 +               else if (mod->module_core == module_region) 
    189 +                       free_phys(module_region, mod->core_size); 
    190 +               else 
    191 +                       BUG(); 
    192 +       } else { 
     188+void module_memfree(void *module_region) 
     189+{ 
     190+       if (is_phys_addr(module_region)) 
     191+               free_phys(module_region); 
     192+       else 
    193193+               vfree(module_region); 
    194 +       } 
    195194+} 
    196195+ 
     
    255254 int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v) 
    256255 { 
    257 @@ -64,8 +272,39 @@ static int apply_r_mips_32_rel(struct mo 
     256@@ -64,8 +271,39 @@ static int apply_r_mips_32_rel(struct mo 
    258257        return 0; 
    259258 } 
     
    295294                pr_err("module %s: dangerous R_MIPS_26 REL relocation\n", 
    296295                       me->name); 
    297 @@ -73,14 +312,17 @@ static int apply_r_mips_26_rel(struct mo 
     296@@ -73,14 +311,17 @@ static int apply_r_mips_26_rel(struct mo 
    298297        } 
    299298  
     
    318317        return 0; 
    319318 } 
    320 @@ -287,11 +529,32 @@ int module_finalize(const Elf_Ehdr *hdr, 
     319@@ -287,11 +528,32 @@ int module_finalize(const Elf_Ehdr *hdr, 
    321320                list_add(&me->arch.dbe_list, &dbe_list); 
    322321                spin_unlock_irq(&dbe_lock); 
  • trunk/target/linux/generic/patches-4.0/305-mips_module_reloc.patch

    r44532 r44590  
    3131--- a/arch/mips/kernel/module.c 
    3232+++ b/arch/mips/kernel/module.c 
    33 @@ -43,14 +43,222 @@ struct mips_hi16 { 
     33@@ -43,14 +43,221 @@ struct mips_hi16 { 
    3434 static LIST_HEAD(dbe_list); 
    3535 static DEFINE_SPINLOCK(dbe_lock); 
     
    127127+       split_page(page, order); 
    128128+ 
     129+       /* mark all pages except for the last one */ 
     130+       for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p) 
     131+               set_bit(PG_owner_priv_1, &p->flags); 
     132+ 
    129133+       for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p) 
    130134+               __free_page(p); 
     
    134138+#endif 
    135139+ 
    136 +static void free_phys(void *ptr, unsigned long size) 
     140+static void free_phys(void *ptr) 
    137141+{ 
    138142+       struct page *page; 
    139 +       struct page *end; 
     143+       bool free; 
    140144+ 
    141145+       page = virt_to_page(ptr); 
    142 +       end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT); 
    143 + 
    144 +       for (; page < end; ++page) 
     146+       do { 
     147+               free = test_and_clear_bit(PG_owner_priv_1, &page->flags); 
    145148+               __free_page(page); 
     149+               page++; 
     150+       } while (free); 
    146151+} 
    147152+ 
     
    151156+#ifdef MODULE_START 
    152157        return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END, 
    153                                 GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE, 
     158                                GFP_KERNEL, PAGE_KERNEL, NUMA_NO_NODE, 
    154159                                __builtin_return_address(0)); 
    155160+#else 
     
    181186+ 
    182187+/* Free memory returned from module_alloc */ 
    183 +void module_free(struct module *mod, void *module_region) 
    184 +{ 
    185 +       if (is_phys_addr(module_region)) { 
    186 +               if (mod->module_init == module_region) 
    187 +                       free_phys(module_region, mod->init_size); 
    188 +               else if (mod->module_core == module_region) 
    189 +                       free_phys(module_region, mod->core_size); 
    190 +               else 
    191 +                       BUG(); 
    192 +       } else { 
     188+void module_memfree(void *module_region) 
     189+{ 
     190+       if (is_phys_addr(module_region)) 
     191+               free_phys(module_region); 
     192+       else 
    193193+               vfree(module_region); 
    194 +       } 
    195194+} 
    196195+ 
     
    255254 int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v) 
    256255 { 
    257 @@ -64,8 +272,39 @@ static int apply_r_mips_32_rel(struct mo 
     256@@ -64,8 +271,39 @@ static int apply_r_mips_32_rel(struct mo 
    258257        return 0; 
    259258 } 
     
    295294                pr_err("module %s: dangerous R_MIPS_26 REL relocation\n", 
    296295                       me->name); 
    297 @@ -73,14 +312,17 @@ static int apply_r_mips_26_rel(struct mo 
     296@@ -73,14 +311,17 @@ static int apply_r_mips_26_rel(struct mo 
    298297        } 
    299298  
     
    318317        return 0; 
    319318 } 
    320 @@ -287,11 +529,32 @@ int module_finalize(const Elf_Ehdr *hdr, 
     319@@ -287,11 +528,32 @@ int module_finalize(const Elf_Ehdr *hdr, 
    321320                list_add(&me->arch.dbe_list, &dbe_list); 
    322321                spin_unlock_irq(&dbe_lock); 
Note: See TracChangeset for help on using the changeset viewer.