# HG changeset patch # User Keir Fraser # Date 1244107977 -3600 # Node ID a045aa7c4a77b76dd5be30b0e879087eea57e490 # Parent b2651e8eaa82c3401ccb7e39a879016bf3b42a67 blktap2: reduce TLB flush scope c/s 885 added very coarse TLB flushing. Since these flushes always follow single page updates, single page flushes (when available) are sufficient. Signed-off-by: Jan Beulich To linux-2.6-pvops: * Stripped arch/i386/mm/hypervisor.c exports * Stripped xen_invlpg_all(kvaddr) use on CONFIG_X86 Signed-off-by: Daniel Stodden diff -r b2651e8eaa82 -r a045aa7c4a77 drivers/xen/blktap/device.c --- a/drivers/xen/blktap/device.c Thu Jun 04 10:32:34 2009 +0100 +++ b/drivers/xen/blktap/device.c Thu Jun 04 10:32:57 2009 +0100 @@ -197,6 +197,12 @@ PAGE_SIZE, blktap_umap_uaddr_fn, mm); } +static inline void +flush_tlb_kernel_page(unsigned long kvaddr) +{ + flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE); +} + static void blktap_device_end_dequeued_request(struct blktap_device *dev, struct request *req, int error) @@ -326,7 +332,7 @@ if (request->handles[i].kernel == INVALID_GRANT_HANDLE) { kvaddr = request_to_kaddr(request, i); blktap_umap_uaddr(tap->ring.vma->vm_mm, kvaddr); - flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE); + flush_tlb_kernel_page(kvaddr); set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, INVALID_P2M_ENTRY); } @@ -561,9 +567,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); + flush_tlb_page(ring->vma, uvaddr); blktap_map_uaddr(ring->vma->vm_mm, kvaddr, mk_pte(page, PAGE_KERNEL)); - flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE); + flush_tlb_kernel_page(kvaddr); set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, pte_mfn(pte)); request->handles[seg].kernel = INVALID_GRANT_HANDLE;