]> xenbits.xen.org Git - xenclient/linux-2.6.27-pq.git/commitdiff
include oss fix for smp blktap2
authorJake Wires <Jake.Wires@citrix.com>
Wed, 2 Sep 2009 01:40:19 +0000 (18:40 -0700)
committerJake Wires <Jake.Wires@citrix.com>
Wed, 2 Sep 2009 01:40:19 +0000 (18:40 -0700)
master/blktap2-smp-map-unmap [new file with mode: 0644]
master/series

diff --git a/master/blktap2-smp-map-unmap b/master/blktap2-smp-map-unmap
new file mode 100644 (file)
index 0000000..7ab287b
--- /dev/null
@@ -0,0 +1,66 @@
+diff --git a/drivers/xen/blktap2/device.c b/drivers/xen/blktap2/device.c
+index 06571b0..e7e6635 100644
+--- a/drivers/xen/blktap2/device.c
++++ b/drivers/xen/blktap2/device.c
+@@ -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>
+@@ -138,9 +139,8 @@ blktap_map_uaddr_fn(pte_t *ptep, struct page *pmd_page,
+ {
+       pte_t *pte = (pte_t *)data;
+-      BTDBG("ptep %p -> %012llx\n", ptep, pte_val(*pte));
++      BTDBG("ptep %p -> %012llx\n", ptep, (unsigned long long)pte_val(*pte));
+       set_pte(ptep, *pte);
+-      xen_invlpg(addr);
+       return 0;
+ }
+@@ -159,7 +159,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;
+ }
+@@ -170,6 +169,16 @@ blktap_umap_uaddr(struct mm_struct *mm, unsigned long address)
+                                  PAGE_SIZE, blktap_umap_uaddr_fn, mm);
+ }
++static inline void
++flush_tlb_kernel_page(unsigned long kvaddr)
++{
++#ifdef CONFIG_X86
++      xen_invlpg_all(kvaddr);
++#else
++      flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE);
++#endif
++}
++
+ static void
+ blktap_device_end_dequeued_request(struct blktap_device *dev,
+                                  struct request *req, int error)
+@@ -299,6 +308,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_page(kvaddr);
+                       set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT,
+                                           INVALID_P2M_ENTRY);
+               }
+@@ -528,7 +538,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_page(ring->vma, uvaddr);
+       blktap_map_uaddr(&init_mm, kvaddr, mk_pte(page, PAGE_KERNEL));
++      flush_tlb_kernel_page(kvaddr);
+       set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, pte_mfn(pte));
+       request->handles[seg].kernel = INVALID_GRANT_HANDLE;
index 3a80da6b2d24e9e815c158a8057029369eb78eb7..1613091fc52a31bb28f4e42db8a4730f3cda1b3c 100644 (file)
@@ -311,3 +311,4 @@ pass2-driver
 on-the-fly-cx-change
 bridge-carrier
 blktap2-pause-unpause
+blktap2-smp-map-unmap