From 7f89d09b40d4ae7b0367469ec0781d64ed5b3dc8 Mon Sep 17 00:00:00 2001 From: Rajesh Kemisetti Date: Tue, 15 Mar 2016 16:31:25 +0530 Subject: msm: kgsl: Attach mem_entry once we have valid GPU address kgsl_mem_entry_attach_process() adds new entry to the mem_idr list without really having a valid GPU address. This new entry can be used by other thread with GPUADDR_IN_MEMDESC() and destroy it. Get GPU address first and then add it to the mem_idr list. Change-Id: I4d66cec754ca5315df3c9fe09644f55596c3c33c Signed-off-by: Rajesh Kemisetti --- drivers/gpu/msm/kgsl.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'drivers/gpu/msm') diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 17344a0e9e28..e3e0b0973410 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -410,6 +410,11 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, ret = kgsl_process_private_get(process); if (!ret) return -EBADF; + + ret = kgsl_mem_entry_track_gpuaddr(process, entry); + if (ret) + goto err_put_proc_priv; + idr_preload(GFP_KERNEL); spin_lock(&process->mem_lock); id = idr_alloc(&process->mem_idr, entry, 1, 0, GFP_NOWAIT); @@ -418,20 +423,13 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, if (id < 0) { ret = id; + kgsl_mem_entry_untrack_gpuaddr(process, entry); goto err_put_proc_priv; } entry->id = id; entry->priv = process; - ret = kgsl_mem_entry_track_gpuaddr(process, entry); - if (ret) { - spin_lock(&process->mem_lock); - idr_remove(&process->mem_idr, entry->id); - spin_unlock(&process->mem_lock); - goto err_put_proc_priv; - } - /* map the memory after unlocking if gpuaddr has been assigned */ if (entry->memdesc.gpuaddr) { /* if a secured buffer map it to secure global pagetable */ -- cgit v1.2.3