All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <56BC6C94.1060409@ti.com>

diff --git a/a/1.txt b/N1/1.txt
index b88d165..c3eb9f0 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -25,4 +25,25 @@ not test RT with mainline yet, so I'm not 100% sure if by using the
 dmaengine_terminate_sync() in drivers will fix the issue.
 
 -- 
-Péter
+P?ter
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0001-dmaengine-virt-dma-Support-for-ignoring-callback-aft.patch
+Type: text/x-patch
+Size: 4081 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160211/26d818cd/attachment-0003.bin>
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0002-dmaengine-omap-dma-Prevent-race-between-vchan_comple.patch
+Type: text/x-patch
+Size: 1215 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160211/26d818cd/attachment-0004.bin>
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0003-dmaengine-edma-Prevent-race-between-vchan_complete-a.patch
+Type: text/x-patch
+Size: 1230 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160211/26d818cd/attachment-0005.bin>
diff --git a/a/2.hdr b/a/2.hdr
deleted file mode 100644
index c76486b..0000000
--- a/a/2.hdr
+++ /dev/null
@@ -1,6 +0,0 @@
-Content-Type: text/x-patch;
-	name="0001-dmaengine-virt-dma-Support-for-ignoring-callback-aft.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
-	filename*0="0001-dmaengine-virt-dma-Support-for-ignoring-callback-aft.pa";
-	filename*1="tch"
diff --git a/a/2.txt b/a/2.txt
deleted file mode 100644
index a948309..0000000
--- a/a/2.txt
+++ /dev/null
@@ -1,126 +0,0 @@
->From 84a010c5732e7cb3339bcb303a6e3f3e6e3ba012 Mon Sep 17 00:00:00 2001
-From: Peter Ujfalusi <peter.ujfalusi@ti.com>
-Date: Wed, 10 Feb 2016 08:51:52 +0200
-Subject: [RFC 1/3] dmaengine: virt-dma: Support for ignoring callback after vc
- termination
-
-This patch provides means to prevent the race condition between vchan
-completion tasklet and the terminate_all function.
-The race condition is not easily reproducible, but it has been observed
-with RT kernel on uniprocessor systems with high rate DMA activity (UART)
-and it follows this pattern:
-When terminate_all is called, the tasklet has been already scheduled or
-it is running to handle the completion of a vdesc. The client driver might
-be freeing up resources after terminating the transfers but the tasklet
-when it has a chance to continue to execute will call the provided callback
-even after the client driver does not expect this to happen.
-The terminated flag for the vchan itself does not provide enough protection
-since can still face with a race condition:
-in this case when the vchan_complete() tests for the terminated flag it will
-see that the vchan is not terminated, but right after the test it is
-possible that the terminate thread is set to execute (uniprocessor + RT) and
-it will free up the resources. After that the vchan_complete() will resume
-and calls the callback. This will lead to crash.
-
-To provide protection, the dma driver need to make sure that the tasklet
-will not run while we terminate the channel by:
-
-static int dmadriver_terminate_all(struct dma_chan *chan)
-{
-	unsigned long flags;
-	LIST_HEAD(head);
-...
-	tasklet_disable(&vc.task);
-	spin_lock_irqsave(&vc.lock, flags);
-	vchan_terminate(&vc);
-...
-	vchan_get_all_descriptors(&vc, &head);
-	spin_unlock_irqrestore(&vc.lock, flags);
-	vchan_dma_desc_free_list(&vc, &head);
-	tasklet_enable(&vc.task);
-
-	return 0;
-}
-
-Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
----
- drivers/dma/virt-dma.c |  6 ++++--
- drivers/dma/virt-dma.h | 13 +++++++++++++
- 2 files changed, 17 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/dma/virt-dma.c b/drivers/dma/virt-dma.c
-index a35c211857dd..4317d5d3ef1f 100644
---- a/drivers/dma/virt-dma.c
-+++ b/drivers/dma/virt-dma.c
-@@ -88,11 +88,13 @@ static void vchan_complete(unsigned long arg)
- 	struct virt_dma_chan *vc = (struct virt_dma_chan *)arg;
- 	struct virt_dma_desc *vd;
- 	dma_async_tx_callback cb = NULL;
-+	bool terminated;
- 	void *cb_data = NULL;
- 	LIST_HEAD(head);
- 
- 	spin_lock_irq(&vc->lock);
- 	list_splice_tail_init(&vc->desc_completed, &head);
-+	terminated = vc->terminated;
- 	vd = vc->cyclic;
- 	if (vd) {
- 		vc->cyclic = NULL;
-@@ -101,7 +103,7 @@ static void vchan_complete(unsigned long arg)
- 	}
- 	spin_unlock_irq(&vc->lock);
- 
--	if (cb)
-+	if (cb && !terminated)
- 		cb(cb_data);
- 
- 	while (!list_empty(&head)) {
-@@ -115,7 +117,7 @@ static void vchan_complete(unsigned long arg)
- 		else
- 			vc->desc_free(vd);
- 
--		if (cb)
-+		if (cb && !terminated)
- 			cb(cb_data);
- 	}
- }
-diff --git a/drivers/dma/virt-dma.h b/drivers/dma/virt-dma.h
-index d9731ca5e262..4df44b1dafbf 100644
---- a/drivers/dma/virt-dma.h
-+++ b/drivers/dma/virt-dma.h
-@@ -27,6 +27,7 @@ struct virt_dma_chan {
- 	void (*desc_free)(struct virt_dma_desc *);
- 
- 	spinlock_t lock;
-+	bool terminated;
- 
- 	/* protected by vc.lock */
- 	struct list_head desc_allocated;
-@@ -80,6 +81,7 @@ static inline struct dma_async_tx_descriptor *vchan_tx_prep(struct virt_dma_chan
- static inline bool vchan_issue_pending(struct virt_dma_chan *vc)
- {
- 	list_splice_tail_init(&vc->desc_submitted, &vc->desc_issued);
-+	vc->terminated = false;
- 	return !list_empty(&vc->desc_issued);
- }
- 
-@@ -116,6 +118,17 @@ static inline void vchan_cyclic_callback(struct virt_dma_desc *vd)
- }
- 
- /**
-+ * vchan_terminate - set the virtual channel as terminated
-+ * vc: virtual channel to update
-+ *
-+ * vc.lock must be held by caller
-+ */
-+static inline void vchan_terminate(struct virt_dma_chan *vc)
-+{
-+	vc->terminated = true;
-+}
-+
-+/**
-  * vchan_next_desc - peek at the next descriptor to be processed
-  * @vc: virtual channel to obtain descriptor from
-  *
--- 
-2.7.1
diff --git a/a/3.hdr b/a/3.hdr
deleted file mode 100644
index 36ca45e..0000000
--- a/a/3.hdr
+++ /dev/null
@@ -1,6 +0,0 @@
-Content-Type: text/x-patch;
-	name="0002-dmaengine-omap-dma-Prevent-race-between-vchan_comple.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
-	filename*0="0002-dmaengine-omap-dma-Prevent-race-between-vchan_comple.pa";
-	filename*1="tch"
diff --git a/a/3.txt b/a/3.txt
deleted file mode 100644
index b0a317a..0000000
--- a/a/3.txt
+++ /dev/null
@@ -1,38 +0,0 @@
->From 9618f1f4f068b4272d1034e63a5d6cd501084d2a Mon Sep 17 00:00:00 2001
-From: Peter Ujfalusi <peter.ujfalusi@ti.com>
-Date: Wed, 10 Feb 2016 08:55:44 +0200
-Subject: [RFC 2/3] dmaengine: omap-dma: Prevent race between vchan_complete()
- and terminate_all
-
-Implement protection against vchan_complete() calling the client callback
-after the channel has been terminated.
-
-Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
----
- drivers/dma/omap-dma.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c
-index bfdf29aa3428..1912be81e56d 100644
---- a/drivers/dma/omap-dma.c
-+++ b/drivers/dma/omap-dma.c
-@@ -980,7 +980,9 @@ static int omap_dma_terminate_all(struct dma_chan *chan)
- 	unsigned long flags;
- 	LIST_HEAD(head);
- 
-+	tasklet_disable(&c->vc.task);
- 	spin_lock_irqsave(&c->vc.lock, flags);
-+	vchan_terminate(&c->vc);
- 
- 	/*
- 	 * Stop DMA activity: we assume the callback will not be called
-@@ -1003,6 +1005,7 @@ static int omap_dma_terminate_all(struct dma_chan *chan)
- 	vchan_get_all_descriptors(&c->vc, &head);
- 	spin_unlock_irqrestore(&c->vc.lock, flags);
- 	vchan_dma_desc_free_list(&c->vc, &head);
-+	tasklet_enable(&c->vc.task);
- 
- 	return 0;
- }
--- 
-2.7.1
diff --git a/a/4.hdr b/a/4.hdr
deleted file mode 100644
index d4cf4a9..0000000
--- a/a/4.hdr
+++ /dev/null
@@ -1,6 +0,0 @@
-Content-Type: text/x-patch;
-	name="0003-dmaengine-edma-Prevent-race-between-vchan_complete-a.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
-	filename*0="0003-dmaengine-edma-Prevent-race-between-vchan_complete-a.pa";
-	filename*1="tch"
diff --git a/a/4.txt b/a/4.txt
deleted file mode 100644
index 15a08cf..0000000
--- a/a/4.txt
+++ /dev/null
@@ -1,38 +0,0 @@
->From 061b50dd88f65f352afaee7d4418bbef1a9a5e35 Mon Sep 17 00:00:00 2001
-From: Peter Ujfalusi <peter.ujfalusi@ti.com>
-Date: Wed, 10 Feb 2016 08:56:01 +0200
-Subject: [RFC 3/3] dmaengine: edma: Prevent race between vchan_complete() and
- terminate_all
-
-Implement protection against vchan_complete() calling the client callback
-after the channel has been terminated.
-
-Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
----
- drivers/dma/edma.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
-index 290e1a721c5b..edbf3a5d04b7 100644
---- a/drivers/dma/edma.c
-+++ b/drivers/dma/edma.c
-@@ -842,7 +842,9 @@ static int edma_terminate_all(struct dma_chan *chan)
- 	unsigned long flags;
- 	LIST_HEAD(head);
- 
-+	tasklet_disable(&echan->vchan.task);
- 	spin_lock_irqsave(&echan->vchan.lock, flags);
-+	vchan_terminate(&echan->vchan);
- 
- 	/*
- 	 * Stop DMA activity: we assume the callback will not be called
-@@ -865,6 +867,7 @@ static int edma_terminate_all(struct dma_chan *chan)
- 	vchan_get_all_descriptors(&echan->vchan, &head);
- 	spin_unlock_irqrestore(&echan->vchan.lock, flags);
- 	vchan_dma_desc_free_list(&echan->vchan, &head);
-+	tasklet_enable(&echan->vchan.task);
- 
- 	return 0;
- }
--- 
-2.7.1
diff --git a/a/content_digest b/N1/content_digest
index 6af4adb..fa0838c 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,16 +1,10 @@
  "ref\01455181722-32099-1-git-send-email-peter.ujfalusi@ti.com\0"
  "ref\056BC5759.80000@metafoo.de\0"
- "From\0Peter Ujfalusi <peter.ujfalusi@ti.com>\0"
- "Subject\0Re: [PATCH v2] dmaengine: edma: Implement device_synchronize callback\0"
+ "From\0peter.ujfalusi@ti.com (Peter Ujfalusi)\0"
+ "Subject\0[PATCH v2] dmaengine: edma: Implement device_synchronize callback\0"
  "Date\0Thu, 11 Feb 2016 13:12:20 +0200\0"
- "To\0Lars-Peter Clausen <lars@metafoo.de>"
- " vinod.koul@intel.com\0"
- "Cc\0linux-kernel@vger.kernel.org"
-  dmaengine@vger.kernel.org
-  linux-arm-kernel@lists.infradead.org
-  nsekhar@ti.com
- " linux-omap@vger.kernel.org\0"
- "\01:1\0"
+ "To\0linux-arm-kernel@lists.infradead.org\0"
+ "\00:1\0"
  "b\0"
  "On 02/11/2016 11:41 AM, Lars-Peter Clausen wrote:\n"
  "> On 02/11/2016 10:08 AM, Peter Ujfalusi wrote:\n"
@@ -39,217 +33,27 @@
  "dmaengine_terminate_sync() in drivers will fix the issue.\n"
  "\n"
  "-- \n"
- "P\303\251ter"
- "\01:2\0"
- "fn\00001-dmaengine-virt-dma-Support-for-ignoring-callback-aft.patch\0"
- "b\0"
- ">From 84a010c5732e7cb3339bcb303a6e3f3e6e3ba012 Mon Sep 17 00:00:00 2001\n"
- "From: Peter Ujfalusi <peter.ujfalusi@ti.com>\n"
- "Date: Wed, 10 Feb 2016 08:51:52 +0200\n"
- "Subject: [RFC 1/3] dmaengine: virt-dma: Support for ignoring callback after vc\n"
- " termination\n"
- "\n"
- "This patch provides means to prevent the race condition between vchan\n"
- "completion tasklet and the terminate_all function.\n"
- "The race condition is not easily reproducible, but it has been observed\n"
- "with RT kernel on uniprocessor systems with high rate DMA activity (UART)\n"
- "and it follows this pattern:\n"
- "When terminate_all is called, the tasklet has been already scheduled or\n"
- "it is running to handle the completion of a vdesc. The client driver might\n"
- "be freeing up resources after terminating the transfers but the tasklet\n"
- "when it has a chance to continue to execute will call the provided callback\n"
- "even after the client driver does not expect this to happen.\n"
- "The terminated flag for the vchan itself does not provide enough protection\n"
- "since can still face with a race condition:\n"
- "in this case when the vchan_complete() tests for the terminated flag it will\n"
- "see that the vchan is not terminated, but right after the test it is\n"
- "possible that the terminate thread is set to execute (uniprocessor + RT) and\n"
- "it will free up the resources. After that the vchan_complete() will resume\n"
- "and calls the callback. This will lead to crash.\n"
- "\n"
- "To provide protection, the dma driver need to make sure that the tasklet\n"
- "will not run while we terminate the channel by:\n"
- "\n"
- "static int dmadriver_terminate_all(struct dma_chan *chan)\n"
- "{\n"
- "\tunsigned long flags;\n"
- "\tLIST_HEAD(head);\n"
- "...\n"
- "\ttasklet_disable(&vc.task);\n"
- "\tspin_lock_irqsave(&vc.lock, flags);\n"
- "\tvchan_terminate(&vc);\n"
- "...\n"
- "\tvchan_get_all_descriptors(&vc, &head);\n"
- "\tspin_unlock_irqrestore(&vc.lock, flags);\n"
- "\tvchan_dma_desc_free_list(&vc, &head);\n"
- "\ttasklet_enable(&vc.task);\n"
- "\n"
- "\treturn 0;\n"
- "}\n"
- "\n"
- "Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>\n"
- "---\n"
- " drivers/dma/virt-dma.c |  6 ++++--\n"
- " drivers/dma/virt-dma.h | 13 +++++++++++++\n"
- " 2 files changed, 17 insertions(+), 2 deletions(-)\n"
- "\n"
- "diff --git a/drivers/dma/virt-dma.c b/drivers/dma/virt-dma.c\n"
- "index a35c211857dd..4317d5d3ef1f 100644\n"
- "--- a/drivers/dma/virt-dma.c\n"
- "+++ b/drivers/dma/virt-dma.c\n"
- "@@ -88,11 +88,13 @@ static void vchan_complete(unsigned long arg)\n"
- " \tstruct virt_dma_chan *vc = (struct virt_dma_chan *)arg;\n"
- " \tstruct virt_dma_desc *vd;\n"
- " \tdma_async_tx_callback cb = NULL;\n"
- "+\tbool terminated;\n"
- " \tvoid *cb_data = NULL;\n"
- " \tLIST_HEAD(head);\n"
- " \n"
- " \tspin_lock_irq(&vc->lock);\n"
- " \tlist_splice_tail_init(&vc->desc_completed, &head);\n"
- "+\tterminated = vc->terminated;\n"
- " \tvd = vc->cyclic;\n"
- " \tif (vd) {\n"
- " \t\tvc->cyclic = NULL;\n"
- "@@ -101,7 +103,7 @@ static void vchan_complete(unsigned long arg)\n"
- " \t}\n"
- " \tspin_unlock_irq(&vc->lock);\n"
- " \n"
- "-\tif (cb)\n"
- "+\tif (cb && !terminated)\n"
- " \t\tcb(cb_data);\n"
- " \n"
- " \twhile (!list_empty(&head)) {\n"
- "@@ -115,7 +117,7 @@ static void vchan_complete(unsigned long arg)\n"
- " \t\telse\n"
- " \t\t\tvc->desc_free(vd);\n"
- " \n"
- "-\t\tif (cb)\n"
- "+\t\tif (cb && !terminated)\n"
- " \t\t\tcb(cb_data);\n"
- " \t}\n"
- " }\n"
- "diff --git a/drivers/dma/virt-dma.h b/drivers/dma/virt-dma.h\n"
- "index d9731ca5e262..4df44b1dafbf 100644\n"
- "--- a/drivers/dma/virt-dma.h\n"
- "+++ b/drivers/dma/virt-dma.h\n"
- "@@ -27,6 +27,7 @@ struct virt_dma_chan {\n"
- " \tvoid (*desc_free)(struct virt_dma_desc *);\n"
- " \n"
- " \tspinlock_t lock;\n"
- "+\tbool terminated;\n"
- " \n"
- " \t/* protected by vc.lock */\n"
- " \tstruct list_head desc_allocated;\n"
- "@@ -80,6 +81,7 @@ static inline struct dma_async_tx_descriptor *vchan_tx_prep(struct virt_dma_chan\n"
- " static inline bool vchan_issue_pending(struct virt_dma_chan *vc)\n"
- " {\n"
- " \tlist_splice_tail_init(&vc->desc_submitted, &vc->desc_issued);\n"
- "+\tvc->terminated = false;\n"
- " \treturn !list_empty(&vc->desc_issued);\n"
- " }\n"
- " \n"
- "@@ -116,6 +118,17 @@ static inline void vchan_cyclic_callback(struct virt_dma_desc *vd)\n"
- " }\n"
- " \n"
- " /**\n"
- "+ * vchan_terminate - set the virtual channel as terminated\n"
- "+ * vc: virtual channel to update\n"
- "+ *\n"
- "+ * vc.lock must be held by caller\n"
- "+ */\n"
- "+static inline void vchan_terminate(struct virt_dma_chan *vc)\n"
- "+{\n"
- "+\tvc->terminated = true;\n"
- "+}\n"
- "+\n"
- "+/**\n"
- "  * vchan_next_desc - peek at the next descriptor to be processed\n"
- "  * @vc: virtual channel to obtain descriptor from\n"
- "  *\n"
- "-- \n"
- 2.7.1
- "\01:3\0"
- "fn\00002-dmaengine-omap-dma-Prevent-race-between-vchan_comple.patch\0"
- "b\0"
- ">From 9618f1f4f068b4272d1034e63a5d6cd501084d2a Mon Sep 17 00:00:00 2001\n"
- "From: Peter Ujfalusi <peter.ujfalusi@ti.com>\n"
- "Date: Wed, 10 Feb 2016 08:55:44 +0200\n"
- "Subject: [RFC 2/3] dmaengine: omap-dma: Prevent race between vchan_complete()\n"
- " and terminate_all\n"
- "\n"
- "Implement protection against vchan_complete() calling the client callback\n"
- "after the channel has been terminated.\n"
- "\n"
- "Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>\n"
- "---\n"
- " drivers/dma/omap-dma.c | 3 +++\n"
- " 1 file changed, 3 insertions(+)\n"
- "\n"
- "diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c\n"
- "index bfdf29aa3428..1912be81e56d 100644\n"
- "--- a/drivers/dma/omap-dma.c\n"
- "+++ b/drivers/dma/omap-dma.c\n"
- "@@ -980,7 +980,9 @@ static int omap_dma_terminate_all(struct dma_chan *chan)\n"
- " \tunsigned long flags;\n"
- " \tLIST_HEAD(head);\n"
- " \n"
- "+\ttasklet_disable(&c->vc.task);\n"
- " \tspin_lock_irqsave(&c->vc.lock, flags);\n"
- "+\tvchan_terminate(&c->vc);\n"
- " \n"
- " \t/*\n"
- " \t * Stop DMA activity: we assume the callback will not be called\n"
- "@@ -1003,6 +1005,7 @@ static int omap_dma_terminate_all(struct dma_chan *chan)\n"
- " \tvchan_get_all_descriptors(&c->vc, &head);\n"
- " \tspin_unlock_irqrestore(&c->vc.lock, flags);\n"
- " \tvchan_dma_desc_free_list(&c->vc, &head);\n"
- "+\ttasklet_enable(&c->vc.task);\n"
- " \n"
- " \treturn 0;\n"
- " }\n"
- "-- \n"
- 2.7.1
- "\01:4\0"
- "fn\00003-dmaengine-edma-Prevent-race-between-vchan_complete-a.patch\0"
- "b\0"
- ">From 061b50dd88f65f352afaee7d4418bbef1a9a5e35 Mon Sep 17 00:00:00 2001\n"
- "From: Peter Ujfalusi <peter.ujfalusi@ti.com>\n"
- "Date: Wed, 10 Feb 2016 08:56:01 +0200\n"
- "Subject: [RFC 3/3] dmaengine: edma: Prevent race between vchan_complete() and\n"
- " terminate_all\n"
- "\n"
- "Implement protection against vchan_complete() calling the client callback\n"
- "after the channel has been terminated.\n"
- "\n"
- "Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>\n"
- "---\n"
- " drivers/dma/edma.c | 3 +++\n"
- " 1 file changed, 3 insertions(+)\n"
- "\n"
- "diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c\n"
- "index 290e1a721c5b..edbf3a5d04b7 100644\n"
- "--- a/drivers/dma/edma.c\n"
- "+++ b/drivers/dma/edma.c\n"
- "@@ -842,7 +842,9 @@ static int edma_terminate_all(struct dma_chan *chan)\n"
- " \tunsigned long flags;\n"
- " \tLIST_HEAD(head);\n"
- " \n"
- "+\ttasklet_disable(&echan->vchan.task);\n"
- " \tspin_lock_irqsave(&echan->vchan.lock, flags);\n"
- "+\tvchan_terminate(&echan->vchan);\n"
- " \n"
- " \t/*\n"
- " \t * Stop DMA activity: we assume the callback will not be called\n"
- "@@ -865,6 +867,7 @@ static int edma_terminate_all(struct dma_chan *chan)\n"
- " \tvchan_get_all_descriptors(&echan->vchan, &head);\n"
- " \tspin_unlock_irqrestore(&echan->vchan.lock, flags);\n"
- " \tvchan_dma_desc_free_list(&echan->vchan, &head);\n"
- "+\ttasklet_enable(&echan->vchan.task);\n"
- " \n"
- " \treturn 0;\n"
- " }\n"
- "-- \n"
- 2.7.1
+ "P?ter\n"
+ "-------------- next part --------------\n"
+ "A non-text attachment was scrubbed...\n"
+ "Name: 0001-dmaengine-virt-dma-Support-for-ignoring-callback-aft.patch\n"
+ "Type: text/x-patch\n"
+ "Size: 4081 bytes\n"
+ "Desc: not available\n"
+ "URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160211/26d818cd/attachment-0003.bin>\n"
+ "-------------- next part --------------\n"
+ "A non-text attachment was scrubbed...\n"
+ "Name: 0002-dmaengine-omap-dma-Prevent-race-between-vchan_comple.patch\n"
+ "Type: text/x-patch\n"
+ "Size: 1215 bytes\n"
+ "Desc: not available\n"
+ "URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160211/26d818cd/attachment-0004.bin>\n"
+ "-------------- next part --------------\n"
+ "A non-text attachment was scrubbed...\n"
+ "Name: 0003-dmaengine-edma-Prevent-race-between-vchan_complete-a.patch\n"
+ "Type: text/x-patch\n"
+ "Size: 1230 bytes\n"
+ "Desc: not available\n"
+ URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160211/26d818cd/attachment-0005.bin>
 
-4967f400884d66719c3586e973216763fd166df1050f8d9f955f7abb0bd67cf2
+b9e06664fe4b354b4b3f575cfa0badbe417b9b53c073c2914df6a4f931a1e5bc

diff --git a/a/content_digest b/N2/content_digest
index 6af4adb..858e026 100644
--- a/a/content_digest
+++ b/N2/content_digest
@@ -4,12 +4,12 @@
  "Subject\0Re: [PATCH v2] dmaengine: edma: Implement device_synchronize callback\0"
  "Date\0Thu, 11 Feb 2016 13:12:20 +0200\0"
  "To\0Lars-Peter Clausen <lars@metafoo.de>"
- " vinod.koul@intel.com\0"
- "Cc\0linux-kernel@vger.kernel.org"
-  dmaengine@vger.kernel.org
-  linux-arm-kernel@lists.infradead.org
-  nsekhar@ti.com
- " linux-omap@vger.kernel.org\0"
+ " <vinod.koul@intel.com>\0"
+ "Cc\0<linux-kernel@vger.kernel.org>"
+  <dmaengine@vger.kernel.org>
+  <linux-arm-kernel@lists.infradead.org>
+  <nsekhar@ti.com>
+ " <linux-omap@vger.kernel.org>\0"
  "\01:1\0"
  "b\0"
  "On 02/11/2016 11:41 AM, Lars-Peter Clausen wrote:\n"
@@ -252,4 +252,4 @@
  "-- \n"
  2.7.1
 
-4967f400884d66719c3586e973216763fd166df1050f8d9f955f7abb0bd67cf2
+7833f4b26ed69c33a323fb19272a1a4678e3ccf3987095192ff209ec72791fc1

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.