xen: add a dma_addr_t dev_addr argument to xen_dma_map_page
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Fri, 21 Nov 2014 11:04:39 +0000 (11:04 +0000)
committerDavid Vrabel <david.vrabel@citrix.com>
Thu, 4 Dec 2014 12:41:51 +0000 (12:41 +0000)
dev_addr is the machine address of the page.

The new parameter can be used by the ARM and ARM64 implementations of
xen_dma_map_page to find out if the page is a local page (pfn == mfn) or
a foreign page (pfn != mfn).

dev_addr could be retrieved again from the physical address, using
pfn_to_mfn, but it requires accessing an rbtree. Since we already have
the dev_addr in our hands at the call site there is no need to get the
mfn twice.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
arch/arm/include/asm/xen/page-coherent.h
arch/arm64/include/asm/xen/page-coherent.h
arch/x86/include/asm/xen/page-coherent.h
drivers/xen/swiotlb-xen.c

index 9cfd895eb4bba59b78d1f7cc1de03e98484a447b..a309f42b411c8de0048f6a571c5283823346f7ed 100644 (file)
@@ -29,8 +29,8 @@ static inline void xen_free_coherent_pages(struct device *hwdev, size_t size,
 }
 
 static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
-            unsigned long offset, size_t size, enum dma_data_direction dir,
-            struct dma_attrs *attrs)
+            dma_addr_t dev_addr, unsigned long offset, size_t size,
+            enum dma_data_direction dir, struct dma_attrs *attrs)
 {
        __generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);
 }
index dde3fc9c49f015c80b43f9ca21f1d996b9d2a910..d7cd4c2b2fd2714cc248aac02165b9a2a61b3c3b 100644 (file)
@@ -20,8 +20,8 @@ static inline void xen_free_coherent_pages(struct device *hwdev, size_t size,
 }
 
 static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
-            unsigned long offset, size_t size, enum dma_data_direction dir,
-            struct dma_attrs *attrs)
+            dma_addr_t dev_addr, unsigned long offset, size_t size,
+            enum dma_data_direction dir, struct dma_attrs *attrs)
 {
 }
 
index 7f02fe4e2c7b1d5a71c5e9931f8800f948f65929..acd844c017d3f2217c33badd4606d75b18219ace 100644 (file)
@@ -22,8 +22,8 @@ static inline void xen_free_coherent_pages(struct device *hwdev, size_t size,
 }
 
 static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
-            unsigned long offset, size_t size, enum dma_data_direction dir,
-            struct dma_attrs *attrs) { }
+            dma_addr_t dev_addr, unsigned long offset, size_t size,
+            enum dma_data_direction dir, struct dma_attrs *attrs) { }
 
 static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
                size_t size, enum dma_data_direction dir,
index ebd8f218a788b619f65438223cc85306e381caa7..ad2c5eb8a9c79b7f64ce04dcf995b5422720d7b4 100644 (file)
@@ -403,7 +403,7 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
                /* we are not interested in the dma_addr returned by
                 * xen_dma_map_page, only in the potential cache flushes executed
                 * by the function. */
-               xen_dma_map_page(dev, page, offset, size, dir, attrs);
+               xen_dma_map_page(dev, page, dev_addr, offset, size, dir, attrs);
                return dev_addr;
        }
 
@@ -417,7 +417,7 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
                return DMA_ERROR_CODE;
 
        xen_dma_map_page(dev, pfn_to_page(map >> PAGE_SHIFT),
-                                       map & ~PAGE_MASK, size, dir, attrs);
+                                       dev_addr, map & ~PAGE_MASK, size, dir, attrs);
        dev_addr = xen_phys_to_bus(map);
 
        /*
@@ -574,6 +574,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
                                return 0;
                        }
                        xen_dma_map_page(hwdev, pfn_to_page(map >> PAGE_SHIFT),
+                                               dev_addr,
                                                map & ~PAGE_MASK,
                                                sg->length,
                                                dir,
@@ -584,6 +585,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
                         * xen_dma_map_page, only in the potential cache flushes executed
                         * by the function. */
                        xen_dma_map_page(hwdev, pfn_to_page(paddr >> PAGE_SHIFT),
+                                               dev_addr,
                                                paddr & ~PAGE_MASK,
                                                sg->length,
                                                dir,