diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2016-01-25 06:41:05 -0500 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2016-01-26 12:53:59 -0500 |
commit | 45d16a6d94580cd3c6baed69b5fe441ece599fc4 (patch) | |
tree | cf7346bbbd87f39608ef54b221a055df67a25499 | |
parent | 602eb48966d7b7f7e64dca8d9ea2842d83bfae73 (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.c | 8 |
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) | |||
639 | free_buffer: | 638 | free_buffer: |
640 | etnaviv_gpu_cmdbuf_free(gpu->buffer); | 639 | etnaviv_gpu_cmdbuf_free(gpu->buffer); |
641 | gpu->buffer = NULL; | 640 | gpu->buffer = NULL; |
641 | destroy_iommu: | ||
642 | etnaviv_iommu_destroy(gpu->mmu); | ||
643 | gpu->mmu = NULL; | ||
642 | fail: | 644 | fail: |
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); |