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.