]> xenbits.xensource.com Git - legacy/linux-2.6.18-xen.git/commitdiff
blktap2: add tlb flush properly.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 28 May 2009 09:04:26 +0000 (10:04 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 28 May 2009 09:04:26 +0000 (10:04 +0100)
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 <yamahata@valinux.co.jp>
drivers/xen/blktap2/device.c

index 7c5974c369b4582b94c84031c765dda82d63f75b..affada81419b918793d5782108b1fbf1a79a6f9d 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/cdrom.h>
 #include <linux/hdreg.h>
 #include <linux/module.h>
+#include <asm/tlbflush.h>
 
 #include <scsi/scsi.h>
 #include <scsi/scsi_ioctl.h>
@@ -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;