rockchip:midgard:
authorxxm <xxm@rock-chips.com>
Mon, 21 Jul 2014 01:03:35 +0000 (09:03 +0800)
committerxxm <xxm@rock-chips.com>
Mon, 21 Jul 2014 01:08:15 +0000 (09:08 +0800)
1.use list_for_each_safe instead of list_for_each ,_list_del may happend in
  interrupt,may cause the unsync operation

2.add msleep(500) in the entry of kbase_release to postpone the operation when app quit

3.version to 0x06

drivers/gpu/arm/midgard/mali_kbase_core_linux.c
drivers/gpu/arm/midgard/mali_kbase_jd.c

index 399ac942339b6e9dbd0e9bb9f213706b93e19e8f..064f762d261bc1b75ec9a5401acd81e7dcbc03e8 100755 (executable)
@@ -38,6 +38,7 @@
 #include <linux/syscalls.h>
 #endif /* CONFIG_KDS */
 
+#include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/poll.h>
@@ -85,7 +86,7 @@ EXPORT_SYMBOL(shared_kernel_test_data);
 #endif /* MALI_UNIT_TEST */
 
 #define KBASE_DRV_NAME "mali"
-#define ROCKCHIP_VERSION 5
+#define ROCKCHIP_VERSION 6
 static const char kbase_drv_name[] = KBASE_DRV_NAME;
 
 static int kbase_dev_nr;
@@ -922,6 +923,8 @@ static int kbase_release(struct inode *inode, struct file *filp)
        struct kbase_device *kbdev = kctx->kbdev;
        kbasep_kctx_list_element *element, *tmp;
        mali_bool found_element = MALI_FALSE;
+       
+       msleep(500);
 
        mutex_lock(&kbdev->kctx_list_lock);
        list_for_each_entry_safe(element, tmp, &kbdev->kctx_list, link) {
index 8d2c0ba2f7f6d6089d68d6fdba81de569d4f2f80..4a7d8ab4852e25275589e9bba098a2f46364d045 100755 (executable)
@@ -31,7 +31,7 @@
 #include <linux/ump.h>
 #endif                         /* CONFIG_UMP */
 #include <linux/random.h>
-
+#include <linux/delay.h>
 #define beenthere(kctx,f, a...)  dev_dbg(kctx->kbdev->dev, "%s:" f, __func__, ##a)
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
@@ -1449,7 +1449,7 @@ static enum hrtimer_restart zap_timeout_callback(struct hrtimer *timer)
 void kbase_jd_zap_context(kbase_context *kctx)
 {
        kbase_jd_atom *katom;
-       struct list_head *entry;
+       struct list_head *entry,*entry1;
        kbase_device *kbdev;
        zap_reset_data reset_data;
        unsigned long flags;
@@ -1457,19 +1457,23 @@ void kbase_jd_zap_context(kbase_context *kctx)
        KBASE_DEBUG_ASSERT(kctx);
 
        kbdev = kctx->kbdev;
-
+       
        KBASE_TRACE_ADD(kbdev, JD_ZAP_CONTEXT, kctx, NULL, 0u, 0u);
        kbase_job_zap_context(kctx);
 
        mutex_lock(&kctx->jctx.lock);
-
        /*
         * While holding the kbase_jd_context lock clean up jobs which are known to kbase but are
         * queued outside the job scheduler.
         */
-
-       list_for_each( entry, &kctx->waiting_soft_jobs) {
+       /*
+       pr_info("%p,%p,%p\n",&kctx->waiting_soft_jobs,kctx->waiting_soft_jobs.next,kctx->waiting_soft_jobs.prev);
+       */
+       list_for_each_safe(entry, entry1, &kctx->waiting_soft_jobs) {
+               if(entry == (struct list_head *)LIST_POISON1)
+                       pr_err("@get to the end of a list, error happened in list somewhere@\n");
                katom = list_entry(entry, kbase_jd_atom, dep_item[0]);
+                       pr_info("katom = %p,&katom->dep_item[0] = %p\n",katom,&katom->dep_item[0]);
                kbase_cancel_soft_job(katom);
        }
        /* kctx->waiting_soft_jobs is not valid after this point */