]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00274478 fix gpu memory multi-lock failure
authorXianzhong <b07117@freescale.com>
Fri, 23 Aug 2013 12:36:45 +0000 (20:36 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Mon, 16 Jun 2014 16:04:04 +0000 (18:04 +0200)
this issue cause system boot with multi-user switch on JB4.3,

root cause is gpu memory cannot be multi-locked in same process,
gpu memory lock reference is added to allow multi-lock in kernel driver.

Signed-off-by: Xianzhong <b07117@freescale.com>
Acked-by: Jason Liu
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h

index 331c73f8d3adb7c4603020d9ecbaf13d6b53b7ec..7f41087f62a1364c79333f1805ceab7497d7873f 100644 (file)
@@ -375,9 +375,10 @@ _CreateMdlMap(
         return gcvNULL;
     }
 
-    mdlMap->pid     = ProcessID;
-    mdlMap->vmaAddr = gcvNULL;
-    mdlMap->vma     = gcvNULL;
+    mdlMap->pid       = ProcessID;
+    mdlMap->vmaAddr   = gcvNULL;
+    mdlMap->vma       = gcvNULL;
+    mdlMap->reference = 0;
 
     mdlMap->next    = Mdl->maps;
     Mdl->maps       = mdlMap;
@@ -4431,6 +4432,8 @@ gckOS_LockPages(
 
         up_write(&current->mm->mmap_sem);
     }
+
+#if 0
     else
     {
         /* mdlMap->vmaAddr != gcvNULL means current process has already locked this node. */
@@ -4439,6 +4442,7 @@ gckOS_LockPages(
         gcmkFOOTER_ARG("*status=%d, mdlMap->vmaAddr=%x", gcvSTATUS_MEMORY_LOCKED, mdlMap->vmaAddr);
         return gcvSTATUS_MEMORY_LOCKED;
     }
+#endif
 
     /* Convert pointer to MDL. */
     *Logical = mdlMap->vmaAddr;
@@ -4449,6 +4453,9 @@ gckOS_LockPages(
 
     *PageCount = mdl->numPages * (PAGE_SIZE / 4096);
 
+    /* Increase reference count. */
+    mdlMap->reference++;
+
     MEMORY_UNLOCK(Os);
 
     gcmkVERIFY_OK(gckOS_CacheFlush(
@@ -4715,6 +4722,11 @@ gckOS_UnlockPages(
     {
         if ((mdlMap->vmaAddr != gcvNULL) && (_GetProcessID() == mdlMap->pid))
         {
+            if (--mdlMap->reference > 0)
+            {
+                continue;
+            }
+
             _UnmapUserLogical(mdlMap->pid, mdlMap->vmaAddr, mdl->numPages * PAGE_SIZE);
             mdlMap->vmaAddr = gcvNULL;
         }
index 006632c642e269ae0f2a857dfc358840d61cd237..501cf30e9273c368827897b36e006108109ac63d 100644 (file)
@@ -27,6 +27,7 @@ typedef struct _LINUX_MDL_MAP
     gctINT                  pid;
     gctPOINTER              vmaAddr;
     struct vm_area_struct * vma;
+    gctINT                  reference;
     struct _LINUX_MDL_MAP * next;
 }
 LINUX_MDL_MAP;