diff options
author | Christophe JAILLET <christophe.jaillet@wanadoo.fr> | 2017-11-15 01:58:35 -0500 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@linaro.org> | 2017-11-15 02:20:11 -0500 |
commit | 1a5d5c592e902191bfa091ec9169aa43299a7d0f (patch) | |
tree | 3c93a23af068752e0441af9abd36de6bb5618128 | |
parent | 9f2a4342a8bf24c644204311f0cf154f78489b53 (diff) |
remoteproc: qcom: Fix error handling paths in order to avoid memory leaks
In case of error returned by 'q6v5_xfer_mem_ownership', we must free
some resources before returning.
In 'q6v5_mpss_init_image()', add a new label to undo a previous
'dma_alloc_attrs()'.
In 'q6v5_mpss_load()', re-use the already existing error handling code to
undo a previous 'request_firmware()', as already done in the other error
handling paths of the function.
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r-- | drivers/remoteproc/qcom_q6v5_pil.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/remoteproc/qcom_q6v5_pil.c b/drivers/remoteproc/qcom_q6v5_pil.c index a019796c363a..8a3fa2bcc9f6 100644 --- a/drivers/remoteproc/qcom_q6v5_pil.c +++ b/drivers/remoteproc/qcom_q6v5_pil.c | |||
@@ -580,7 +580,8 @@ static int q6v5_mpss_init_image(struct q6v5 *qproc, const struct firmware *fw) | |||
580 | if (ret) { | 580 | if (ret) { |
581 | dev_err(qproc->dev, | 581 | dev_err(qproc->dev, |
582 | "assigning Q6 access to metadata failed: %d\n", ret); | 582 | "assigning Q6 access to metadata failed: %d\n", ret); |
583 | return -EAGAIN; | 583 | ret = -EAGAIN; |
584 | goto free_dma_attrs; | ||
584 | } | 585 | } |
585 | 586 | ||
586 | writel(phys, qproc->rmb_base + RMB_PMI_META_DATA_REG); | 587 | writel(phys, qproc->rmb_base + RMB_PMI_META_DATA_REG); |
@@ -599,6 +600,7 @@ static int q6v5_mpss_init_image(struct q6v5 *qproc, const struct firmware *fw) | |||
599 | dev_warn(qproc->dev, | 600 | dev_warn(qproc->dev, |
600 | "mdt buffer not reclaimed system may become unstable\n"); | 601 | "mdt buffer not reclaimed system may become unstable\n"); |
601 | 602 | ||
603 | free_dma_attrs: | ||
602 | dma_free_attrs(qproc->dev, fw->size, ptr, phys, dma_attrs); | 604 | dma_free_attrs(qproc->dev, fw->size, ptr, phys, dma_attrs); |
603 | 605 | ||
604 | return ret < 0 ? ret : 0; | 606 | return ret < 0 ? ret : 0; |
@@ -712,7 +714,8 @@ static int q6v5_mpss_load(struct q6v5 *qproc) | |||
712 | if (ret) { | 714 | if (ret) { |
713 | dev_err(qproc->dev, | 715 | dev_err(qproc->dev, |
714 | "assigning Q6 access to mpss memory failed: %d\n", ret); | 716 | "assigning Q6 access to mpss memory failed: %d\n", ret); |
715 | return -EAGAIN; | 717 | ret = -EAGAIN; |
718 | goto release_firmware; | ||
716 | } | 719 | } |
717 | 720 | ||
718 | boot_addr = relocate ? qproc->mpss_phys : min_addr; | 721 | boot_addr = relocate ? qproc->mpss_phys : min_addr; |