diff options
author | Xianzhong <b07117@freescale.com> | 2013-08-23 20:36:45 +0800 |
---|---|---|
committer | Loren HUANG <b02279@freescale.com> | 2013-10-31 13:59:27 +0800 |
commit | 9ac20c8edb8660c19198d278bf74183ef4bab5d3 (patch) | |
tree | 50fa401b493aad6b39d63cb6a81dfc01d81364af /drivers/mxc/gpu-viv | |
parent | 02adf1cf9cdd823c18bbafbd78fabc2b5cb81d5d (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
Diffstat (limited to 'drivers/mxc/gpu-viv')
-rw-r--r-- | drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | 18 | ||||
-rw-r--r-- | drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h | 1 |
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 331c73f8d3ad..7f41087f62a1 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 @@ -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(¤t->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; } 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; |