MGS-2302-1 [#imx-225] fix the gpu1 hang with independent mode
authorXianzhong <xianzhong.li@nxp.com>
Mon, 17 Oct 2016 07:58:52 +0000 (15:58 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 19:52:33 +0000 (14:52 -0500)
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 <xianzhong.li@nxp.com>
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c

index 28d017b..77612a9 100644 (file)
@@ -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;
         }
index c0720a4..21937fb 100644 (file)
@@ -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();