diff options
| author | Dan Williams <dan.j.williams@intel.com> | 2009-01-05 17:14:31 -0700 | 
|---|---|---|
| committer | Dan Williams <dan.j.williams@intel.com> | 2009-01-05 18:10:19 -0700 | 
| commit | 07f2211e4fbce6990722d78c4f04225da9c0e9cf (patch) | |
| tree | 51934e20a334e93c8c399d2e6375f264551e9bc3 /crypto | |
| parent | 28405d8d9ce05f5bd869ef8b48da5086f9527d73 (diff) | |
| download | linux-07f2211e4fbce6990722d78c4f04225da9c0e9cf.tar.bz2 | |
dmaengine: remove dependency on async_tx
async_tx.ko is a consumer of dma channels.  A circular dependency arises
if modules in drivers/dma rely on common code in async_tx.ko.  It
prevents either module from being unloaded.
Move dma_wait_for_async_tx and async_tx_run_dependencies to dmaeninge.o
where they should have been from the beginning.
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'crypto')
| -rw-r--r-- | crypto/async_tx/async_tx.c | 75 | 
1 files changed, 0 insertions, 75 deletions
| diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c index dcbf1be149f3..8cfac182165d 100644 --- a/crypto/async_tx/async_tx.c +++ b/crypto/async_tx/async_tx.c @@ -72,81 +72,6 @@ void async_tx_issue_pending_all(void)  }  EXPORT_SYMBOL_GPL(async_tx_issue_pending_all); -/* dma_wait_for_async_tx - spin wait for a transcation to complete - * @tx: transaction to wait on - */ -enum dma_status -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; - -	/* poll through the dependency chain, return when tx is complete */ -	do { -		iter = tx; - -		/* find the root of the unsubmitted dependency chain */ -		do { -			parent = iter->parent; -			if (!parent) -				break; -			else -				iter = parent; -		} while (parent); - -		/* there is a small window for ->parent == NULL and -		 * ->cookie == -EBUSY -		 */ -		while (iter->cookie == -EBUSY) -			cpu_relax(); - -		status = dma_sync_wait(iter->chan, iter->cookie); -	} while (status == DMA_IN_PROGRESS || (iter != tx)); - -	return status; -} -EXPORT_SYMBOL_GPL(dma_wait_for_async_tx); - -/* async_tx_run_dependencies - helper routine for dma drivers to process - *	(start) dependent operations on their target channel - * @tx: transaction with dependencies - */ -void async_tx_run_dependencies(struct dma_async_tx_descriptor *tx) -{ -	struct dma_async_tx_descriptor *dep = tx->next; -	struct dma_async_tx_descriptor *dep_next; -	struct dma_chan *chan; - -	if (!dep) -		return; - -	chan = dep->chan; - -	/* keep submitting up until a channel switch is detected -	 * in that case we will be called again as a result of -	 * processing the interrupt from async_tx_channel_switch -	 */ -	for (; dep; dep = dep_next) { -		spin_lock_bh(&dep->lock); -		dep->parent = NULL; -		dep_next = dep->next; -		if (dep_next && dep_next->chan == chan) -			dep->next = NULL; /* ->next will be submitted */ -		else -			dep_next = NULL; /* submit current dep and terminate */ -		spin_unlock_bh(&dep->lock); - -		dep->tx_submit(dep); -	} - -	chan->device->device_issue_pending(chan); -} -EXPORT_SYMBOL_GPL(async_tx_run_dependencies); -  static void  free_dma_chan_ref(struct rcu_head *rcu)  { |