From 398b6424427d12f49e8c7f319a3d8b9a7731573a Mon Sep 17 00:00:00 2001 From: Xianzhong Date: Mon, 17 Oct 2016 15:58:52 +0800 Subject: 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 --- drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | 6 +++--- drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'drivers/mxc/gpu-viv/hal') 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(); -- cgit v1.2.3