summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm
diff options
context:
space:
mode:
authorRajesh Kemisetti <rajeshk@codeaurora.org>2016-03-15 16:31:25 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-25 16:04:15 -0700
commit7f89d09b40d4ae7b0367469ec0781d64ed5b3dc8 (patch)
tree49a35f9f2cf12a1d13cfbfc346b03dffb47a59d5 /drivers/gpu/msm
parent1f99478c12c44dcf64a52164e833bfddf95a42e2 (diff)
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 <rajeshk@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm')
-rw-r--r--drivers/gpu/msm/kgsl.c14
1 files changed, 6 insertions, 8 deletions
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 */