Skip to content

Commit fcde214

Browse files
author
Xianzhong
committed
ENGR00309915 [torvalds#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, torvalds#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 <[email protected]> Acked-by: Jason Liu
1 parent 888c79a commit fcde214

File tree

8 files changed

+70
-96
lines changed

8 files changed

+70
-96
lines changed

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ gckKERNEL_Construct(
165165
kernel->dvfs = gcvNULL;
166166
#endif
167167

168+
kernel->vidmemMutex = gcvNULL;
169+
168170
/* Initialize the gckKERNEL object. */
169171
kernel->object.type = gcvOBJ_KERNEL;
170172
kernel->os = Os;
@@ -297,6 +299,9 @@ gckKERNEL_Construct(
297299
gcmkONERROR(gckOS_CreateSyncTimeline(Os, &kernel->timeline));
298300
#endif
299301

302+
/* Construct a video memory mutex. */
303+
gcmkONERROR(gckOS_CreateMutex(Os, &kernel->vidmemMutex));
304+
300305
/* Return pointer to the gckKERNEL object. */
301306
*Kernel = kernel;
302307

@@ -518,6 +523,8 @@ gckKERNEL_Destroy(
518523
gcmkVERIFY_OK(gckOS_DestroySyncTimeline(Kernel->os, Kernel->timeline));
519524
#endif
520525

526+
gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->vidmemMutex));
527+
521528
/* Mark the gckKERNEL object as unknown. */
522529
Kernel->object.type = gcvOBJ_UNKNOWN;
523530

@@ -767,7 +774,7 @@ _AllocateMemory(
767774
{
768775
gckOS_Print("gpu virtual memory 0x%x cannot be allocated for external use !\n", physAddr);
769776

770-
gcmkONERROR(gckVIDMEM_Free(node));
777+
gcmkONERROR(gckVIDMEM_Free(Kernel, node));
771778

772779
node = gcvNULL;
773780
}
@@ -797,7 +804,8 @@ _AllocateMemory(
797804
if (gcmIS_SUCCESS(status))
798805
{
799806
/* Allocate memory. */
800-
status = gckVIDMEM_AllocateLinear(videoMemory,
807+
status = gckVIDMEM_AllocateLinear(Kernel,
808+
videoMemory,
801809
Bytes,
802810
Alignment,
803811
Type,
@@ -1251,7 +1259,7 @@ gckKERNEL_Dispatch(
12511259
#endif
12521260
/* Free video memory. */
12531261
gcmkONERROR(
1254-
gckVIDMEM_Free(node));
1262+
gckVIDMEM_Free(Kernel, node));
12551263

12561264
gcmkONERROR(
12571265
gckKERNEL_RemoveProcessDB(Kernel,

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,8 @@ struct _gckKERNEL
453453
#if gcdANDROID_NATIVE_FENCE_SYNC
454454
gctHANDLE timeline;
455455
#endif
456+
457+
gctPOINTER vidmemMutex;
456458
};
457459

458460
struct _FrequencyHistory
@@ -766,9 +768,6 @@ typedef union _gcuVIDMEM_NODE
766768
/* Actual physical address */
767769
gctUINT32 addresses[gcdMAX_GPU_COUNT];
768770

769-
/* Mutex. */
770-
gctPOINTER mutex;
771-
772771
/* Locked counter. */
773772
gctINT32 lockeds[gcdMAX_GPU_COUNT];
774773

@@ -824,9 +823,6 @@ struct _gckVIDMEM
824823
/* Allocation threshold. */
825824
gctSIZE_T threshold;
826825

827-
/* The heap mutex. */
828-
gctPOINTER mutex;
829-
830826
#if gcdUSE_VIDMEM_PER_PID
831827
/* The Pid this VidMem belongs to. */
832828
gctUINT32 pid;

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,7 @@ _AllocateLinear(
10601060

10611061
/* Free the command buffer. */
10621062
gcmkCHECK_STATUS(gckVIDMEM_Free(
1063+
Command->kernel->kernel,
10631064
node
10641065
));
10651066
}
@@ -1082,7 +1083,7 @@ _FreeLinear(
10821083
gcmkERR_BREAK(gckVIDMEM_Unlock(Kernel->kernel, Node, gcvSURF_TYPE_UNKNOWN, gcvNULL));
10831084

10841085
/* Free the linear buffer. */
1085-
gcmkERR_BREAK(gckVIDMEM_Free(Node));
1086+
gcmkERR_BREAK(gckVIDMEM_Free(Kernel->kernel, Node));
10861087
}
10871088
while (gcvFALSE);
10881089

@@ -1676,7 +1677,7 @@ _TaskFreeVideoMemory(
16761677
= (gcsTASK_FREE_VIDEO_MEMORY_PTR) TaskHeader->task;
16771678

16781679
/* Free video memory. */
1679-
gcmkERR_BREAK(gckVIDMEM_Free(gcmUINT64_TO_PTR(task->node)));
1680+
gcmkERR_BREAK(gckVIDMEM_Free(Command->kernel->kernel, gcmUINT64_TO_PTR(task->node)));
16801681

16811682
/* Update the reference counter. */
16821683
TaskHeader->container->referenceCount -= 1;

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ gckKERNEL_DestroyProcessDB(
11991199
{
12001200
case gcvDB_VIDEO_MEMORY:
12011201
/* Free the video memory. */
1202-
status = gckVIDMEM_Free(gcmUINT64_TO_PTR(record->data));
1202+
status = gckVIDMEM_Free(Kernel, gcmUINT64_TO_PTR(record->data));
12031203

12041204
gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
12051205
"DB: VIDEO_MEMORY 0x%x (status=%d)",

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2280,7 +2280,7 @@ gckEVENT_Notify(
22802280

22812281
/* Free video memory. */
22822282
status =
2283-
gckVIDMEM_Free(node);
2283+
gckVIDMEM_Free(Event->kernel, node);
22842284

22852285
break;
22862286

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ gckKERNEL_AllocateLinearMemory(
306306
if (status == gcvSTATUS_OK)
307307
{
308308
/* Allocate memory. */
309-
status = gckVIDMEM_AllocateLinear(videoMemory,
309+
status = gckVIDMEM_AllocateLinear(Kernel,
310+
videoMemory,
310311
Bytes,
311312
Alignment,
312313
Type,
@@ -597,7 +598,7 @@ gceSTATUS gckVGKERNEL_Dispatch(
597598
#endif /* __QNXNTO__ */
598599

599600
/* Free video memory. */
600-
gcmkERR_BREAK(gckVIDMEM_Free(
601+
gcmkERR_BREAK(gckVIDMEM_Free(Kernel,
601602
node
602603
));
603604

0 commit comments

Comments
 (0)