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

[Xen-changelog] [linux-2.6.18-xen] swiotlb: Handle sync invocations on subregions of a mapped region.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1184006464 -3600
# Node ID f15643dab1ca40ff3f2ca7eed5196bc74703422a
# Parent  d9af7736dee4899528c8d9c2cbdb57f03d5475ca
swiotlb: Handle sync invocations on subregions of a mapped region.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 arch/i386/kernel/swiotlb.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletion(-)

diff -r d9af7736dee4 -r f15643dab1ca arch/i386/kernel/swiotlb.c
--- a/arch/i386/kernel/swiotlb.c        Mon Jul 09 18:16:05 2007 +0100
+++ b/arch/i386/kernel/swiotlb.c        Mon Jul 09 19:41:04 2007 +0100
@@ -304,6 +304,7 @@ map_single(struct device *hwdev, struct 
        unsigned long flags;
        char *dma_addr;
        unsigned int nslots, stride, index, wrap;
+       struct phys_addr slot_buf;
        int i;
 
        /*
@@ -375,7 +376,15 @@ map_single(struct device *hwdev, struct 
         * This is needed when we sync the memory.  Then we sync the buffer if
         * needed.
         */
-       io_tlb_orig_addr[index] = buffer;
+       slot_buf = buffer;
+       for (i = 0; i < nslots; i++) {
+               io_tlb_orig_addr[index+i] = slot_buf;
+               slot_buf.offset += 1 << IO_TLB_SHIFT;
+               if (slot_buf.offset > PAGE_SIZE) {
+                       slot_buf.page++;
+                       slot_buf.offset -= PAGE_SIZE;
+               }
+       }
        if ((dir == DMA_TO_DEVICE) || (dir == DMA_BIDIRECTIONAL))
                __sync_single(buffer, dma_addr, size, DMA_TO_DEVICE);
 

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


 


Rackspace

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