Skip to contentSkip to conversation

swiotlb: Correct kernel command line handler

PATCH In review Jungseok Lee 2 participants 4 messages Apr 1, 2014 – Jun 20, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 swiotlb: Correct kernel command line handler

This patch corrects kernel command line handler when io_tlb_nslabs is set to 0.

A current implementation allocates default size memory (64MB) when 0 is given to io_tlb_nslabs ("swiotlb=0") by kernel command line. In other words, memory is allocated unintentionally.

---
 lib/swiotlb.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
lib/swiotlb.c +6 -2
index b604b83..9fe9f71 100644
@@ -55,6 +55,8 @@
 
 int swiotlb_force;
 
+static int swiotlb_no_use;
+
 /*
  * Used to do a quick range check in swiotlb_tbl_unmap_single and
  * swiotlb_tbl_sync_single_*, to see if the memory was in fact allocated by this
@@ -102,6 +104,8 @@ setup_io_tlb_npages(char *str)
 		io_tlb_nslabs = simple_strtoul(str, &str, 0);
 		/* avoid tail segment of size < IO_TLB_SEGSIZE */
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
+		if (!io_tlb_nslabs)
+			swiotlb_no_use = 1;
 	}
 	if (*str == ',')
 		++str;
@@ -212,7 +216,7 @@ swiotlb_init(int verbose)
 	unsigned char *vstart;
 	unsigned long bytes;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
@@ -244,7 +248,7 @@ swiotlb_late_init_with_default_size(size_t default_size)
 	unsigned int order;
 	int rc = 0;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
Signature · 1 line
1.7.10.4
#1 lore raw
Quoted 6 lines · Jungseok Lee

This patch corrects kernel command line handler when io_tlb_nslabs is set to 0.

A current implementation allocates default size memory (64MB) when 0 is given to io_tlb_nslabs ("swiotlb=0") by kernel command line. In other words, memory is allocated unintentionally.

What are the other IOMMUs that end up taking over the DMA ops? Or do you end up with no DMA ops?

Quoted 51 lines
---
 lib/swiotlb.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
lib/swiotlb.c +6 -2
index b604b83..9fe9f71 100644
@@ -55,6 +55,8 @@
 
 int swiotlb_force;
 
+static int swiotlb_no_use;
+
 /*
  * Used to do a quick range check in swiotlb_tbl_unmap_single and
  * swiotlb_tbl_sync_single_*, to see if the memory was in fact allocated by this
@@ -102,6 +104,8 @@ setup_io_tlb_npages(char *str)
 		io_tlb_nslabs = simple_strtoul(str, &str, 0);
 		/* avoid tail segment of size < IO_TLB_SEGSIZE */
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
+		if (!io_tlb_nslabs)
+			swiotlb_no_use = 1;
 	}
 	if (*str == ',')
 		++str;
@@ -212,7 +216,7 @@ swiotlb_init(int verbose)
 	unsigned char *vstart;
 	unsigned long bytes;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
@@ -244,7 +248,7 @@ swiotlb_late_init_with_default_size(size_t default_size)
 	unsigned int order;
 	int rc = 0;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
Signature · 1 line
1.7.10.4
#2 lore raw
Quoted 9 lines · Konrad Rzeszutek Wilk
Quoted 6 lines · Jungseok Lee

This patch corrects kernel command line handler when io_tlb_nslabs is set to 0.

A current implementation allocates default size memory (64MB) when 0 is given to io_tlb_nslabs ("swiotlb=0") by kernel command line. In other words, memory is allocated unintentionally.

What are the other IOMMUs that end up taking over the DMA ops?

I think that no other IOMMUs take over it on ARM64 system, except Xen.

Quoted 1 line

Or do you end up with no DMA ops?

I focus on ARM64 system which uses swiotlb as default DMA ops.

If some ARM64 platforms would like to use memory only from __get_free_pages in swiotlb_alloc_coherent function, an interface would be needed to configure reserved memory size.

Thus, I add it to kernel command line handler.

Best Regards
Jungseok Lee

Quoted 54 lines
Quoted 48 lines
---
 lib/swiotlb.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
lib/swiotlb.c index b604b83..9fe9f71 renamed from lib/swiotlb.c +0 -0

100644

lib/swiotlb.c +2 -0
@@ -55,6 +55,8 @@
 
 int swiotlb_force;
 
+static int swiotlb_no_use;
+
 /*
  * Used to do a quick range check in swiotlb_tbl_unmap_single and
  * swiotlb_tbl_sync_single_*, to see if the memory was in fact

allocated by this @@ -102,6 +104,8 @@ setup_io_tlb_npages(char *str)

lib/swiotlb.c +4 -3
 		io_tlb_nslabs = simple_strtoul(str, &str, 0);
 		/* avoid tail segment of size < IO_TLB_SEGSIZE */
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
+		if (!io_tlb_nslabs)
+			swiotlb_no_use = 1;
 	}
 	if (*str == ',')
 		++str;
@@ -212,7 +216,7 @@ swiotlb_init(int verbose)
 	unsigned char *vstart;
 	unsigned long bytes;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
@@ -244,7 +248,7 @@ swiotlb_late_init_with_default_size(size_t default_size)
 	unsigned int order;
 	int rc = 0;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
--
Quoted 3 lines

1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw
Quoted 15 lines · Jungseok Lee
Quoted 9 lines · Konrad Rzeszutek Wilk
Quoted 6 lines · Jungseok Lee

This patch corrects kernel command line handler when io_tlb_nslabs is set to 0.

A current implementation allocates default size memory (64MB) when 0 is given to io_tlb_nslabs ("swiotlb=0") by kernel command line. In other words, memory is allocated unintentionally.

What are the other IOMMUs that end up taking over the DMA ops?

I think that no other IOMMUs take over it on ARM64 system, except Xen.

Quoted 1 line

Or do you end up with no DMA ops?

Quoted 7 lines

I focus on ARM64 system which uses swiotlb as default DMA ops.

If some ARM64 platforms would like to use memory only from __get_free_pages in swiotlb_alloc_coherent function, an interface would be needed to configure reserved memory size.

Thus, I add it to kernel command line handler.

OK. I somehow have lost track of this patch. Is this patch still valid?

Quoted 59 lines

Best Regards
Jungseok Lee

Quoted 54 lines
Quoted 48 lines
---
 lib/swiotlb.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
lib/swiotlb.c index b604b83..9fe9f71 renamed from lib/swiotlb.c +0 -0

100644

lib/swiotlb.c +2 -0
@@ -55,6 +55,8 @@
 
 int swiotlb_force;
 
+static int swiotlb_no_use;
+
 /*
  * Used to do a quick range check in swiotlb_tbl_unmap_single and
  * swiotlb_tbl_sync_single_*, to see if the memory was in fact

allocated by this @@ -102,6 +104,8 @@ setup_io_tlb_npages(char *str)

lib/swiotlb.c +4 -3
 		io_tlb_nslabs = simple_strtoul(str, &str, 0);
 		/* avoid tail segment of size < IO_TLB_SEGSIZE */
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
+		if (!io_tlb_nslabs)
+			swiotlb_no_use = 1;
 	}
 	if (*str == ',')
 		++str;
@@ -212,7 +216,7 @@ swiotlb_init(int verbose)
 	unsigned char *vstart;
 	unsigned long bytes;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
@@ -244,7 +248,7 @@ swiotlb_late_init_with_default_size(size_t default_size)
 	unsigned int order;
 	int rc = 0;
 
-	if (!io_tlb_nslabs) {
+	if (!swiotlb_no_use && !io_tlb_nslabs) {
 		io_tlb_nslabs = (default_size >> IO_TLB_SHIFT);
 		io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE);
 	}
--
Quoted 3 lines

1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html