summaryrefslogtreecommitdiff
path: root/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
diff options
context:
space:
mode:
authorLoren Huang <b02279@freescale.com>2014-01-09 17:35:07 +0800
committerLoren Huang <b02279@freescale.com>2014-01-09 19:04:48 +0800
commit6eaa716127fd8d7699a92cc1c5d6ea649656e628 (patch)
treef431e92d4b8f2c68d4d5cc8c8fc46a94bdcaef45 /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
parent99b0388341e1d0d2f3622a7fa60e0de248413cab (diff)
ENGR00292154-1 gpu:Fix kernel panic when ctrl+c an application
When application is using virtual memory, ctrl+c it will have kernel panic caused by null pointer. The reason is hardware struture already is freed when driver wants to use it. [DATE]16-12-2013 Signed-off-by: Loren Huang <b02279@freescale.com> Acked-by: Shawn Guo
Diffstat (limited to 'drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c')
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
index 3b5dd82cbad0..bd7dc9faa6a0 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
@@ -2181,34 +2181,40 @@ gckVIDMEM_Unlock(
/* No flush required. */
flush = (gceKERNEL_FLUSH) 0;
}
-
- gcmkONERROR(
- gckHARDWARE_Flush(hardware, flush, gcvNULL, &requested));
-
- if (requested != 0)
+ if(hardware)
{
- /* Acquire the command queue. */
- gcmkONERROR(gckCOMMAND_EnterCommit(command, gcvFALSE));
- commitEntered = gcvTRUE;
+ gcmkONERROR(
+ gckHARDWARE_Flush(hardware, flush, gcvNULL, &requested));
- gcmkONERROR(gckCOMMAND_Reserve(
- command, requested, &buffer, &bufferSize
- ));
+ if (requested != 0)
+ {
+ /* Acquire the command queue. */
+ gcmkONERROR(gckCOMMAND_EnterCommit(command, gcvFALSE));
+ commitEntered = gcvTRUE;
- gcmkONERROR(gckHARDWARE_Flush(
- hardware, flush, buffer, &bufferSize
- ));
+ gcmkONERROR(gckCOMMAND_Reserve(
+ command, requested, &buffer, &bufferSize
+ ));
+
+ gcmkONERROR(gckHARDWARE_Flush(
+ hardware, flush, buffer, &bufferSize
+ ));
- /* Mark node as pending. */
+ /* Mark node as pending. */
#ifdef __QNXNTO__
- Node->Virtual.unlockPendings[Kernel->core] = gcvTRUE;
+ Node->Virtual.unlockPendings[Kernel->core] = gcvTRUE;
#endif
- gcmkONERROR(gckCOMMAND_Execute(command, requested));
+ gcmkONERROR(gckCOMMAND_Execute(command, requested));
- /* Release the command queue. */
- gcmkONERROR(gckCOMMAND_ExitCommit(command, gcvFALSE));
- commitEntered = gcvFALSE;
+ /* Release the command queue. */
+ gcmkONERROR(gckCOMMAND_ExitCommit(command, gcvFALSE));
+ commitEntered = gcvFALSE;
+ }
+ }
+ else
+ {
+ gckOS_Print("Hardware already is freed.\n");
}
}