@@ -276,10 +276,13 @@ __flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr,
void flush_dcache_page(struct page *page)
{
struct address_space *mapping = page_mapping(page);
- struct vm_area_struct *mpnt;
+ struct vm_area_struct *mpnt = NULL;
struct prio_tree_iter iter;
unsigned long offset;
- unsigned long addr, old_addr = 0;
+ unsigned long addr = 0;
+#ifdef DEBUG_ALIASES
+ unsigned long old_addr = 0;
+#endif
pgoff_t pgoff;
if (mapping && !mapping_mapped(mapping)) {
@@ -304,14 +307,25 @@ void flush_dcache_page(struct page *page)
offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT;
addr = mpnt->vm_start + offset;
+#ifdef DEBUG_ALIASES
if (old_addr == 0 || (old_addr & (SHMLBA - 1)) != (addr & (SHMLBA - 1))) {
__flush_cache_page(mpnt, addr, page_to_phys(page));
if (old_addr)
printk(KERN_ERR "INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s\n", old_addr, addr, mpnt->vm_file ? mpnt->vm_file->f_path.dentry->d_name.name : "(null)");
old_addr = addr;
}
+#else
+ break;
+#endif
}
flush_dcache_mmap_unlock(mapping);
+#ifndef DEBUG_ALIASES
+ /* since we have only one page, flush outside the lock. If the loop
+ * didn't happen (no mappings), mpnt will be NULL */
+ if (mpnt)
+ __flush_cache_page(mpnt, addr, page_to_phys(page));
+#endif
+
}
EXPORT_SYMBOL(flush_dcache_page);