# HG changeset patch # User Keir Fraser # Date 1243501466 -3600 # Node ID b3b159b5e283fd0b6c7fd0317b807512c9e22b50 # Parent 5a033c651dc03e82c31ec28f304ab799092a533e blktap2: add tlb flush properly. xen_invlpg() flushes tlb on its cpu, but tlb flush is needed on all cpus. So replace xen_invlpg() with more proper ones. Maybe it would be possible to make tlb flush less. this patch also makes blktap2 compile on ia64 because xen_invlpg() is x86 specific. Signed-off-by: Isaku Yamahata linux-2.6-pvops: * rebase against git-da22857f (port blktap2 from 2.6.18 to tip) * rebase against git-fbbc8527 (wean off of use of the BlkBack pageflag) * gpl-export flush_tlb_page, flush_tlb_all Signed-off-by: Daniel Stodden diff -r 5a033c651dc0 -r b3b159b5e283 arch/x86/mm/tlb.c --- a/arch/x86/mm/tlb.c Fri Feb 05 11:12:14 2010 -0800 +++ b/arch/x86/mm/tlb.c Thu May 28 10:04:26 2009 +0100 @@ -282,6 +282,7 @@ preempt_enable(); } +EXPORT_SYMBOL_GPL(flush_tlb_page); void flush_tlb_all(void) { @@ -296,3 +297,4 @@ put_cpu(); } +EXPORT_SYMBOL_GPL(flush_tlb_all); diff -r 5a033c651dc0 -r b3b159b5e283 drivers/xen/blktap/device.c --- a/drivers/xen/blktap/device.c Fri Feb 05 11:12:14 2010 -0800 +++ b/drivers/xen/blktap/device.c Thu May 28 10:04:26 2009 +0100 @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -167,7 +168,6 @@ BTDBG("ptep %p -> %012llx\n", ptep, (unsigned long long)pte_val(*pte)); set_pte(ptep, *pte); - __flush_tlb_single(addr); return 0; } @@ -186,7 +186,6 @@ BTDBG("ptep %p\n", ptep); pte_clear(mm, addr, ptep); - __flush_tlb_single(addr); return 0; } @@ -326,6 +325,7 @@ if (request->handles[i].kernel == INVALID_GRANT_HANDLE) { kvaddr = request_to_kaddr(request, i); blktap_umap_uaddr(&init_mm, kvaddr); + flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE); set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, INVALID_P2M_ENTRY); } @@ -560,7 +560,9 @@ pte = mk_pte(page, ring->vma->vm_page_prot); blktap_map_uaddr(ring->vma->vm_mm, uvaddr, pte_mkwrite(pte)); + flush_tlb_mm(ring->vma->vm_mm); blktap_map_uaddr(&init_mm, kvaddr, mk_pte(page, PAGE_KERNEL)); + flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE); set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, pte_mfn(pte)); request->handles[seg].kernel = INVALID_GRANT_HANDLE;