kernel: fix a small bug in the MIPS highmem fix
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 48482
This commit is contained in:
parent
68fef14e46
commit
e8e4b6eed8
4 changed files with 20 additions and 8 deletions
|
@ -79,17 +79,23 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
addr = (unsigned long) page_address(page);
|
addr = (unsigned long) page_address(page);
|
||||||
flush_data_cache_page(addr);
|
flush_data_cache_page(addr);
|
||||||
@@ -142,7 +161,12 @@ void __update_cache(struct vm_area_struc
|
@@ -142,12 +161,17 @@ void __update_cache(struct vm_area_struc
|
||||||
if (unlikely(!pfn_valid(pfn)))
|
if (unlikely(!pfn_valid(pfn)))
|
||||||
return;
|
return;
|
||||||
page = pfn_to_page(pfn);
|
page = pfn_to_page(pfn);
|
||||||
- if (page_mapping(page) && Page_dcache_dirty(page)) {
|
- if (page_mapping(page) && Page_dcache_dirty(page)) {
|
||||||
+ if (!Page_dcache_dirty(page))
|
+ if (!Page_dcache_dirty(page) || !page_mapping(page))
|
||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
+ if (PageHighMem(page)) {
|
+ if (PageHighMem(page)) {
|
||||||
+ flush_highmem_page(page);
|
+ flush_highmem_page(page);
|
||||||
+ } else if (page_mapping(page)) {
|
+ } else {
|
||||||
addr = (unsigned long) page_address(page);
|
addr = (unsigned long) page_address(page);
|
||||||
if (exec || pages_do_alias(addr, address & PAGE_MASK))
|
if (exec || pages_do_alias(addr, address & PAGE_MASK))
|
||||||
flush_data_cache_page(addr);
|
flush_data_cache_page(addr);
|
||||||
|
- ClearPageDcacheDirty(page);
|
||||||
|
}
|
||||||
|
+ ClearPageDcacheDirty(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long _page_cachable_default;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/arch/mips/mm/cache.c
|
--- a/arch/mips/mm/cache.c
|
||||||
+++ b/arch/mips/mm/cache.c
|
+++ b/arch/mips/mm/cache.c
|
||||||
@@ -38,6 +38,7 @@ void (*__flush_cache_vunmap)(void);
|
@@ -39,6 +39,7 @@ void (*__flush_cache_vunmap)(void);
|
||||||
|
|
||||||
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
||||||
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
||||||
|
|
|
@ -79,17 +79,23 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
addr = (unsigned long) page_address(page);
|
addr = (unsigned long) page_address(page);
|
||||||
flush_data_cache_page(addr);
|
flush_data_cache_page(addr);
|
||||||
@@ -142,7 +161,12 @@ void __update_cache(struct vm_area_struc
|
@@ -142,12 +161,17 @@ void __update_cache(struct vm_area_struc
|
||||||
if (unlikely(!pfn_valid(pfn)))
|
if (unlikely(!pfn_valid(pfn)))
|
||||||
return;
|
return;
|
||||||
page = pfn_to_page(pfn);
|
page = pfn_to_page(pfn);
|
||||||
- if (page_mapping(page) && Page_dcache_dirty(page)) {
|
- if (page_mapping(page) && Page_dcache_dirty(page)) {
|
||||||
+ if (!Page_dcache_dirty(page))
|
+ if (!Page_dcache_dirty(page) || !page_mapping(page))
|
||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
+ if (PageHighMem(page)) {
|
+ if (PageHighMem(page)) {
|
||||||
+ flush_highmem_page(page);
|
+ flush_highmem_page(page);
|
||||||
+ } else if (page_mapping(page)) {
|
+ } else {
|
||||||
addr = (unsigned long) page_address(page);
|
addr = (unsigned long) page_address(page);
|
||||||
if (exec || pages_do_alias(addr, address & PAGE_MASK))
|
if (exec || pages_do_alias(addr, address & PAGE_MASK))
|
||||||
flush_data_cache_page(addr);
|
flush_data_cache_page(addr);
|
||||||
|
- ClearPageDcacheDirty(page);
|
||||||
|
}
|
||||||
|
+ ClearPageDcacheDirty(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long _page_cachable_default;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/arch/mips/mm/cache.c
|
--- a/arch/mips/mm/cache.c
|
||||||
+++ b/arch/mips/mm/cache.c
|
+++ b/arch/mips/mm/cache.c
|
||||||
@@ -38,6 +38,7 @@ void (*__flush_cache_vunmap)(void);
|
@@ -39,6 +39,7 @@ void (*__flush_cache_vunmap)(void);
|
||||||
|
|
||||||
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
||||||
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
||||||
|
|
Loading…
Reference in a new issue