From: Keir Fraser Date: Thu, 28 May 2009 09:04:26 +0000 (+0100) Subject: blktap2: add tlb flush properly. X-Git-Tag: xen-3.4.2~56 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f5e872759a0954a0348d70e2631de597545b4616;p=legacy%2Flinux-2.6.18-xen.git 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 --- diff --git a/drivers/xen/blktap2/device.c b/drivers/xen/blktap2/device.c index 7c5974c3..affada81 100644 --- a/drivers/xen/blktap2/device.c +++ b/drivers/xen/blktap2/device.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -163,7 +164,6 @@ blktap_map_uaddr_fn(pte_t *ptep, struct page *pmd_page, BTDBG("ptep %p -> %012llx\n", ptep, pte_val(*pte)); set_pte(ptep, *pte); - xen_invlpg(addr); return 0; } @@ -182,7 +182,6 @@ blktap_umap_uaddr_fn(pte_t *ptep, struct page *pmd_page, BTDBG("ptep %p\n", ptep); pte_clear(mm, addr, ptep); - xen_invlpg(addr); return 0; } @@ -322,6 +321,7 @@ blktap_unmap(struct blktap *tap, struct blktap_request *request) 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); } @@ -551,7 +551,9 @@ blktap_map(struct blktap *tap, 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;