From 1e7ba4c76d5a6a1b89f3af3bc418391596adc3f3 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Thu, 2 Nov 2017 15:41:37 -0700 Subject: gpu: nvgpu: Use a callback to free struct gk20a struct gk20a is now part of nvgpu_os_linux in Linux builds. gk20a.c still frees struct gk20a by kfree(struct gk20a *), which is wrong. Create a new function pointer in struct gk20a for freeing the structure and call kfree(struct nvgpu_os_linux *) instead. JIRA NVGPU-259 Change-Id: I412ee993002cb2a42f0db015fc676de43418ec2f Signed-off-by: Terje Bergstrom Reviewed-on: https://git-master.nvidia.com/r/1591012 GVS: Gerrit_Virtual_Submit Reviewed-by: Deepak Nibade Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/driver_common.c | 12 ++++++++++++ drivers/gpu/nvgpu/common/linux/driver_common.h | 22 ++++++++++++++++++++++ drivers/gpu/nvgpu/common/linux/module.c | 2 ++ drivers/gpu/nvgpu/common/linux/pci.c | 2 ++ drivers/gpu/nvgpu/gk20a/gk20a.c | 3 ++- drivers/gpu/nvgpu/gk20a/gk20a.h | 1 + drivers/gpu/nvgpu/vgpu/vgpu.c | 2 ++ 7 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/nvgpu/common/linux/driver_common.h (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index b7444a9e..0dd0d62c 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.c @@ -274,3 +274,15 @@ void nvgpu_wait_for_deferred_interrupts(struct gk20a *g) atomic_read(&l->sw_irq_nonstall_last_handled)) <= 0, 0); } + +static void nvgpu_free_gk20a(struct gk20a *g) +{ + struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); + + kfree(l); +} + +void nvgpu_init_gk20a(struct gk20a *g) +{ + g->free = nvgpu_free_gk20a; +} diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.h b/drivers/gpu/nvgpu/common/linux/driver_common.h new file mode 100644 index 00000000..6f42f775 --- /dev/null +++ b/drivers/gpu/nvgpu/common/linux/driver_common.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef NVGPU_LINUX_DRIVER_COMMON +#define NVGPU_LINUX_DRIVER_COMMON + +void nvgpu_init_gk20a(struct gk20a *g); + +#endif diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index 4aff6a2d..4841b032 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -53,6 +53,7 @@ #include "cde_gm20b.h" #include "cde_gp10b.h" #include "ctxsw_trace.h" +#include "driver_common.h" #define CLASS_NAME "nvidia-gpu" /* TODO: Change to e.g. "nvidia-gpu%s" once we have symlinks in place. */ @@ -1027,6 +1028,7 @@ static int gk20a_probe(struct platform_device *dev) } gk20a = &l->g; + nvgpu_init_gk20a(gk20a); set_gk20a(dev, gk20a); l->dev = &dev->dev; gk20a->log_mask = NVGPU_DEFAULT_DBG_MASK; diff --git a/drivers/gpu/nvgpu/common/linux/pci.c b/drivers/gpu/nvgpu/common/linux/pci.c index 118567e5..296d0a7c 100644 --- a/drivers/gpu/nvgpu/common/linux/pci.c +++ b/drivers/gpu/nvgpu/common/linux/pci.c @@ -37,6 +37,7 @@ #endif #include "os_linux.h" +#include "driver_common.h" #define PCI_INTERFACE_NAME "card-%s%%s" @@ -457,6 +458,7 @@ static int nvgpu_pci_probe(struct pci_dev *pdev, } g = &l->g; + nvgpu_init_gk20a(g); nvgpu_kmem_init(g); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index f71a51fd..e8db9d2c 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -518,7 +518,8 @@ static void gk20a_free_cb(struct nvgpu_ref *refcount) if (g->remove_support) g->remove_support(g); - kfree(g); + if (g->free) + g->free(g); } /** diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 7e7d9688..5b22d1a4 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1070,6 +1070,7 @@ struct nvgpu_gpu_params { }; struct gk20a { + void (*free)(struct gk20a *g); struct nvgpu_nvhost_dev *nvhost_dev; /* diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index 93f9eaf4..2cd99e8c 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c @@ -47,6 +47,7 @@ #include "common/linux/os_linux.h" #include "common/linux/ioctl.h" #include "common/linux/scale.h" +#include "common/linux/driver_common.h" #ifdef CONFIG_TEGRA_19x_GPU #include @@ -657,6 +658,7 @@ int vgpu_probe(struct platform_device *pdev) return -ENOMEM; } gk20a = &l->g; + nvgpu_init_gk20a(gk20a); nvgpu_kmem_init(gk20a); -- cgit v1.2.2