Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdb0ac80 authored by Dan Williams's avatar Dan Williams
Browse files

async_tx: make async_tx_run_dependencies() easier to read



* Rename 'next' to 'dep'
* Move the channel switch check inside the loop to simplify
  termination

Acked-by: default avatarIlya Yanok <yanok@emcraft.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 6bfb09a1
Loading
Loading
Loading
Loading
+16 −18
Original line number Diff line number Diff line
@@ -115,34 +115,32 @@ EXPORT_SYMBOL_GPL(dma_wait_for_async_tx);
 *	(start) dependent operations on their target channel
 * @tx: transaction with dependencies
 */
void
async_tx_run_dependencies(struct dma_async_tx_descriptor *tx)
void async_tx_run_dependencies(struct dma_async_tx_descriptor *tx)
{
	struct dma_async_tx_descriptor *next = tx->next;
	struct dma_async_tx_descriptor *dep = tx->next;
	struct dma_async_tx_descriptor *dep_next;
	struct dma_chan *chan;

	if (!next)
	if (!dep)
		return;

	tx->next = NULL;
	chan = next->chan;
	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
	 */
	while (next && next->chan == chan) {
		struct dma_async_tx_descriptor *_next;

		spin_lock_bh(&next->lock);
		next->parent = NULL;
		_next = next->next;
		if (_next && _next->chan == chan)
			next->next = NULL;
		spin_unlock_bh(&next->lock);

		next->tx_submit(next);
		next = _next;
	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);