Commit 964f7e5a authored by Paul Mundt's avatar Paul Mundt

sh: force dcache flush if dcache_dirty bit set.

This too follows the ARM change, given that the issue at hand applies to
all platforms that implement lazy D-cache writeback.

This fixes up the case when a page mapping disappears between the
flush_dcache_page() call (when PG_dcache_dirty is set for the page) and
the update_mmu_cache() call -- such as in the case of swap cache being
freed early. This kills off the mapping test in update_mmu_cache() and
switches to simply testing for PG_dcache_dirty.
Reported-by: default avatarNitin Gupta <ngupta@vflare.org>
Reported-by: default avatarHugh Dickins <hugh.dickins@tiscali.co.uk>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent af67c3a9
...@@ -128,7 +128,7 @@ void __update_cache(struct vm_area_struct *vma, ...@@ -128,7 +128,7 @@ void __update_cache(struct vm_area_struct *vma,
return; return;
page = pfn_to_page(pfn); page = pfn_to_page(pfn);
if (pfn_valid(pfn) && page_mapping(page)) { if (pfn_valid(pfn)) {
int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags); int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
if (dirty) { if (dirty) {
unsigned long addr = (unsigned long)page_address(page); unsigned long addr = (unsigned long)page_address(page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment