From 3bc6ea5fbd8e52dc667c16f56c9b57735db79d8e Mon Sep 17 00:00:00 2001 From: Thomas Fleury Date: Thu, 15 Aug 2019 16:40:53 -0400 Subject: [PATCH] gpu: nvgpu: fix nvgpu_remove on nvlink failure In case nvlink initialization failure, some structures are not yet initialized, and attempting to de-initialize them caused some memory faults. Added checks before de-initializing fecs_traces, and perf_pmu and clk_pmu. Bug 200542335 Change-Id: Ib40820b6b5bf356f762112b772a9df533b36b045 Signed-off-by: Thomas Fleury Reviewed-on: https://git-master.nvidia.com/r/2176206 Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-misra GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/gr/fecs_trace.c | 4 ++++ drivers/gpu/nvgpu/common/pmu/pmu_pstate.c | 24 ++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/nvgpu/common/gr/fecs_trace.c b/drivers/gpu/nvgpu/common/gr/fecs_trace.c index f1b049723..bc53604f2 100644 --- a/drivers/gpu/nvgpu/common/gr/fecs_trace.c +++ b/drivers/gpu/nvgpu/common/gr/fecs_trace.c @@ -163,6 +163,10 @@ int nvgpu_gr_fecs_trace_deinit(struct gk20a *g) { struct nvgpu_gr_fecs_trace *trace = g->fecs_trace; + if (trace == NULL) { + return 0; + } + /* * Check if tracer was enabled before attempting to stop the * tracer thread. diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_pstate.c b/drivers/gpu/nvgpu/common/pmu/pmu_pstate.c index 0a70242c2..cf7430379 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_pstate.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_pstate.c @@ -48,15 +48,21 @@ void nvgpu_pmu_pstate_deinit(struct gk20a *g) { pmgr_pmu_free_pmupstate(g); nvgpu_therm_pmu_free_pmupstate(g, g->pmu); - nvgpu_perf_pmu_free_pmupstate(g); - nvgpu_clk_domain_free_pmupstate(g); - nvgpu_clk_prog_free_pmupstate(g); - nvgpu_clk_vf_point_free_pmupstate(g); - nvgpu_clk_freq_domain_free_pmupstate(g); - nvgpu_clk_freq_controller_free_pmupstate(g); - nvgpu_clk_fll_free_pmupstate(g); - nvgpu_clk_vin_free_pmupstate(g); - nvgpu_clk_free_pmupstate(g); + + if (g->perf_pmu != NULL) { + nvgpu_perf_pmu_free_pmupstate(g); + } + + if (g->pmu->clk_pmu != NULL) { + nvgpu_clk_domain_free_pmupstate(g); + nvgpu_clk_prog_free_pmupstate(g); + nvgpu_clk_vf_point_free_pmupstate(g); + nvgpu_clk_freq_domain_free_pmupstate(g); + nvgpu_clk_freq_controller_free_pmupstate(g); + nvgpu_clk_fll_free_pmupstate(g); + nvgpu_clk_vin_free_pmupstate(g); + nvgpu_clk_free_pmupstate(g); + } if (g->ops.clk.mclk_deinit != NULL) { g->ops.clk.mclk_deinit(g);