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:
Felix Fietkau 2016-01-25 10:28:29 +00:00
parent 68fef14e46
commit e8e4b6eed8
4 changed files with 20 additions and 8 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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);