Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6247cdc2cd334dad0ea5428245a7d8f4b075f21e
Commit:     6247cdc2cd334dad0ea5428245a7d8f4b075f21e
Parent:     c5d2b9f444b8d9f5ad7c5e583686c119ba3a9ba7
Author:     Dan Williams <[EMAIL PROTECTED]>
AuthorDate: Fri Sep 21 13:27:04 2007 -0700
Committer:  Dan Williams <[EMAIL PROTECTED]>
CommitDate: Mon Sep 24 10:26:26 2007 -0700

    async_tx: fix dma_wait_for_async_tx
    
    Fix dma_wait_for_async_tx to not loop forever in the case where a
    dependency chain is longer than two entries.  This condition will not
    happen with current in-kernel drivers, but fix it for future drivers.
    
    Found-by: Saeed Bishara <[EMAIL PROTECTED]>
    Signed-off-by: Dan Williams <[EMAIL PROTECTED]>
---
 crypto/async_tx/async_tx.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c
index 0350071..bc18cbb 100644
--- a/crypto/async_tx/async_tx.c
+++ b/crypto/async_tx/async_tx.c
@@ -80,6 +80,7 @@ dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx)
 {
        enum dma_status status;
        struct dma_async_tx_descriptor *iter;
+       struct dma_async_tx_descriptor *parent;
 
        if (!tx)
                return DMA_SUCCESS;
@@ -87,8 +88,15 @@ dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx)
        /* poll through the dependency chain, return when tx is complete */
        do {
                iter = tx;
-               while (iter->cookie == -EBUSY)
-                       iter = iter->parent;
+
+               /* find the root of the unsubmitted dependency chain */
+               while (iter->cookie == -EBUSY) {
+                       parent = iter->parent;
+                       if (parent && parent->cookie == -EBUSY)
+                               iter = iter->parent;
+                       else
+                               break;
+               }
 
                status = dma_sync_wait(iter->chan, iter->cookie);
        } while (status == DMA_IN_PROGRESS || (iter != tx));
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to