aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-12 08:11:22 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-12 08:11:22 -0700
commitb2314a8050f2fff96206c207ae887ac8d8770a49 (patch)
tree2763a3beb0daa183aabe76a1512873d2520d4018
parentdeb165610a0ffb5244e3af67157794dc897ebbfd (diff)
parentd2e5633aa1e724713360621080dfccb39c232d19 (diff)
Merge "msm: kgsl: Defer adding the mem entry to a process"
-rw-r--r--drivers/gpu/msm/kgsl.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index fcb462a5b5a24..8ef2887483c6c 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -388,6 +388,17 @@ kgsl_mem_entry_untrack_gpuaddr(struct kgsl_process_private *process,
kgsl_mmu_put_gpuaddr(pagetable, &entry->memdesc);
}
+/* Commit the entry to the process so it can be accessed by other operations */
+static void kgsl_mem_entry_commit_process(struct kgsl_mem_entry *entry)
+{
+ if (!entry)
+ return;
+
+ spin_lock(&entry->priv->mem_lock);
+ idr_replace(&entry->priv->mem_idr, entry, entry->id);
+ spin_unlock(&entry->priv->mem_lock);
+}
+
/**
* kgsl_mem_entry_attach_process - Attach a mem_entry to its owner process
* @entry: the memory entry
@@ -413,7 +424,8 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry,
return -EBADF;
idr_preload(GFP_KERNEL);
spin_lock(&process->mem_lock);
- id = idr_alloc(&process->mem_idr, entry, 1, 0, GFP_NOWAIT);
+ /* Allocate the ID but don't attach the pointer just yet */
+ id = idr_alloc(&process->mem_idr, NULL, 1, 0, GFP_NOWAIT);
spin_unlock(&process->mem_lock);
idr_preload_end();
@@ -2325,6 +2337,7 @@ long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv,
trace_kgsl_mem_map(entry, fd);
+ kgsl_mem_entry_commit_process(entry);
return 0;
unmap:
@@ -2596,6 +2609,7 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv,
trace_kgsl_mem_map(entry, param->fd);
+ kgsl_mem_entry_commit_process(entry);
return result;
error_attach:
@@ -3002,6 +3016,7 @@ static struct kgsl_mem_entry *gpumem_alloc_entry(
entry->memdesc.size);
trace_kgsl_mem_alloc(entry);
+ kgsl_mem_entry_commit_process(entry);
return entry;
err:
kfree(entry);