aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2016-01-25 06:41:05 -0500
committerLucas Stach <l.stach@pengutronix.de>2016-01-26 12:53:59 -0500
commit45d16a6d94580cd3c6baed69b5fe441ece599fc4 (patch)
treecf7346bbbd87f39608ef54b221a055df67a25499
parent602eb48966d7b7f7e64dca8d9ea2842d83bfae73 (diff)
drm/etnaviv: fix memory leak in IOMMU init path
Plug in error handling to free any allocated ressources in the IOMMU init path. Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 7b511ad9f54b..a33162cf4f4c 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -596,10 +596,9 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
596 goto fail; 596 goto fail;
597 } 597 }
598 598
599 /* TODO: we will leak here memory - fix it! */
600
601 gpu->mmu = etnaviv_iommu_new(gpu, iommu, version); 599 gpu->mmu = etnaviv_iommu_new(gpu, iommu, version);
602 if (!gpu->mmu) { 600 if (!gpu->mmu) {
601 iommu_domain_free(iommu);
603 ret = -ENOMEM; 602 ret = -ENOMEM;
604 goto fail; 603 goto fail;
605 } 604 }
@@ -609,7 +608,7 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
609 if (!gpu->buffer) { 608 if (!gpu->buffer) {
610 ret = -ENOMEM; 609 ret = -ENOMEM;
611 dev_err(gpu->dev, "could not create command buffer\n"); 610 dev_err(gpu->dev, "could not create command buffer\n");
612 goto fail; 611 goto destroy_iommu;
613 } 612 }
614 if (gpu->buffer->paddr - gpu->memory_base > 0x80000000) { 613 if (gpu->buffer->paddr - gpu->memory_base > 0x80000000) {
615 ret = -EINVAL; 614 ret = -EINVAL;
@@ -639,6 +638,9 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
639free_buffer: 638free_buffer:
640 etnaviv_gpu_cmdbuf_free(gpu->buffer); 639 etnaviv_gpu_cmdbuf_free(gpu->buffer);
641 gpu->buffer = NULL; 640 gpu->buffer = NULL;
641destroy_iommu:
642 etnaviv_iommu_destroy(gpu->mmu);
643 gpu->mmu = NULL;
642fail: 644fail:
643 pm_runtime_mark_last_busy(gpu->dev); 645 pm_runtime_mark_last_busy(gpu->dev);
644 pm_runtime_put_autosuspend(gpu->dev); 646 pm_runtime_put_autosuspend(gpu->dev);