From 41b9064ec231b1a3010405b0aacb9af0cc2b6314 Mon Sep 17 00:00:00 2001 From: securecrt Date: Wed, 25 Jul 2012 21:08:59 +0800 Subject: [PATCH] msm: kgsl: don't clear gpuaddr when unmapping global mappings Memory mapped through kgsl_mmu_map_global() is supposed to have the same gpu address in all pagetables. And the memdesc will persist beyond the lifetime of any single pagetable. Therefore, memdesc->gpuaddr should not be zeroed for these memdescs. --- drivers/gpu/msm/kgsl_mmu.c | 6 ++++++ drivers/gpu/msm/kgsl_sharedmem.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index f03f4195..d7585ef9 100755 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -592,6 +592,11 @@ kgsl_mmu_unmap(struct kgsl_pagetable *pagetable, memdesc->gpuaddr & KGSL_MMU_ALIGN_MASK, memdesc->size); + /* + * Don't clear the gpuaddr on global mappings because they + * may be in use by other pagetables + */ + if (!(memdesc->priv & KGSL_MEMFLAGS_GLOBAL)) memdesc->gpuaddr = 0; return 0; } @@ -624,6 +629,7 @@ int kgsl_mmu_map_global(struct kgsl_pagetable *pagetable, gpuaddr, memdesc->gpuaddr); goto error_unmap; } + memdesc->priv |= KGSL_MEMFLAGS_GLOBAL; return result; error_unmap: kgsl_mmu_unmap(pagetable, memdesc); diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index 49694f90..16880b24 100755 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -33,6 +33,8 @@ struct kgsl_process_private; /** Set if the memdesc describes cached memory */ #define KGSL_MEMFLAGS_CACHED 0x00000001 +/** Set if the memdesc is mapped into all pagetables */ +#define KGSL_MEMFLAGS_GLOBAL 0x00000002 extern struct kgsl_memdesc_ops kgsl_vmalloc_ops;