Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 706f38ff authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Limit the maximum number of contexts"

parents e4800316 410e8393
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -529,6 +529,16 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv,
	struct kgsl_device *device = dev_priv->device;
	char name[64];
	int ret = 0, id;
	struct kgsl_process_private  *proc_priv = dev_priv->process_priv;

	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);
		return -ENOSPC;
	}

	atomic_inc(&proc_priv->ctxt_count);

	id = _kgsl_get_context_id(device);
	if (id == -ENOSPC) {
@@ -547,7 +557,7 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv,
			KGSL_DRV_INFO(device,
				"cannot have more than %zu contexts due to memstore limitation\n",
				KGSL_MEMSTORE_MAX);

		atomic_dec(&proc_priv->ctxt_count);
		return id;
	}

@@ -580,6 +590,7 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv,

out:
	if (ret) {
		atomic_dec(&proc_priv->ctxt_count);
		write_lock(&device->context_lock);
		idr_remove(&dev_priv->device->context_idr, id);
		write_unlock(&device->context_lock);
@@ -669,6 +680,7 @@ kgsl_context_destroy(struct kref *kref)
			device->pwrctrl.constraint.type = KGSL_CONSTRAINT_NONE;
		}

		atomic_dec(&context->proc_priv->ctxt_count);
		idr_remove(&device->context_idr, context->id);
		context->id = KGSL_CONTEXT_INVALID;
	}
+2 −1
Original line number Diff line number Diff line
@@ -50,11 +50,12 @@
/* The number of memstore arrays limits the number of contexts allowed.
 * If more contexts are needed, update multiple for MEMSTORE_SIZE
 */
#define KGSL_MEMSTORE_SIZE	((int)(PAGE_SIZE * 2))
#define KGSL_MEMSTORE_SIZE	((int)(PAGE_SIZE * 8))
#define KGSL_MEMSTORE_GLOBAL	(0)
#define KGSL_PRIORITY_MAX_RB_LEVELS 4
#define KGSL_MEMSTORE_MAX	(KGSL_MEMSTORE_SIZE / \
	sizeof(struct kgsl_devmemstore) - 1 - KGSL_PRIORITY_MAX_RB_LEVELS)
#define KGSL_MAX_CONTEXTS_PER_PROC 200

#define MEMSTORE_RB_OFFSET(rb, field)	\
	KGSL_MEMSTORE_OFFSET(((rb)->id + KGSL_MEMSTORE_MAX), field)
+2 −0
Original line number Diff line number Diff line
@@ -441,6 +441,7 @@ struct kgsl_context {
 * @syncsource_idr: sync sources created by this process
 * @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
 */
struct kgsl_process_private {
	unsigned long priv;
@@ -460,6 +461,7 @@ struct kgsl_process_private {
	struct idr syncsource_idr;
	spinlock_t syncsource_lock;
	int fd_count;
	atomic_t ctxt_count;
};

/**