summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXianzhong <b07117@freescale.com>2014-08-05 15:44:52 +0800
committerLoren Huang <b02279@freescale.com>2014-08-15 11:25:06 +0800
commit9ba72a169cfe3a3dad6aac3b0ab389afea6e5af5 (patch)
treece48a0f0c57a6d83d5c1dbb7f48db4877c1e510c
parentd40445b3f91c142ba5aacd5f23d45e831cc763f9 (diff)
ENGR00325794 [#1087] fix video memory mutex sharing issue
the root cause is video memory mutex is not global variable, it will cause video memory managment problem with mixed 2D/3D/VG. kernel panic with multiple instances stress test running glesx_viv.sh. Date: Jul 31, 2014 Signed-off-by: Xianzhong <b07117@freescale.com> Acked-by: Jason Liu (cherry picked from commit 02bdc91149f077aba37c790aca1e59041d473f71) (cherry picked from commit 26c25e084b4137bf19aaa20e5075bb3c16096066) (cherry picked from commit 94c683128e5b7b2d2aaa92de28a32500926b0fad)
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c4
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h7
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c21
3 files changed, 29 insertions, 3 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
index cdfb4b70ecbd..6a1d79e7ae16 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -300,7 +300,7 @@ gckKERNEL_Construct(
#endif
/* Construct a video memory mutex. */
- gcmkONERROR(gckOS_CreateMutex(Os, &kernel->vidmemMutex));
+ gcmkONERROR(gckOS_GetVideoMemoryMutex(Os, &kernel->vidmemMutex));
/* Return pointer to the gckKERNEL object. */
*Kernel = kernel;
@@ -523,8 +523,6 @@ gckKERNEL_Destroy(
gcmkVERIFY_OK(gckOS_DestroySyncTimeline(Kernel->os, Kernel->timeline));
#endif
- gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->vidmemMutex));
-
/* Mark the gckKERNEL object as unknown. */
Kernel->object.type = gcvOBJ_UNKNOWN;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
index 71321d6ba164..6445a41e7810 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
@@ -1497,6 +1497,13 @@ gckOS_StopTimer(
IN gctPOINTER Timer
);
+/* Get the global video memory mutex. */
+gceSTATUS
+gckOS_GetVideoMemoryMutex(
+ IN gckOS Os,
+ OUT gctPOINTER *Mutex
+ );
+
/******************************************************************************\
********************************* gckHEAP Object ********************************
\******************************************************************************/
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 79ca3e3b17ff..b15399271f8d 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
@@ -214,6 +214,8 @@ struct _gckOS
int gpu_clk_on[3];
struct mutex gpu_clk_mutex;
+
+ gctPOINTER vidmemMutex;
};
typedef struct _gcsSIGNAL * gcsSIGNAL_PTR;
@@ -1116,6 +1118,8 @@ gckOS_Construct(
mutex_init(&os->gpu_clk_mutex);
+ gcmkONERROR(gckOS_CreateMutex(os, &os->vidmemMutex));
+
/* Return pointer to the gckOS object. */
*Os = os;
@@ -1239,6 +1243,9 @@ gckOS_Destroy(
/* Destroy debug lock mutex. */
gcmkVERIFY_OK(gckOS_DeleteMutex(Os, Os->debugLock));
+ /* Destroy video memory mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, Os->vidmemMutex));
+
/* Wait for all works done. */
flush_workqueue(Os->workqueue);
@@ -8733,6 +8740,20 @@ gckOS_GetProcessNameByPid(
return gcvSTATUS_OK;
}
+gceSTATUS
+gckOS_GetVideoMemoryMutex(
+ IN gckOS Os,
+ OUT gctPOINTER *Mutex
+ )
+{
+ gcmkHEADER_ARG("Mutex=x%X", Mutex);
+
+ *Mutex = Os->vidmemMutex;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
#if gcdANDROID_NATIVE_FENCE_SYNC
gceSTATUS