summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXianzhong <b07117@freescale.com>2013-08-23 20:36:45 +0800
committerLoren HUANG <b02279@freescale.com>2013-09-12 12:26:29 +0800
commit8047c4aee6b386fea11362267479658b746ed16e (patch)
tree70a5b945fb04305ef0393bad7439e66cf54f39c6
parent1552b7ebb5d26ec8be4a3ab7cefbc115dc58efcd (diff)
ENGR00274478 fix gpu memory multi-lock failure
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
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c18
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h1
2 files changed, 16 insertions, 3 deletions
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 87400388a134..dc79ad249fbe 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
@@ -341,9 +341,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;
@@ -4342,6 +4343,8 @@ gckOS_LockPages(
up_write(&current->mm->mmap_sem);
}
+
+#if 0
else
{
/* mdlMap->vmaAddr != gcvNULL means current process has already locked this node. */
@@ -4350,6 +4353,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;
@@ -4360,6 +4364,9 @@ gckOS_LockPages(
*PageCount = mdl->numPages * (PAGE_SIZE / 4096);
+ /* Increase reference count. */
+ mdlMap->reference++;
+
MEMORY_UNLOCK(Os);
gcmkVERIFY_OK(gckOS_CacheFlush(
@@ -4626,6 +4633,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;
}
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
index 006632c642e2..501cf30e9273 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
@@ -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;