From: xxm Date: Mon, 21 Jul 2014 01:03:35 +0000 (+0800) Subject: rockchip:midgard: X-Git-Tag: firefly_0821_release~4964 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d62934e924c080f0452fe0ec9c59048432ccb231;p=firefly-linux-kernel-4.4.55.git rockchip:midgard: 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 --- diff --git a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c index 399ac942339b..064f762d261b 100755 --- a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c +++ b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c @@ -38,6 +38,7 @@ #include #endif /* CONFIG_KDS */ +#include #include #include #include @@ -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) { diff --git a/drivers/gpu/arm/midgard/mali_kbase_jd.c b/drivers/gpu/arm/midgard/mali_kbase_jd.c index 8d2c0ba2f7f6..4a7d8ab4852e 100755 --- a/drivers/gpu/arm/midgard/mali_kbase_jd.c +++ b/drivers/gpu/arm/midgard/mali_kbase_jd.c @@ -31,7 +31,7 @@ #include #endif /* CONFIG_UMP */ #include - +#include #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 */