8fe5ad5d33
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
75 lines
2.3 KiB
Diff
75 lines
2.3 KiB
Diff
From: Jeff Hansen <jhansen@cardaccess-inc.com>
|
|
Subject: [PATCH] no highpage
|
|
|
|
On ASUS WL-500gP there are many unexpected "Segmentation fault"s that
|
|
seem to be caused by a kernel. They can be avoided by:
|
|
1) Disabling highpage
|
|
2) Using flush_cache_mm in flush_cache_dup_mm
|
|
|
|
For details see OpenWrt ticket #2035 https://dev.openwrt.org/ticket/2035
|
|
---
|
|
--- a/arch/mips/include/asm/page.h
|
|
+++ b/arch/mips/include/asm/page.h
|
|
@@ -71,6 +71,7 @@ static inline unsigned int page_size_ftl
|
|
#endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */
|
|
|
|
#include <linux/pfn.h>
|
|
+#include <asm/cpu-features.h>
|
|
|
|
extern void build_clear_page(void);
|
|
extern void build_copy_page(void);
|
|
@@ -110,11 +111,16 @@ static inline void clear_user_page(void
|
|
flush_data_cache_page((unsigned long)addr);
|
|
}
|
|
|
|
-struct vm_area_struct;
|
|
-extern void copy_user_highpage(struct page *to, struct page *from,
|
|
- unsigned long vaddr, struct vm_area_struct *vma);
|
|
+static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
|
+ struct page *to)
|
|
+{
|
|
+ extern void (*flush_data_cache_page)(unsigned long addr);
|
|
|
|
-#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
|
+ copy_page(vto, vfrom);
|
|
+ if (!cpu_has_ic_fills_f_dc ||
|
|
+ pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
|
|
+ flush_data_cache_page((unsigned long)vto);
|
|
+}
|
|
|
|
/*
|
|
* These are used to make use of C type-checking..
|
|
--- a/arch/mips/mm/init.c
|
|
+++ b/arch/mips/mm/init.c
|
|
@@ -162,30 +162,6 @@ void kunmap_coherent(void)
|
|
preempt_enable();
|
|
}
|
|
|
|
-void copy_user_highpage(struct page *to, struct page *from,
|
|
- unsigned long vaddr, struct vm_area_struct *vma)
|
|
-{
|
|
- void *vfrom, *vto;
|
|
-
|
|
- vto = kmap_atomic(to);
|
|
- if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
|
- page_mapcount(from) && !Page_dcache_dirty(from)) {
|
|
- vfrom = kmap_coherent(from, vaddr);
|
|
- copy_page(vto, vfrom);
|
|
- kunmap_coherent();
|
|
- } else {
|
|
- vfrom = kmap_atomic(from);
|
|
- copy_page(vto, vfrom);
|
|
- kunmap_atomic(vfrom);
|
|
- }
|
|
- if ((!cpu_has_ic_fills_f_dc) ||
|
|
- pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
|
|
- flush_data_cache_page((unsigned long)vto);
|
|
- kunmap_atomic(vto);
|
|
- /* Make sure this page is cleared on other CPU's too before using it */
|
|
- smp_wmb();
|
|
-}
|
|
-
|
|
void copy_to_user_page(struct vm_area_struct *vma,
|
|
struct page *page, unsigned long vaddr, void *dst, const void *src,
|
|
unsigned long len)
|