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

Commit 819504f4 authored by Rabin Vincent's avatar Rabin Vincent Committed by Dan Williams
Browse files

DMAENGINE: ste_dma40: fix resource leaks in error paths.



Fix some leaks of allocated descriptors in error paths.

Acked-by: default avatarJonas Aaberg <jonas.aberg@stericsson.com>
Signed-off-by: default avatarRabin Vincent <rabin.vincent@stericsson.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@stericsson.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent a2c15fa4
Loading
Loading
Loading
Loading
+13 −4
Original line number Original line Diff line number Diff line
@@ -1728,6 +1728,8 @@ struct dma_async_tx_descriptor *stedma40_memcpy_sg(struct dma_chan *chan,


	return &d40d->txd;
	return &d40d->txd;
err:
err:
	if (d40d)
		d40_desc_free(d40c, d40d);
	spin_unlock_irqrestore(&d40c->lock, flags);
	spin_unlock_irqrestore(&d40c->lock, flags);
	return NULL;
	return NULL;
}
}
@@ -1939,8 +1941,9 @@ static struct dma_async_tx_descriptor *d40_prep_memcpy(struct dma_chan *chan,
err_fill_lli:
err_fill_lli:
	dev_err(&d40c->chan.dev->device,
	dev_err(&d40c->chan.dev->device,
		"[%s] Failed filling in PHY LLI\n", __func__);
		"[%s] Failed filling in PHY LLI\n", __func__);
	d40_pool_lli_free(d40d);
err:
err:
	if (d40d)
		d40_desc_free(d40c, d40d);
	spin_unlock_irqrestore(&d40c->lock, flags);
	spin_unlock_irqrestore(&d40c->lock, flags);
	return NULL;
	return NULL;
}
}
@@ -2079,10 +2082,9 @@ static struct dma_async_tx_descriptor *d40_prep_slave_sg(struct dma_chan *chan,


	spin_lock_irqsave(&d40c->lock, flags);
	spin_lock_irqsave(&d40c->lock, flags);
	d40d = d40_desc_get(d40c);
	d40d = d40_desc_get(d40c);
	spin_unlock_irqrestore(&d40c->lock, flags);


	if (d40d == NULL)
	if (d40d == NULL)
		return NULL;
		goto err;


	if (d40c->log_num != D40_PHY_CHAN)
	if (d40c->log_num != D40_PHY_CHAN)
		err = d40_prep_slave_sg_log(d40d, d40c, sgl, sg_len,
		err = d40_prep_slave_sg_log(d40d, d40c, sgl, sg_len,
@@ -2095,7 +2097,7 @@ static struct dma_async_tx_descriptor *d40_prep_slave_sg(struct dma_chan *chan,
			"[%s] Failed to prepare %s slave sg job: %d\n",
			"[%s] Failed to prepare %s slave sg job: %d\n",
			__func__,
			__func__,
			d40c->log_num != D40_PHY_CHAN ? "log" : "phy", err);
			d40c->log_num != D40_PHY_CHAN ? "log" : "phy", err);
		return NULL;
		goto err;
	}
	}


	d40d->txd.flags = dma_flags;
	d40d->txd.flags = dma_flags;
@@ -2104,7 +2106,14 @@ static struct dma_async_tx_descriptor *d40_prep_slave_sg(struct dma_chan *chan,


	d40d->txd.tx_submit = d40_tx_submit;
	d40d->txd.tx_submit = d40_tx_submit;


	spin_unlock_irqrestore(&d40c->lock, flags);
	return &d40d->txd;
	return &d40d->txd;

err:
	if (d40d)
		d40_desc_free(d40c, d40d);
	spin_unlock_irqrestore(&d40c->lock, flags);
	return NULL;
}
}


static enum dma_status d40_tx_status(struct dma_chan *chan,
static enum dma_status d40_tx_status(struct dma_chan *chan,