gpu: optimize for gckHEAP_Allocate & FindVideoMemoryRecord
author杜坤明 <dkm@rockchip.com>
Mon, 4 Jul 2011 08:02:31 +0000 (16:02 +0800)
committer杜坤明 <dkm@rockchip.com>
Mon, 4 Jul 2011 08:02:31 +0000 (16:02 +0800)
drivers/staging/rk29/vivante/Makefile [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 1bec4a3..02e93fc
@@ -57,7 +57,7 @@ NO_DMA_COHERENT ?= 1
 ENABLE_GPU_CLOCK_BY_DRIVER = 1
 
 # Set this value to 1 if you are using ARM L2 cache.
-ENABLE_ARM_L2_CACHE    = 1
+ENABLE_ARM_L2_CACHE    = 0
 
 # Set this value to 1 if you are using DOVE board.
 CONFIG_DOVE_GPU = 0
old mode 100644 (file)
new mode 100755 (executable)
index 9260467..e33db7b
 #   define gcdGPU_TIMEOUT                   0
 #endif
 
-
+/*=============================== add by dkm ==================================== */
 /*
     dkm: gcdENABLE_AUTO_FREQ
     0: ¹Ø±Õ×Ô¶¯µ÷Ƶ
 */
 #define gcdENABLE_LONG_IDLE_POWEROFF        1
 
+
+/*
+    dkm: gcdOPTIMIZE_HEAP_SAMESIZE
+
+    optimize for heap alloc when alloc the same size 
+*/
+#define gcdOPTIMIZE_HEAP_SAMESIZE              1
+
 #endif /* __gc_hal_options_h_ */
 
old mode 100644 (file)
new mode 100755 (executable)
index cb5fb91..47cf745
@@ -473,6 +473,11 @@ gckHEAP_Allocate(
        gctSIZE_T bytes;
        gcskNODE_PTR node, used, prevFree = gcvNULL;
        gctPOINTER memory = gcvNULL;
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+    static gctSIZE_T lastbytes = 0;
+    static gcskNODE_PTR lastnode = gcvNULL;
+#endif
 
        gcmkHEADER_ARG("Heap=0x%x Bytes=%lu", Heap, Bytes);
 
@@ -511,12 +516,19 @@ gckHEAP_Allocate(
                                if (bytes < heap->size)
                                {
                                        prevFree = gcvNULL;
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE         
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+                    if(bytes>=lastbytes && heap==Heap->heap && lastnode) {
+                        node = lastnode;
+                    } else {
+                        node = heap->freeList;
+                    }
 
                                        /* Walk the chain of free nodes. */
-                                       for (node = heap->freeList;
-                                                node != gcvNULL;
-                                                node = node->next
-                                       )
+                                       for ( ; node != gcvNULL; node = node->next)
+#else
+                    for (node = heap->freeList; node != gcvNULL; node = node->next)
+#endif
                                        {
                                                gcmkASSERT(node->next != gcdIN_USE);
 
@@ -672,6 +684,11 @@ UseNode:
                /* Adjust the number of free bytes. */
                node->bytes -= bytes;
                gcmkASSERT(node->bytes >= gcmSIZEOF(gcskNODE));
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+        lastbytes = bytes;
+        lastnode = node;
+#endif
        }
        else
        {
@@ -684,7 +701,11 @@ UseNode:
                {
                        prevFree->next = node->next;
                }
-
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+        lastbytes = bytes;
+        lastnode = node->next;
+#endif
                /* Consume the entire free node. */
                used  = (gcskNODE_PTR) node;
                bytes = node->bytes;
old mode 100644 (file)
new mode 100755 (executable)
index 9518f76..7b6bc77
@@ -6126,10 +6126,10 @@ CreateMemoryRecord(
     mr->u.Memory.physical   = Physical;
     mr->u.Memory.logical    = Logical;
 
-    mr->prev            = List->prev;
-    mr->next            = List;
-    List->prev->next    = mr;
-    List->prev          = mr;
+    mr->prev            = List;
+    mr->next            = List->next;
+    List->next->prev    = mr;
+    List->next          = mr;
 
     MEMORY_UNLOCK(Os);
 
@@ -6228,10 +6228,10 @@ CreateVideoMemoryRecord(
             ? private->maxTotalAllocatedMem : private->totalAllocatedMem;
 #endif
 
-    mr->prev            = List->prev;
-    mr->next            = List;
-    List->prev->next    = mr;
-    List->prev          = mr;
+    mr->prev            = List;
+    mr->next            = List->next;
+    List->next->prev    = mr;
+    List->next          = mr;
 
     MEMORY_UNLOCK(Os);