diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5495-drm-amd-display-fix-memory-leak-in-resource-pools.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5495-drm-amd-display-fix-memory-leak-in-resource-pools.patch | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5495-drm-amd-display-fix-memory-leak-in-resource-pools.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5495-drm-amd-display-fix-memory-leak-in-resource-pools.patch new file mode 100644 index 00000000..2ee5d22f --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5495-drm-amd-display-fix-memory-leak-in-resource-pools.patch @@ -0,0 +1,126 @@ +From 9f9c10ebe22771d2ff803f39589146aafdda4b23 Mon Sep 17 00:00:00 2001 +From: Jun Lei <Jun.Lei@amd.com> +Date: Tue, 18 Sep 2018 09:38:20 -0400 +Subject: [PATCH 5495/5725] drm/amd/display: fix memory leak in resource pools + +[why] +ddc engines were recently changed to be independently tracked +from pipe count. the change was reflected in resource constructor +but not in destructor. this manifests as a memory leak when +pipe harvesting is enabled, since not all constructed ddc engines +are freed + +[how] +make destructor symmetric with constructor for all dcX_resource + +Signed-off-by: Jun Lei <Jun.Lei@amd.com> +Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c | 2 ++ + drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c | 2 ++ + drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c | 8 +++++--- + drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c | 2 ++ + drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c | 2 ++ + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 2 ++ + 6 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +index 5b75460..14754a8 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +@@ -689,7 +689,9 @@ static void destruct(struct dce110_resource_pool *pool) + kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i])); + pool->base.timing_generators[i] = NULL; + } ++ } + ++ for (i = 0; i < pool->base.res_cap->num_ddc; i++) { + if (pool->base.engines[i] != NULL) + dce110_engine_destroy(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +index 4607a6a..de19093 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +@@ -719,7 +719,9 @@ static void destruct(struct dce110_resource_pool *pool) + kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i])); + pool->base.timing_generators[i] = NULL; + } ++ } + ++ for (i = 0; i < pool->base.res_cap->num_ddc; i++) { + if (pool->base.engines[i] != NULL) + dce110_engine_destroy(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { +diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +index 8b5a269..3ce79c2 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +@@ -693,9 +693,6 @@ static void destruct(struct dce110_resource_pool *pool) + if (pool->base.opps[i] != NULL) + dce110_opp_destroy(&pool->base.opps[i]); + +- if (pool->base.engines[i] != NULL) +- dce110_engine_destroy(&pool->base.engines[i]); +- + if (pool->base.transforms[i] != NULL) + dce112_transform_destroy(&pool->base.transforms[i]); + +@@ -711,6 +708,11 @@ static void destruct(struct dce110_resource_pool *pool) + kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i])); + pool->base.timing_generators[i] = NULL; + } ++ } ++ ++ for (i = 0; i < pool->base.res_cap->num_ddc; i++) { ++ if (pool->base.engines[i] != NULL) ++ dce110_engine_destroy(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { + kfree(pool->base.hw_i2cs[i]); + pool->base.hw_i2cs[i] = NULL; +diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +index 53a7a2f..79ab5f9 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +@@ -533,7 +533,9 @@ static void destruct(struct dce110_resource_pool *pool) + kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i])); + pool->base.timing_generators[i] = NULL; + } ++ } + ++ for (i = 0; i < pool->base.res_cap->num_ddc; i++) { + if (pool->base.engines[i] != NULL) + dce110_engine_destroy(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { +diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +index 79e5c5c..d68f951 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +@@ -738,7 +738,9 @@ static void destruct(struct dce110_resource_pool *pool) + kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i])); + pool->base.timing_generators[i] = NULL; + } ++ } + ++ for (i = 0; i < pool->base.res_cap->num_ddc; i++) { + if (pool->base.engines[i] != NULL) + dce110_engine_destroy(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +index d58fbb2..a71453a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +@@ -908,7 +908,9 @@ static void destruct(struct dcn10_resource_pool *pool) + kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i])); + pool->base.timing_generators[i] = NULL; + } ++ } + ++ for (i = 0; i < pool->base.res_cap->num_ddc; i++) { + if (pool->base.engines[i] != NULL) + pool->base.engines[i]->funcs->destroy_engine(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { +-- +2.7.4 + |