vpu_mem: fix bug of wrong region merge when free memory
author陈恒明 <chm@rock-chips.com>
Mon, 6 Dec 2010 01:58:15 +0000 (17:58 -0800)
committer陈恒明 <chm@rock-chips.com>
Mon, 6 Dec 2010 02:40:04 +0000 (18:40 -0800)
arch/arm/mach-rk29/vpu_mem.c

index 1206c848f385c8788fc1c99f42502107c82415d9..7f15732d11d3df40df50d10d6cfbfc3111c75a33 100644 (file)
@@ -32,7 +32,7 @@
 #define VPU_MEM_MAX_ORDER 128\r
 #define VPU_MEM_MIN_ALLOC PAGE_SIZE\r
 \r
-#define VPU_MEM_DEBUG 0\r
+#define VPU_MEM_DEBUG 1\r
 \r
 #define VPU_MEM_SPLIT_ALLOC             0\r
 #define VPU_MEM_SPLIT_LINK              1\r
@@ -71,7 +71,7 @@ struct vpu_mem_region_node {
 #define NODE_REGION_INDEX(p)     (p->region.index)\r
 #define NODE_REGION_REFC(p)      (p->region.ref_count)\r
 \r
-#define VPU_MEM_DEBUG_MSGS 0\r
+#define VPU_MEM_DEBUG_MSGS 1\r
 #if VPU_MEM_DEBUG_MSGS\r
 #define DLOG(fmt,args...) \\r
        do { printk(KERN_INFO "[%s:%s:%d] "fmt, __FILE__, __func__, __LINE__, \\r
@@ -337,15 +337,22 @@ static int region_merge(struct list_head *node)
         region_unset(index,  pfn_index);\r
         region_unset(target, pfn_target);\r
         region_set(index, pfn_total);\r
+    } else {\r
+        DLOG("region_merge: merge NEXT_INDEX fail index_avail(%d) = %d IS_FREE = %d\n",\r
+            target, index_avail(target), VPU_MEM_IS_FREE(target));\r
     }\r
-    target = VPU_MEM_LAST_INDEX(index);\r
+    target = index - 1;\r
     if (index_avail(target) && VPU_MEM_IS_FREE(target)) {\r
         int pfn_target  = VPU_MEM_PFN(target);\r
         int pfn_index   = VPU_MEM_PFN(index);\r
         int pfn_total   = pfn_target + pfn_index;\r
+        target = VPU_MEM_LAST_INDEX(index);\r
         region_unset(index,  pfn_index);\r
         region_unset(target, pfn_target);\r
-        region_set(index, pfn_total);\r
+        region_set(target, pfn_total);\r
+    } else {\r
+        DLOG("region_merge: merge LAST_INDEX fail index_avail(%d) = %d IS_FREE = %d\n",\r
+            target, index_avail(target), VPU_MEM_IS_FREE(target));\r
     }\r
     return 0;\r
 }\r