lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1450741676-5865-68-git-send-email-viro@ZenIV.linux.org.uk>
Date:	Mon, 21 Dec 2015 23:47:41 +0000
From:	Al Viro <viro@...IV.linux.org.uk>
To:	linux-kernel@...r.kernel.org
Cc:	Linus Torvalds <torvalds@...ux-foundation.org>
Subject: [POC][PATCH 68/83] switch ps3_dma_map() and ps3_dma_region_ops->map() instances to physical address

From: Al Viro <viro@...iv.linux.org.uk>

callers know whether they are passing a virtual address or a physical one;
seeing that all work in the instances is done with physical addresses,
might as well have all callers pass those and don't bother with instances
checking whether they'd got a physical or a virtual address.

Signed-off-by: Al Viro <viro@...iv.linux.org.uk>
---
 arch/powerpc/include/asm/ps3.h          |  4 ++--
 arch/powerpc/platforms/ps3/mm.c         | 34 ++++++++++++---------------------
 arch/powerpc/platforms/ps3/system-bus.c |  6 +++---
 3 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/arch/powerpc/include/asm/ps3.h b/arch/powerpc/include/asm/ps3.h
index a1bc7e7..ec12e0ba 100644
--- a/arch/powerpc/include/asm/ps3.h
+++ b/arch/powerpc/include/asm/ps3.h
@@ -110,7 +110,7 @@ struct ps3_dma_region_ops {
 	int (*create)(struct ps3_dma_region *);
 	int (*free)(struct ps3_dma_region *);
 	int (*map)(struct ps3_dma_region *,
-		   unsigned long virt_addr,
+		   unsigned long phys_addr,
 		   unsigned long len,
 		   dma_addr_t *bus_addr,
 		   u64 iopte_pp);
@@ -132,7 +132,7 @@ int ps3_dma_region_init(struct ps3_system_bus_device *dev,
 	enum ps3_dma_region_type region_type, void *addr, unsigned long len);
 int ps3_dma_region_create(struct ps3_dma_region *r);
 int ps3_dma_region_free(struct ps3_dma_region *r);
-int ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr,
+int ps3_dma_map(struct ps3_dma_region *r, unsigned long phys_addr,
 	unsigned long len, dma_addr_t *bus_addr,
 	u64 iopte_pp);
 int ps3_dma_unmap(struct ps3_dma_region *r, dma_addr_t bus_addr,
diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c
index b0f3466..6cc3007 100644
--- a/arch/powerpc/platforms/ps3/mm.c
+++ b/arch/powerpc/platforms/ps3/mm.c
@@ -772,7 +772,7 @@ static int dma_ioc0_region_free(struct ps3_dma_region *r)
 /**
  * dma_sb_map_area - Map an area of memory into a device dma region.
  * @r: Pointer to a struct ps3_dma_region.
- * @virt_addr: Starting virtual address of the area to map.
+ * @phys_addr: Starting virtual address of the area to map.
  * @len: Length in bytes of the area to map.
  * @bus_addr: A pointer to return the starting ioc bus address of the area to
  * map.
@@ -780,15 +780,13 @@ static int dma_ioc0_region_free(struct ps3_dma_region *r)
  * This is the common dma mapping routine.
  */
 
-static int dma_sb_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
+static int dma_sb_map_area(struct ps3_dma_region *r, unsigned long phys_addr,
 	   unsigned long len, dma_addr_t *bus_addr,
 	   u64 iopte_flag)
 {
 	int result;
 	unsigned long flags;
 	struct dma_chunk *c;
-	unsigned long phys_addr = is_kernel_addr(virt_addr) ? __pa(virt_addr)
-		: virt_addr;
 	unsigned long aligned_phys = _ALIGN_DOWN(phys_addr, 1 << r->page_size);
 	unsigned long aligned_len = _ALIGN_UP(len + phys_addr - aligned_phys,
 					      1 << r->page_size);
@@ -797,8 +795,6 @@ static int dma_sb_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
 	if (!USE_DYNAMIC_DMA) {
 		unsigned long lpar_addr = ps3_mm_phys_to_lpar(phys_addr);
 		DBG(" -> %s:%d\n", __func__, __LINE__);
-		DBG("%s:%d virt_addr %lxh\n", __func__, __LINE__,
-			virt_addr);
 		DBG("%s:%d phys_addr %lxh\n", __func__, __LINE__,
 			phys_addr);
 		DBG("%s:%d lpar_addr %lxh\n", __func__, __LINE__,
@@ -835,23 +831,19 @@ static int dma_sb_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
 	return result;
 }
 
-static int dma_ioc0_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
+static int dma_ioc0_map_area(struct ps3_dma_region *r, unsigned long phys_addr,
 	     unsigned long len, dma_addr_t *bus_addr,
 	     u64 iopte_flag)
 {
 	int result;
 	unsigned long flags;
 	struct dma_chunk *c;
-	unsigned long phys_addr = is_kernel_addr(virt_addr) ? __pa(virt_addr)
-		: virt_addr;
 	unsigned long aligned_phys = _ALIGN_DOWN(phys_addr, 1 << r->page_size);
 	unsigned long aligned_len = _ALIGN_UP(len + phys_addr - aligned_phys,
 					      1 << r->page_size);
 
-	DBG(KERN_ERR "%s: vaddr=%#lx, len=%#lx\n", __func__,
-	    virt_addr, len);
-	DBG(KERN_ERR "%s: ph=%#lx a_ph=%#lx a_l=%#lx\n", __func__,
-	    phys_addr, aligned_phys, aligned_len);
+	DBG(KERN_ERR "%s: ph=%#lx len=%#lx a_ph=%#lx a_l=%#lx\n", __func__,
+	    phys_addr, len, aligned_phys, aligned_len);
 
 	spin_lock_irqsave(&r->chunk_list.lock, flags);
 	c = dma_find_chunk_lpar(r, ps3_mm_phys_to_lpar(phys_addr), len);
@@ -876,8 +868,8 @@ static int dma_ioc0_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
 		return result;
 	}
 	*bus_addr = c->bus_addr + phys_addr - aligned_phys;
-	DBG("%s: va=%#lx pa=%#lx a_pa=%#lx bus=%#llx\n", __func__,
-	    virt_addr, phys_addr, aligned_phys, *bus_addr);
+	DBG("%s: pa=%#lx a_pa=%#lx bus=%#llx\n", __func__,
+	    phys_addr, aligned_phys, *bus_addr);
 	c->usage_count = 1;
 
 	spin_unlock_irqrestore(&r->chunk_list.lock, flags);
@@ -1001,7 +993,7 @@ static int dma_sb_region_create_linear(struct ps3_dma_region *r)
 		len = map.rm.size - r->offset;
 		if (len > r->len)
 			len = r->len;
-		result = dma_sb_map_area(r, virt_addr, len, &tmp,
+		result = dma_sb_map_area(r, __pa(virt_addr), len, &tmp,
 			CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_SO_RW |
 			CBE_IOPTE_M);
 		BUG_ON(result);
@@ -1015,7 +1007,7 @@ static int dma_sb_region_create_linear(struct ps3_dma_region *r)
 			virt_addr += r->offset - map.rm.size;
 		else
 			len -= map.rm.size - r->offset;
-		result = dma_sb_map_area(r, virt_addr, len, &tmp,
+		result = dma_sb_map_area(r, __pa(virt_addr), len, &tmp,
 			CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_SO_RW |
 			CBE_IOPTE_M);
 		BUG_ON(result);
@@ -1080,11 +1072,9 @@ static int dma_sb_region_free_linear(struct ps3_dma_region *r)
  */
 
 static int dma_sb_map_area_linear(struct ps3_dma_region *r,
-	unsigned long virt_addr, unsigned long len, dma_addr_t *bus_addr,
+	unsigned long phys_addr, unsigned long len, dma_addr_t *bus_addr,
 	u64 iopte_flag)
 {
-	unsigned long phys_addr = is_kernel_addr(virt_addr) ? __pa(virt_addr)
-		: virt_addr;
 	*bus_addr = dma_sb_lpar_to_bus(r, ps3_mm_phys_to_lpar(phys_addr));
 	return 0;
 }
@@ -1176,11 +1166,11 @@ int ps3_dma_region_free(struct ps3_dma_region *r)
 }
 EXPORT_SYMBOL(ps3_dma_region_free);
 
-int ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr,
+int ps3_dma_map(struct ps3_dma_region *r, unsigned long phys_addr,
 	unsigned long len, dma_addr_t *bus_addr,
 	u64 iopte_flag)
 {
-	return r->region_ops->map(r, virt_addr, len, bus_addr, iopte_flag);
+	return r->region_ops->map(r, phys_addr, len, bus_addr, iopte_flag);
 }
 
 int ps3_dma_unmap(struct ps3_dma_region *r, dma_addr_t bus_addr,
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c
index 001b93c..988f8eb 100644
--- a/arch/powerpc/platforms/ps3/system-bus.c
+++ b/arch/powerpc/platforms/ps3/system-bus.c
@@ -532,7 +532,7 @@ static void * ps3_alloc_coherent(struct device *_dev, size_t size,
 		goto clean_none;
 	}
 
-	result = ps3_dma_map(dev->d_region, virt_addr, size, dma_handle,
+	result = ps3_dma_map(dev->d_region, __pa(virt_addr), size, dma_handle,
 			     CBE_IOPTE_PP_W | CBE_IOPTE_PP_R |
 			     CBE_IOPTE_SO_RW | CBE_IOPTE_M);
 
@@ -576,7 +576,7 @@ static dma_addr_t ps3_sb_map_page(struct device *_dev, struct page *page,
 	dma_addr_t bus_addr;
 	void *ptr = page_address(page) + offset;
 
-	result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size,
+	result = ps3_dma_map(dev->d_region, __pa(ptr), size,
 			     &bus_addr,
 			     CBE_IOPTE_PP_R | CBE_IOPTE_PP_W |
 			     CBE_IOPTE_SO_RW | CBE_IOPTE_M);
@@ -615,7 +615,7 @@ static dma_addr_t ps3_ioc0_map_page(struct device *_dev, struct page *page,
 		/* not happned */
 		BUG();
 	};
-	result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size,
+	result = ps3_dma_map(dev->d_region, __pa(ptr), size,
 			     &bus_addr, iopte_flag);
 
 	if (result) {
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ