From e1c08484abcf7ab12e986a11c01e193e70a9f95f Mon Sep 17 00:00:00 2001 From: Richard Liu Date: Fri, 25 Oct 2013 16:57:06 +0800 Subject: ENGR00284988 Camera recording kernel crash on WFD source Fix kernel crash issue meet when do 720p Camera recording on WFD source side, the crash is related with timer schedule, fixed by add protection code in gckOS_StartTimer function. Kernel crash log: [] (__bug+0x1c/0x28) from [] (queue_delayed_work_on+0x10c/0x148) [] (queue_delayed_work_on+0x10c/0x148) from [] (gckOS_StartTimer+0x44/0x84) [] (gckOS_StartTimer+0x44/0x84) from [] (gckHARDWARE_SetPowerManagementState+0xa24/0xa5c) [] (gckHARDWARE_SetPowerManagementState+0xa24/0xa5c) from [] (gckOS_Broadcast+0xb8/0xe8) [] (gckOS_Broadcast+0xb8/0xe8) from [] (_TryToIdleGPU+0xd8/0x18c) [] (_TryToIdleGPU+0xd8/0x18c) from [] (gckEVENT_Notify+0x2dc/0x4c8) [] (gckEVENT_Notify+0x2dc/0x4c8) from [] (gckHARDWARE_Interrupt+0x58/0x68) [] (gckHARDWARE_Interrupt+0x58/0x68) from [] (threadRoutine+0x20/0x78) [] (threadRoutine+0x20/0x78) from [] (kthread+0x80/0x88) [] (kthread+0x80/0x88) from [] (kernel_thread_exit+0x0/0x8) Signed-off-by: Richard Liu Acked-by: Jason Liu --- .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 17 +++++++++++++++++ .../mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c index 64929350f567..2d7f629e28d8 100644 --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c @@ -3973,6 +3973,23 @@ gckHARDWARE_SetPowerManagementState( ** if lock holder call gckCOMMAND_Stall() */ gcmkONERROR(gcvSTATUS_INVALID_REQUEST); } +#if gcdPOWEROFF_TIMEOUT + else if(State == gcvPOWER_OFF && timeout == gcvTRUE) + { + /* + ** try to aqcuire the mutex with more milliseconds, + ** flush_delayed_work should be running with timeout, + ** so waiting here will cause deadlock */ + status = gckOS_AcquireMutex(os, Hardware->powerMutex, gcdPOWEROFF_TIMEOUT); + + if (status == gcvSTATUS_TIMEOUT) + { + gckOS_Print("GPU Timer deadlock, exit by timeout!!!!\n"); + + gcmkONERROR(gcvSTATUS_INVALID_REQUEST); + } + } +#endif else { /* Acquire the power mutex. */ diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c index 1afd1332eae5..b7717fca0ec6 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -8432,7 +8432,17 @@ gckOS_StartTimer( if (unlikely(delayed_work_pending(&timer->work))) { - cancel_delayed_work(&timer->work); + if (unlikely(!cancel_delayed_work(&timer->work))) + { + cancel_work_sync(&timer->work.work); + + if (unlikely(delayed_work_pending(&timer->work))) + { + gckOS_Print("gckOS_StartTimer error, the pending worker cannot complete!!!! \n"); + + return gcvSTATUS_INVALID_REQUEST; + } + } } queue_delayed_work(Os->workqueue, &timer->work, msecs_to_jiffies(Delay)); -- cgit v1.2.3