diff options
author | Loren Huang <b02279@freescale.com> | 2014-01-09 17:35:07 +0800 |
---|---|---|
committer | Loren Huang <b02279@freescale.com> | 2014-01-09 19:04:48 +0800 |
commit | 6eaa716127fd8d7699a92cc1c5d6ea649656e628 (patch) | |
tree | f431e92d4b8f2c68d4d5cc8c8fc46a94bdcaef45 /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c | |
parent | 99b0388341e1d0d2f3622a7fa60e0de248413cab (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.c | 46 |
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"); } } |