Index: 2006-06-29/linux-2.6-xen-sparse/arch/i386/mm/highmem-xen.c =================================================================== --- 2006-06-29.orig/linux-2.6-xen-sparse/arch/i386/mm/highmem-xen.c 2006-02-01 18:28:39.000000000 +0100 +++ 2006-06-29/linux-2.6-xen-sparse/arch/i386/mm/highmem-xen.c 2006-06-29 15:27:26.000000000 +0200 @@ -42,7 +42,7 @@ static void *__kmap_atomic(struct page * if (!pte_none(*(kmap_pte-idx))) BUG(); #endif - set_pte_at_sync(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot)); + set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot)); return (void*) vaddr; } @@ -60,26 +60,27 @@ void *kmap_atomic_pte(struct page *page, void kunmap_atomic(void *kvaddr, enum km_type type) { -#ifdef CONFIG_DEBUG_HIGHMEM unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); - if (vaddr < FIXADDR_START) { // FIXME + if (vaddr < (unsigned long)high_memory) { dec_preempt_count(); preempt_check_resched(); return; } +#ifdef CONFIG_DEBUG_HIGHMEM if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx)) BUG(); +#endif /* * force other mappings to Oops if they'll try to access * this pte without first remap it + * Also, let go of references Xen keeps for each mapping + * a given page has. */ - pte_clear(&init_mm, vaddr, kmap_pte-idx); - __flush_tlb_one(vaddr); -#endif + set_pte_at_sync(&init_mm, vaddr, kmap_pte-idx, __pte_ma(0)); dec_preempt_count(); preempt_check_resched();