[patch] fix CONFIG_DEBUG_HIGHMEM assert in copy_page_range()

From: Ingo Molnar
Date: Mon Sep 27 2004 - 18:45:19 EST



copy_page_range() triggers a CONFIG_DEBUG_HIGHMEM assert, because if a
preemption occurs right at a PMD_SIZE boundary the kmap/kunmap doesnt
match. This isnt a real problem because atomic_kunmap doesnt do anything
if CONFIG_DEBUG_HIGHMEM is not set and the atomic_map's are still
correct, but it's ugly nevertheless.

tested patch is against 2.6.9-rc2-mm4.

Ingo

Signed-off-by: Ingo Molnar <mingo@xxxxxxx>

--- linux/mm/memory.c.orig
+++ linux/mm/memory.c
@@ -337,14 +337,6 @@ skip_copy_pte_range:
set_pte(dst_pte, pte);
page_dup_rmap(page);
cont_copy_pte_range_noset:
- address += PAGE_SIZE;
- if (address >= end) {
- pte_unmap_nested(src_pte);
- pte_unmap(dst_pte);
- goto out_unlock;
- }
- src_pte++;
- dst_pte++;
/*
* We are holding two locks at this point -
* any of them could generate latencies in
@@ -364,6 +356,14 @@ cont_copy_pte_range_noset:
dst_pte = pte_offset_map(dst_pmd, address);
src_pte = pte_offset_map_nested(src_pmd, address);
}
+ address += PAGE_SIZE;
+ if (address >= end) {
+ pte_unmap_nested(src_pte);
+ pte_unmap(dst_pte);
+ goto out_unlock;
+ }
+ src_pte++;
+ dst_pte++;
} while ((unsigned long)src_pte & PTE_TABLE_MASK);
pte_unmap_nested(src_pte-1);
pte_unmap(dst_pte-1);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/