From: Jake Wires Date: Wed, 2 Sep 2009 01:40:19 +0000 (-0700) Subject: include oss fix for smp blktap2 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=9a5d8674330b225bddca993cab87a178aa1ecc97;p=xenclient%2Flinux-2.6.27-pq.git include oss fix for smp blktap2 --- diff --git a/master/blktap2-smp-map-unmap b/master/blktap2-smp-map-unmap new file mode 100644 index 0000000..7ab287b --- /dev/null +++ b/master/blktap2-smp-map-unmap @@ -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 + #include + #include ++#include + + #include + #include +@@ -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; diff --git a/master/series b/master/series index 3a80da6..1613091 100644 --- a/master/series +++ b/master/series @@ -311,3 +311,4 @@ pass2-driver on-the-fly-cx-change bridge-carrier blktap2-pause-unpause +blktap2-smp-map-unmap