linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce()
@ 2019-01-18  7:10 Dongli Zhang
  2019-01-18  7:10 ` [PATCH v3 2/3] swiotlb: add debugfs to track swiotlb buffer usage Dongli Zhang
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Dongli Zhang @ 2019-01-18  7:10 UTC (permalink / raw)
  To: linux-kernel, iommu
  Cc: konrad.wilk, hch, m.szyprowski, robin.murphy, joe.jin, dongli.zhang

Fix the comment as swiotlb_bounce() is used to copy from original dma
location to swiotlb buffer during swiotlb_tbl_map_single(), while to
copy from swiotlb buffer to original dma location during
swiotlb_tbl_unmap_single().

Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
---
 kernel/dma/swiotlb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 1fb6fd6..1d8b377 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -385,7 +385,7 @@ void __init swiotlb_exit(void)
 }
 
 /*
- * Bounce: copy the swiotlb buffer back to the original dma location
+ * Bounce: copy the swiotlb buffer from or back to the original dma location
  */
 static void swiotlb_bounce(phys_addr_t orig_addr, phys_addr_t tlb_addr,
 			   size_t size, enum dma_data_direction dir)
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/3] swiotlb: add debugfs to track swiotlb buffer usage
  2019-01-18  7:10 [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Dongli Zhang
@ 2019-01-18  7:10 ` Dongli Zhang
  2019-01-18  7:10 ` [PATCH v3 3/3] swiotlb: checking whether swiotlb buffer is full with io_tlb_used Dongli Zhang
  2019-02-12 18:47 ` [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Konrad Rzeszutek Wilk
  2 siblings, 0 replies; 4+ messages in thread
From: Dongli Zhang @ 2019-01-18  7:10 UTC (permalink / raw)
  To: linux-kernel, iommu
  Cc: konrad.wilk, hch, m.szyprowski, robin.murphy, joe.jin, dongli.zhang

The device driver will not be able to do dma operations once swiotlb buffer
is full, either because the driver is using so many IO TLB blocks inflight,
or because there is memory leak issue in device driver. To export the
swiotlb buffer usage via debugfs would help the user estimate the size of
swiotlb buffer to pre-allocate or analyze device driver memory leak issue.

Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
---
Changed since v1:
  * init debugfs with late_initcall (suggested by Robin Murphy)
  * create debugfs entries with debugfs_create_ulong(suggested by Robin Murphy)

Changed since v2:
  * some #ifdef folding (suggested by Konrad Rzeszutek Wilk)

 kernel/dma/swiotlb.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 1d8b377..bedc9f9 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -34,6 +34,9 @@
 #include <linux/scatterlist.h>
 #include <linux/mem_encrypt.h>
 #include <linux/set_memory.h>
+#ifdef CONFIG_DEBUG_FS
+#include <linux/debugfs.h>
+#endif
 
 #include <asm/io.h>
 #include <asm/dma.h>
@@ -73,6 +76,11 @@ phys_addr_t io_tlb_start, io_tlb_end;
 static unsigned long io_tlb_nslabs;
 
 /*
+ * The number of used IO TLB block
+ */
+static unsigned long io_tlb_used;
+
+/*
  * This is a free list describing the number of free entries available from
  * each index
  */
@@ -524,6 +532,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
 		dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes)\n", size);
 	return DMA_MAPPING_ERROR;
 found:
+	io_tlb_used += nslots;
 	spin_unlock_irqrestore(&io_tlb_lock, flags);
 
 	/*
@@ -584,6 +593,8 @@ void swiotlb_tbl_unmap_single(struct device *hwdev, phys_addr_t tlb_addr,
 		 */
 		for (i = index - 1; (OFFSET(i, IO_TLB_SEGSIZE) != IO_TLB_SEGSIZE -1) && io_tlb_list[i]; i--)
 			io_tlb_list[i] = ++count;
+
+		io_tlb_used -= nslots;
 	}
 	spin_unlock_irqrestore(&io_tlb_lock, flags);
 }
@@ -662,3 +673,36 @@ swiotlb_dma_supported(struct device *hwdev, u64 mask)
 {
 	return __phys_to_dma(hwdev, io_tlb_end - 1) <= mask;
 }
+
+#ifdef CONFIG_DEBUG_FS
+
+static int __init swiotlb_create_debugfs(void)
+{
+	static struct dentry *d_swiotlb_usage;
+	struct dentry *ent;
+
+	d_swiotlb_usage = debugfs_create_dir("swiotlb", NULL);
+
+	if (!d_swiotlb_usage)
+		return -ENOMEM;
+
+	ent = debugfs_create_ulong("io_tlb_nslabs", 0400,
+				   d_swiotlb_usage, &io_tlb_nslabs);
+	if (!ent)
+		goto fail;
+
+	ent = debugfs_create_ulong("io_tlb_used", 0400,
+				   d_swiotlb_usage, &io_tlb_used);
+	if (!ent)
+		goto fail;
+
+	return 0;
+
+fail:
+	debugfs_remove_recursive(d_swiotlb_usage);
+	return -ENOMEM;
+}
+
+late_initcall(swiotlb_create_debugfs);
+
+#endif
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 3/3] swiotlb: checking whether swiotlb buffer is full with io_tlb_used
  2019-01-18  7:10 [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Dongli Zhang
  2019-01-18  7:10 ` [PATCH v3 2/3] swiotlb: add debugfs to track swiotlb buffer usage Dongli Zhang
@ 2019-01-18  7:10 ` Dongli Zhang
  2019-02-12 18:47 ` [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Konrad Rzeszutek Wilk
  2 siblings, 0 replies; 4+ messages in thread
From: Dongli Zhang @ 2019-01-18  7:10 UTC (permalink / raw)
  To: linux-kernel, iommu
  Cc: konrad.wilk, hch, m.szyprowski, robin.murphy, joe.jin, dongli.zhang

This patch uses io_tlb_used to help check whether swiotlb buffer is full.
io_tlb_used is no longer used for only debugfs. It is also used to help
optimize swiotlb_tbl_map_single().

Suggested-by: Joe Jin <joe.jin@oracle.com>
Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
---
Changed since v2:
  * move #ifdef folding to previous patch (suggested by Konrad Rzeszutek Wilk)

 kernel/dma/swiotlb.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index bedc9f9..a01b83e 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -483,6 +483,10 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
 	 * request and allocate a buffer from that IO TLB pool.
 	 */
 	spin_lock_irqsave(&io_tlb_lock, flags);
+
+	if (unlikely(nslots > io_tlb_nslabs - io_tlb_used))
+		goto not_found;
+
 	index = ALIGN(io_tlb_index, stride);
 	if (index >= io_tlb_nslabs)
 		index = 0;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce()
  2019-01-18  7:10 [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Dongli Zhang
  2019-01-18  7:10 ` [PATCH v3 2/3] swiotlb: add debugfs to track swiotlb buffer usage Dongli Zhang
  2019-01-18  7:10 ` [PATCH v3 3/3] swiotlb: checking whether swiotlb buffer is full with io_tlb_used Dongli Zhang
@ 2019-02-12 18:47 ` Konrad Rzeszutek Wilk
  2 siblings, 0 replies; 4+ messages in thread
From: Konrad Rzeszutek Wilk @ 2019-02-12 18:47 UTC (permalink / raw)
  To: Dongli Zhang
  Cc: linux-kernel, iommu, konrad.wilk, hch, m.szyprowski,
	robin.murphy, joe.jin

On Fri, Jan 18, 2019 at 03:10:26PM +0800, Dongli Zhang wrote:
> Fix the comment as swiotlb_bounce() is used to copy from original dma
> location to swiotlb buffer during swiotlb_tbl_map_single(), while to
> copy from swiotlb buffer to original dma location during
> swiotlb_tbl_unmap_single().

I queued up your patches in https://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb.git
> 
> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
> ---
>  kernel/dma/swiotlb.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
> index 1fb6fd6..1d8b377 100644
> --- a/kernel/dma/swiotlb.c
> +++ b/kernel/dma/swiotlb.c
> @@ -385,7 +385,7 @@ void __init swiotlb_exit(void)
>  }
>  
>  /*
> - * Bounce: copy the swiotlb buffer back to the original dma location
> + * Bounce: copy the swiotlb buffer from or back to the original dma location
>   */
>  static void swiotlb_bounce(phys_addr_t orig_addr, phys_addr_t tlb_addr,
>  			   size_t size, enum dma_data_direction dir)
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-02-12 18:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-18  7:10 [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Dongli Zhang
2019-01-18  7:10 ` [PATCH v3 2/3] swiotlb: add debugfs to track swiotlb buffer usage Dongli Zhang
2019-01-18  7:10 ` [PATCH v3 3/3] swiotlb: checking whether swiotlb buffer is full with io_tlb_used Dongli Zhang
2019-02-12 18:47 ` [PATCH v3 1/3] swiotlb: fix comment on swiotlb_bounce() Konrad Rzeszutek Wilk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).