diff options
author | Rajesh Kemisetti <rajeshk@codeaurora.org> | 2016-03-15 16:31:25 +0530 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-25 16:04:15 -0700 |
commit | 7f89d09b40d4ae7b0367469ec0781d64ed5b3dc8 (patch) | |
tree | 49a35f9f2cf12a1d13cfbfc346b03dffb47a59d5 /drivers | |
parent | 1f99478c12c44dcf64a52164e833bfddf95a42e2 (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')
-rw-r--r-- | drivers/gpu/msm/kgsl.c | 14 |
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 */ |