summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXianzhong <xianzhong.li@nxp.com>2016-10-17 15:58:52 +0800
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit398b6424427d12f49e8c7f319a3d8b9a7731573a (patch)
tree146aef75ea746d542f61d3c47ad29950a9110e17
parent4799d35e5fdaacf9caf8c08193e1cfdee376406a (diff)
MGS-2302-1 [#imx-225] fix the gpu1 hang with independent mode
when the app is killed, the kernel driver will free database from the gpu0. if the app is running on gpu1, its database may be freed by gpu0 unexpectely. need check kernel pointer in record to prevent the incorrect database free. Date: Oct 17, 2016 Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c6
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c14
2 files changed, 15 insertions, 5 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
index 28d017b3526d..77612a9f4d1a 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -3222,11 +3222,11 @@ gckKERNEL_AttachProcessEx(
}
else
{
+ /* Clean up the process database. */
+ gckKERNEL_DestroyProcessDB(Kernel, PID);
+
if (Kernel->dbCreated)
{
- /* Clean up the process database. */
- gcmkONERROR(gckKERNEL_DestroyProcessDB(Kernel, PID));
-
/* Save the last know process ID. */
Kernel->db->lastProcessID = PID;
}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
index c0720a43b549..21937fb59122 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
@@ -1250,6 +1250,7 @@ gckKERNEL_DestroyProcessDB(
gckKERNEL kernel = Kernel;
gctUINT32 handle;
gctUINT32 i;
+ gctBOOL deleteDB = gcvTRUE;
gcmkHEADER_ARG("Kernel=0x%x ProcessID=%d", Kernel, ProcessID);
@@ -1299,6 +1300,12 @@ gckKERNEL_DestroyProcessDB(
/* Next next record. */
next = record->next;
+ if (record->kernel != Kernel)
+ {
+ deleteDB = gcvFALSE;
+ continue;
+ }
+
/* Dispatch on record type. */
switch (record->type)
{
@@ -1514,8 +1521,11 @@ gckKERNEL_DestroyProcessDB(
}
- /* Delete the database. */
- gcmkONERROR(gckKERNEL_DeleteDatabase(Kernel, database));
+ if (deleteDB == gcvTRUE)
+ {
+ /* Delete the database. */
+ gcmkONERROR(gckKERNEL_DeleteDatabase(Kernel, database));
+ }
/* Success. */
gcmkFOOTER_NO();