summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXianzhong <b07117@freescale.com>2014-03-18 21:54:26 +0800
committerLoren Huang <b02279@freescale.com>2014-08-15 11:25:00 +0800
commit1b41d9ccb39a443f2fb50241ff8d3752eedfef0d (patch)
tree8a027f782f91aa7b7da120ce5ff12a0879fd4a42
parentee7c962b5ef2840fe5df7ef31c0b27e270eaa96a (diff)
ENGR00309915 [#1087] enhanced video memory mutex
this patch can fix NULL pointer issue in GPU kernel driver with the following log [<7f240438>] (gckEVENT_AddList+0x0/0x810 [galcore]) from [<7f239ebc>] (gckCOMMAND_Commit+0xf28/0x118c [galcore]) [<7f238f94>] (gckCOMMAND_Commit+0x0/0x118c [galcore]) from [<7f2362dc>] (gckKERNEL_Dispatch+0x120c/0x24e4 [galcore]) [<7f2350d0>] (gckKERNEL_Dispatch+0x0/0x24e4 [galcore]) from [<7f222280>] (drv_ioctl+0x390/0x540 [galcore]) [<7f221ef0>] (drv_ioctl+0x0/0x540 [galcore]) from [<800facd0>] (vfs_ioctl+0x30/0x44) The false code is at 0x217bc where the 0-pointer happens (r3 = 0) gcuVIDMEM_NODE_PTR node = (gcuVIDMEM_NODE_PTR)(gcmUINT64_TO_PTR(Record->info.u.FreeVideoMemory.node)); 217b8: e5953028 ldr r3, [r5, #40] ; 0x28 if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) 217bc: e5932000 ldr r2, [r3] 217c0: e5922000 ldr r2, [r2] 217c4: e152000a cmp r2, sl { gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(Event->kernel, Date: Apr 23, 2014 Signed-off-by: Xianzhong <b07117@freescale.com> Acked-by: Jason Liu (cherry picked from commit fcde214d8c793d4dd785e47175b5833f1f3f5f1f) (cherry picked from commit 952142648d76fce2663ef649d9f988f1b7809815) (cherry picked from commit 9d7b33678f1f944f75644e958c3ceeb7f2e4bac9)
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c14
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h8
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c5
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c2
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c2
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c5
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c127
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h3
8 files changed, 70 insertions, 96 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 879d467e3620..8cee145f1c15 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -165,6 +165,8 @@ gckKERNEL_Construct(
kernel->dvfs = gcvNULL;
#endif
+ kernel->vidmemMutex = gcvNULL;
+
/* Initialize the gckKERNEL object. */
kernel->object.type = gcvOBJ_KERNEL;
kernel->os = Os;
@@ -297,6 +299,9 @@ gckKERNEL_Construct(
gcmkONERROR(gckOS_CreateSyncTimeline(Os, &kernel->timeline));
#endif
+ /* Construct a video memory mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Os, &kernel->vidmemMutex));
+
/* Return pointer to the gckKERNEL object. */
*Kernel = kernel;
@@ -518,6 +523,8 @@ 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;
@@ -767,7 +774,7 @@ _AllocateMemory_Retry:
{
gckOS_Print("gpu virtual memory 0x%x cannot be allocated in force contiguous request!\n", physAddr);
- gcmkONERROR(gckVIDMEM_Free(node));
+ gcmkONERROR(gckVIDMEM_Free(Kernel, node));
node = gcvNULL;
}
@@ -797,7 +804,8 @@ _AllocateMemory_Retry:
if (gcmIS_SUCCESS(status))
{
/* Allocate memory. */
- status = gckVIDMEM_AllocateLinear(videoMemory,
+ status = gckVIDMEM_AllocateLinear(Kernel,
+ videoMemory,
Bytes,
Alignment,
Type,
@@ -1251,7 +1259,7 @@ gckKERNEL_Dispatch(
#endif
/* Free video memory. */
gcmkONERROR(
- gckVIDMEM_Free(node));
+ gckVIDMEM_Free(Kernel, node));
gcmkONERROR(
gckKERNEL_RemoveProcessDB(Kernel,
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
index d7ff9cf16372..769479843436 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
@@ -453,6 +453,8 @@ struct _gckKERNEL
#if gcdANDROID_NATIVE_FENCE_SYNC
gctHANDLE timeline;
#endif
+
+ gctPOINTER vidmemMutex;
};
struct _FrequencyHistory
@@ -766,9 +768,6 @@ typedef union _gcuVIDMEM_NODE
/* Actual physical address */
gctUINT32 addresses[gcdMAX_GPU_COUNT];
- /* Mutex. */
- gctPOINTER mutex;
-
/* Locked counter. */
gctINT32 lockeds[gcdMAX_GPU_COUNT];
@@ -824,9 +823,6 @@ struct _gckVIDMEM
/* Allocation threshold. */
gctSIZE_T threshold;
- /* The heap mutex. */
- gctPOINTER mutex;
-
#if gcdUSE_VIDMEM_PER_PID
/* The Pid this VidMem belongs to. */
gctUINT32 pid;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c
index ce2c18a102b6..ae12dffba3e6 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c
@@ -1060,6 +1060,7 @@ _AllocateLinear(
/* Free the command buffer. */
gcmkCHECK_STATUS(gckVIDMEM_Free(
+ Command->kernel->kernel,
node
));
}
@@ -1082,7 +1083,7 @@ _FreeLinear(
gcmkERR_BREAK(gckVIDMEM_Unlock(Kernel->kernel, Node, gcvSURF_TYPE_UNKNOWN, gcvNULL));
/* Free the linear buffer. */
- gcmkERR_BREAK(gckVIDMEM_Free(Node));
+ gcmkERR_BREAK(gckVIDMEM_Free(Kernel->kernel, Node));
}
while (gcvFALSE);
@@ -1676,7 +1677,7 @@ _TaskFreeVideoMemory(
= (gcsTASK_FREE_VIDEO_MEMORY_PTR) TaskHeader->task;
/* Free video memory. */
- gcmkERR_BREAK(gckVIDMEM_Free(gcmUINT64_TO_PTR(task->node)));
+ gcmkERR_BREAK(gckVIDMEM_Free(Command->kernel->kernel, gcmUINT64_TO_PTR(task->node)));
/* Update the reference counter. */
TaskHeader->container->referenceCount -= 1;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
index b181f55ec55e..c175067fd05f 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
@@ -1199,7 +1199,7 @@ gckKERNEL_DestroyProcessDB(
{
case gcvDB_VIDEO_MEMORY:
/* Free the video memory. */
- status = gckVIDMEM_Free(gcmUINT64_TO_PTR(record->data));
+ status = gckVIDMEM_Free(Kernel, gcmUINT64_TO_PTR(record->data));
gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
"DB: VIDEO_MEMORY 0x%x (status=%d)",
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
index 01f71d8e4176..aa066063e586 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
@@ -2280,7 +2280,7 @@ gckEVENT_Notify(
/* Free video memory. */
status =
- gckVIDMEM_Free(node);
+ gckVIDMEM_Free(Event->kernel, node);
break;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
index d7b8e0873252..c1f37172d069 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
@@ -308,7 +308,8 @@ gckKERNEL_AllocateLinearMemory(
if(*Pool == gcvPOOL_SYSTEM)
Type |= gcvSURF_VG;
/* Allocate memory. */
- status = gckVIDMEM_AllocateLinear(videoMemory,
+ status = gckVIDMEM_AllocateLinear(Kernel,
+ videoMemory,
Bytes,
Alignment,
Type,
@@ -599,7 +600,7 @@ gceSTATUS gckVGKERNEL_Dispatch(
#endif /* __QNXNTO__ */
/* Free video memory. */
- gcmkERR_BREAK(gckVIDMEM_Free(
+ gcmkERR_BREAK(gckVIDMEM_Free(Kernel,
node
));
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
index 5699996125cd..740006b4d5a1 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
@@ -250,8 +250,6 @@ gckVIDMEM_ConstructVirtual(
node->Virtual.lockKernels[i] = gcvNULL;
}
- node->Virtual.mutex = gcvNULL;
-
gcmkONERROR(gckOS_GetProcessID(&node->Virtual.processID));
#ifdef __QNXNTO__
@@ -267,10 +265,6 @@ gckVIDMEM_ConstructVirtual(
gcmkONERROR(gckOS_ZeroMemory(&node->Virtual.sharedInfo, gcmSIZEOF(gcsVIDMEM_NODE_SHARED_INFO)));
- /* Create the mutex. */
- gcmkONERROR(
- gckOS_CreateMutex(os, &node->Virtual.mutex));
-
/* Allocate the virtual memory. */
gcmkONERROR(
gckOS_AllocatePagedMemoryEx(os,
@@ -303,12 +297,6 @@ OnError:
/* Roll back. */
if (node != gcvNULL)
{
- if (node->Virtual.mutex != gcvNULL)
- {
- /* Destroy the mutex. */
- gcmkVERIFY_OK(gckOS_DeleteMutex(os, node->Virtual.mutex));
- }
-
/* Free the structure. */
gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
}
@@ -361,9 +349,6 @@ gckVIDMEM_DestroyVirtual(
}
#endif
- /* Delete the mutex. */
- gcmkVERIFY_OK(gckOS_DeleteMutex(os, Node->Virtual.mutex));
-
for (i = 0; i < gcdMAX_GPU_COUNT; i++)
{
if (Node->Virtual.pageTables[i] != gcvNULL)
@@ -465,7 +450,6 @@ gckVIDMEM_Construct(
memory->bytes = Bytes;
memory->freeBytes = Bytes;
memory->threshold = Threshold;
- memory->mutex = gcvNULL;
#if gcdUSE_VIDMEM_PER_PID
gcmkONERROR(gckOS_GetProcessID(&memory->pid));
#endif
@@ -602,9 +586,6 @@ gckVIDMEM_Construct(
"[GALCORE] TILE_STATUS: bank %d",
memory->mapping[gcvSURF_TILE_STATUS]);
- /* Allocate the mutex. */
- gcmkONERROR(gckOS_CreateMutex(Os, &memory->mutex));
-
/* Return pointer to the gckVIDMEM object. */
*Memory = memory;
@@ -616,12 +597,6 @@ OnError:
/* Roll back. */
if (memory != gcvNULL)
{
- if (memory->mutex != gcvNULL)
- {
- /* Delete the mutex. */
- gcmkVERIFY_OK(gckOS_DeleteMutex(Os, memory->mutex));
- }
-
for (i = 0; i < banks; ++i)
{
/* Free the heap. */
@@ -688,9 +663,6 @@ gckVIDMEM_Destroy(
}
}
- /* Free the mutex. */
- gcmkVERIFY_OK(gckOS_DeleteMutex(Memory->os, Memory->mutex));
-
/* Mark the object as unknown. */
Memory->object.type = gcvOBJ_UNKNOWN;
@@ -742,6 +714,7 @@ gckVIDMEM_Destroy(
*/
gceSTATUS
gckVIDMEM_Allocate(
+ IN gckKERNEL Kernel,
IN gckVIDMEM Memory,
IN gctUINT Width,
IN gctUINT Height,
@@ -773,7 +746,7 @@ gckVIDMEM_Allocate(
/* Allocate through linear function. */
gcmkONERROR(
- gckVIDMEM_AllocateLinear(Memory, bytes, Alignment, Type, Node));
+ gckVIDMEM_AllocateLinear(Kernel, Memory, bytes, Alignment, Type, Node));
/* Success. */
gcmkFOOTER_ARG("*Node=0x%x", *Node);
@@ -989,6 +962,7 @@ OnError:
*/
gceSTATUS
gckVIDMEM_AllocateLinear(
+ IN gckKERNEL Kernel,
IN gckVIDMEM Memory,
IN gctSIZE_T Bytes,
IN gctUINT32 Alignment,
@@ -1016,7 +990,7 @@ gckVIDMEM_AllocateLinear(
gcmkVERIFY_ARGUMENT(Type < gcvSURF_NUM_TYPES);
/* Acquire the mutex. */
- gcmkONERROR(gckOS_AcquireMutex(Memory->os, Memory->mutex, gcvINFINITE));
+ gcmkONERROR(gckOS_AcquireMutex(Memory->os, Kernel->vidmemMutex, gcvINFINITE));
acquired = gcvTRUE;
#if !gcdUSE_VIDMEM_PER_PID
@@ -1203,7 +1177,7 @@ gckVIDMEM_AllocateLinear(
#endif
/* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Memory->mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Kernel->vidmemMutex));
/* Return the pointer to the node. */
*Node = node;
@@ -1220,7 +1194,7 @@ OnError:
if (acquired)
{
/* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Memory->mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Kernel->vidmemMutex));
}
/* Return the status. */
@@ -1245,6 +1219,7 @@ OnError:
*/
gceSTATUS
gckVIDMEM_Free(
+ IN gckKERNEL Kernel,
IN gcuVIDMEM_NODE_PTR Node
)
{
@@ -1252,13 +1227,17 @@ gckVIDMEM_Free(
gckKERNEL kernel = gcvNULL;
gckVIDMEM memory = gcvNULL;
gcuVIDMEM_NODE_PTR node;
- gctBOOL mutexAcquired = gcvFALSE;
gckOS os = gcvNULL;
gctBOOL acquired = gcvFALSE;
gctINT32 i, totalLocked;
gcmkHEADER_ARG("Node=0x%x", Node);
+ /* Acquire the mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Kernel->os, Kernel->vidmemMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
/* Verify the arguments. */
if ((Node == gcvNULL)
|| (Node->VidMem.memory == gcvNULL)
@@ -1277,6 +1256,9 @@ gckVIDMEM_Free(
/* Client still has a lock, defer free op 'till when lock reaches 0. */
Node->VidMem.freePending = gcvTRUE;
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
+ acquired = gcvFALSE;
+
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
"Node 0x%x is locked (%d)... deferring free.",
Node, Node->VidMem.locked);
@@ -1288,12 +1270,6 @@ gckVIDMEM_Free(
/* Extract pointer to gckVIDMEM object owning the node. */
memory = Node->VidMem.memory;
- /* Acquire the mutex. */
- gcmkONERROR(
- gckOS_AcquireMutex(memory->os, memory->mutex, gcvINFINITE));
-
- mutexAcquired = gcvTRUE;
-
#ifdef __QNXNTO__
#if !gcdUSE_VIDMEM_PER_PID
/* Reset. */
@@ -1370,7 +1346,7 @@ gckVIDMEM_Free(
}
/* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(memory->os, memory->mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
"Node 0x%x is freed.",
@@ -1393,12 +1369,6 @@ gckVIDMEM_Free(
os = kernel->os;
gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
- /* Grab the mutex. */
- gcmkONERROR(
- gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE));
-
- acquired = gcvTRUE;
-
for (i = 0, totalLocked = 0; i < gcdMAX_GPU_COUNT; i++)
{
totalLocked += Node->Virtual.lockeds[i];
@@ -1412,8 +1382,6 @@ gckVIDMEM_Free(
/* Set Flag */
Node->Virtual.freed = gcvTRUE;
-
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
}
else
{
@@ -1422,28 +1390,20 @@ gckVIDMEM_Free(
Node->Virtual.physical,
Node->Virtual.bytes));
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
-
/* Destroy the gcuVIDMEM_NODE union. */
gcmkVERIFY_OK(gckVIDMEM_DestroyVirtual(Node));
}
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
+
/* Success. */
gcmkFOOTER_NO();
return gcvSTATUS_OK;
OnError:
- if (mutexAcquired)
- {
- /* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(
- memory->os, memory->mutex
- ));
- }
-
if (acquired)
{
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
}
/* Return the status. */
@@ -1684,6 +1644,10 @@ gckVIDMEM_Lock(
/* Verify the arguments. */
gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vidmemMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
if ((Node == gcvNULL)
|| (Node->VidMem.memory == gcvNULL)
)
@@ -1745,10 +1709,6 @@ gckVIDMEM_Lock(
os = Node->Virtual.kernel->os;
gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
- /* Grab the mutex. */
- gcmkONERROR(gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE));
- acquired = gcvTRUE;
-
#if gcdPAGED_MEMORY_CACHEABLE
/* Force video memory cacheable. */
Cacheable = gcvTRUE;
@@ -1868,11 +1828,11 @@ gckVIDMEM_Lock(
/* Return hardware address. */
*Address = Node->Virtual.addresses[Kernel->core];
-
- /* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
}
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
+
/* Success. */
gcmkFOOTER_ARG("*Address=%08x", *Address);
return gcvSTATUS_OK;
@@ -1918,7 +1878,7 @@ OnError:
if (acquired)
{
/* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
}
/* Return the status. */
@@ -1976,6 +1936,11 @@ gckVIDMEM_Unlock(
gcmkHEADER_ARG("Node=0x%x Type=%d *Asynchroneous=%d",
Node, Type, gcmOPT_VALUE(Asynchroneous));
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vidmemMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+
/* Verify the arguments. */
if ((Node == gcvNULL)
|| (Node->VidMem.memory == gcvNULL)
@@ -2032,7 +1997,11 @@ gckVIDMEM_Unlock(
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
"Deferred-freeing Node 0x%x.",
Node);
- gcmkONERROR(gckVIDMEM_Free(Node));
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
+ acquired = gcvFALSE;
+
+ gcmkONERROR(gckVIDMEM_Free(Kernel, Node));
}
}
@@ -2052,12 +2021,6 @@ gckVIDMEM_Unlock(
os = Kernel->os;
gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
- /* Grab the mutex. */
- gcmkONERROR(
- gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE));
-
- acquired = gcvTRUE;
-
if (Asynchroneous == gcvNULL)
{
if (Node->Virtual.lockeds[Kernel->core] == 0)
@@ -2119,14 +2082,14 @@ gckVIDMEM_Unlock(
Node->Virtual.physical,
Node->Virtual.bytes));
+ /* Destroy the gcuVIDMEM_NODE union. */
+ gcmkVERIFY_OK(gckVIDMEM_DestroyVirtual(Node));
+
/* Release mutex before node is destroyed */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
acquired = gcvFALSE;
- /* Destroy the gcuVIDMEM_NODE union. */
- gcmkVERIFY_OK(gckVIDMEM_DestroyVirtual(Node));
-
/* Node has been destroyed, so we should not touch it any more */
gcmkFOOTER();
return gcvSTATUS_OK;
@@ -2234,10 +2197,12 @@ gckVIDMEM_Unlock(
/* Schedule the surface to be unlocked. */
*Asynchroneous = gcvTRUE;
}
+ }
+ if (acquired)
+ {
/* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
-
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
acquired = gcvFALSE;
}
@@ -2255,7 +2220,7 @@ OnError:
if (acquired)
{
/* Release the mutex. */
- gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex));
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex));
}
/* Return the status. */
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 63d5dad3a75a..71321d6ba164 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
@@ -1574,6 +1574,7 @@ gckVIDMEM_Destroy(
/* Allocate rectangular memory. */
gceSTATUS
gckVIDMEM_Allocate(
+ IN gckKERNEL Kernel,
IN gckVIDMEM Memory,
IN gctUINT Width,
IN gctUINT Height,
@@ -1587,6 +1588,7 @@ gckVIDMEM_Allocate(
/* Allocate linear memory. */
gceSTATUS
gckVIDMEM_AllocateLinear(
+ IN gckKERNEL Kernel,
IN gckVIDMEM Memory,
IN gctSIZE_T Bytes,
IN gctUINT32 Alignment,
@@ -1597,6 +1599,7 @@ gckVIDMEM_AllocateLinear(
/* Free memory. */
gceSTATUS
gckVIDMEM_Free(
+ IN gckKERNEL Kernel,
IN gcuVIDMEM_NODE_PTR Node
);