[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 02 of 12] blktap2: add tlb flush properly



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1243501466 -3600
# Node ID 0296433ecee6e8897ccaad394d42a2fdffcdc48d
# Parent  5b93bcabe9cc0deaab0f2409dda1f19c1a104141
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 <yamahata@xxxxxxxxxxxxx>

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 <daniel.stodden@xxxxxxxxxx>

diff -r 5b93bcabe9cc -r 0296433ecee6 arch/x86/mm/tlb.c
--- a/arch/x86/mm/tlb.c Thu Jan 28 16:53:19 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 5b93bcabe9cc -r 0296433ecee6 drivers/xen/blktap/device.c
--- a/drivers/xen/blktap/device.c       Thu Jan 28 16:53:19 2010 -0800
+++ b/drivers/xen/blktap/device.c       Thu May 28 10:04:26 2009 +0100
@@ -4,6 +4,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>
@@ -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;

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.