summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDeepak Kumar <dkumar@codeaurora.org>2018-03-05 16:51:25 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2019-03-06 23:28:08 -0800
commit4f5103fd124a929ea55ef9554b324882de41ce0b (patch)
tree483f4a6f65c657807a6c200fbe4a2788591fe2bc /drivers/gpu
parentcbbe494b0cb57c4dd6ad9ba82510f1ed34424d07 (diff)
msm: kgsl: Correctly limit max number of contexts per process
Read and increment context count atomic variable under a lock to avoid race condition between read and increment. This is necessary to make sure no process goes beyond the specified context limit. Change-Id: I483e2ac169beaff49e19b8ef1b46541f6eb740b0 Signed-off-by: Deepak Kumar <dkumar@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/msm/kgsl.c8
-rw-r--r--drivers/gpu/msm/kgsl_device.h2
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index b8519a16df92..b0b05975dab0 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -532,14 +532,21 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv,
int ret = 0, id;
struct kgsl_process_private *proc_priv = dev_priv->process_priv;
+ /*
+ * Read and increment the context count under lock to make sure
+ * no process goes beyond the specified context limit.
+ */
+ spin_lock(&proc_priv->ctxt_count_lock);
if (atomic_read(&proc_priv->ctxt_count) > KGSL_MAX_CONTEXTS_PER_PROC) {
KGSL_DRV_ERR(device,
"Per process context limit reached for pid %u",
dev_priv->process_priv->pid);
+ spin_unlock(&proc_priv->ctxt_count_lock);
return -ENOSPC;
}
atomic_inc(&proc_priv->ctxt_count);
+ spin_unlock(&proc_priv->ctxt_count_lock);
id = _kgsl_get_context_id(device);
if (id == -ENOSPC) {
@@ -925,6 +932,7 @@ static struct kgsl_process_private *kgsl_process_private_new(
spin_lock_init(&private->mem_lock);
spin_lock_init(&private->syncsource_lock);
+ spin_lock_init(&private->ctxt_count_lock);
idr_init(&private->mem_idr);
idr_init(&private->syncsource_idr);
diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h
index abff4e4ecc70..549e23cfc273 100644
--- a/drivers/gpu/msm/kgsl_device.h
+++ b/drivers/gpu/msm/kgsl_device.h
@@ -423,6 +423,7 @@ struct kgsl_context {
* @syncsource_lock: Spinlock to protect the syncsource idr
* @fd_count: Counter for the number of FDs for this process
* @ctxt_count: Count for the number of contexts for this process
+ * @ctxt_count_lock: Spinlock to protect ctxt_count
*/
struct kgsl_process_private {
unsigned long priv;
@@ -443,6 +444,7 @@ struct kgsl_process_private {
spinlock_t syncsource_lock;
int fd_count;
atomic_t ctxt_count;
+ spinlock_t ctxt_count_lock;
};
/**