fix CONFIG_DEBUG_HIGHMEM assert in copy_page_range()
Subsystems (2)
PATCH 1/1 fix CONFIG_DEBUG_HIGHMEM assert in copy_page_range()
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 <[email protected]>
mm/memory.c renamed from mm/memory.c.orig +8 -8
@@ -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 );