]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00292154-1 gpu:Fix kernel panic when ctrl+c an application
authorLoren Huang <b02279@freescale.com>
Thu, 9 Jan 2014 09:35:07 +0000 (17:35 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Mon, 16 Jun 2014 16:09:36 +0000 (18:09 +0200)
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
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c

index 3b5dd82cbad0e9d8899d19b7da91762a9c3c99d0..bd7dc9faa6a0966419a4691ec8ce6a5a11b9dd2d 100644 (file)
@@ -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");
                 }
             }