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

Commit 3fd5058b 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: Change drawctxt mutex to spinlock"

parents 9335cd62 f290ff66
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -196,12 +196,12 @@ static int ctx_print(struct seq_file *s, void *unused)

	seq_puts(s, "cmdqueue:\n");

	mutex_lock(&drawctxt->mutex);
	spin_lock(&drawctxt->lock);
	for (i = drawctxt->cmdqueue_head;
		i != drawctxt->cmdqueue_tail;
		i = CMDQUEUE_NEXT(i, ADRENO_CONTEXT_CMDQUEUE_SIZE))
		cmdbatch_print(s, drawctxt->cmdqueue[i]);
	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);

	seq_puts(s, "events:\n");
	spin_lock(&drawctxt->base.events.lock);
+17 −17
Original line number Diff line number Diff line
@@ -364,9 +364,9 @@ static struct kgsl_cmdbatch *adreno_dispatcher_get_cmdbatch(
{
	struct kgsl_cmdbatch *cmdbatch;

	mutex_lock(&drawctxt->mutex);
	spin_lock(&drawctxt->lock);
	cmdbatch = _get_cmdbatch(drawctxt);
	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);

	return cmdbatch;
}
@@ -385,11 +385,11 @@ static inline int adreno_dispatcher_requeue_cmdbatch(
		struct adreno_context *drawctxt, struct kgsl_cmdbatch *cmdbatch)
{
	unsigned int prev;
	mutex_lock(&drawctxt->mutex);
	spin_lock(&drawctxt->lock);

	if (kgsl_context_detached(&drawctxt->base) ||
		kgsl_context_invalid(&drawctxt->base)) {
		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);
		/* get rid of this cmdbatch since the context is bad */
		kgsl_cmdbatch_destroy(cmdbatch);
		return -EINVAL;
@@ -411,7 +411,7 @@ static inline int adreno_dispatcher_requeue_cmdbatch(

	/* Reset the command queue head to reflect the newly requeued change */
	drawctxt->cmdqueue_head = prev;
	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);
	return 0;
}

@@ -792,7 +792,7 @@ static int _check_context_queue(struct adreno_context *drawctxt)
{
	int ret;

	mutex_lock(&drawctxt->mutex);
	spin_lock(&drawctxt->lock);

	/*
	 * Wake up if there is room in the context or if the whole thing got
@@ -804,7 +804,7 @@ static int _check_context_queue(struct adreno_context *drawctxt)
	else
		ret = drawctxt->queued < _context_cmdqueue_size ? 1 : 0;

	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);

	return ret;
}
@@ -861,10 +861,10 @@ int adreno_dispatcher_queue_cmd(struct adreno_device *adreno_dev,
				ADRENO_CMDBATCH_DISPATCH_CMDQUEUE(cmdbatch);
	int ret;

	mutex_lock(&drawctxt->mutex);
	spin_lock(&drawctxt->lock);

	if (kgsl_context_detached(&drawctxt->base)) {
		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);
		return -EINVAL;
	}

@@ -921,17 +921,17 @@ int adreno_dispatcher_queue_cmd(struct adreno_device *adreno_dev,

	while (drawctxt->queued >= _context_cmdqueue_size) {
		trace_adreno_drawctxt_sleep(drawctxt);
		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);

		ret = wait_event_interruptible_timeout(drawctxt->wq,
			_check_context_queue(drawctxt),
			msecs_to_jiffies(_context_queue_wait));

		mutex_lock(&drawctxt->mutex);
		spin_lock(&drawctxt->lock);
		trace_adreno_drawctxt_wake(drawctxt);

		if (ret <= 0) {
			mutex_unlock(&drawctxt->mutex);
			spin_unlock(&drawctxt->lock);
			return (ret == 0) ? -ETIMEDOUT : (int) ret;
		}
	}
@@ -941,17 +941,17 @@ int adreno_dispatcher_queue_cmd(struct adreno_device *adreno_dev,
	 */

	if (kgsl_context_invalid(&drawctxt->base)) {
		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);
		return -EDEADLK;
	}
	if (kgsl_context_detached(&drawctxt->base)) {
		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);
		return -EINVAL;
	}

	ret = get_timestamp(drawctxt, cmdbatch, timestamp);
	if (ret) {
		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);
		return ret;
	}

@@ -970,7 +970,7 @@ int adreno_dispatcher_queue_cmd(struct adreno_device *adreno_dev,
				drawctxt->queued);

			_retire_marker(cmdbatch);
			mutex_unlock(&drawctxt->mutex);
			spin_unlock(&drawctxt->lock);
			return 0;
		}

@@ -1025,7 +1025,7 @@ int adreno_dispatcher_queue_cmd(struct adreno_device *adreno_dev,

	_track_context(dispatch_q, drawctxt->base.id);

	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);

	/* Add the context to the dispatcher pending list */
	dispatcher_queue_context(adreno_dev, drawctxt);
+9 −16
Original line number Diff line number Diff line
@@ -62,12 +62,12 @@ void adreno_drawctxt_dump(struct kgsl_device *device,
	struct adreno_context *drawctxt = ADRENO_CONTEXT(context);
	int index, pos;
	char buf[120];
	mutex_lock(&drawctxt->mutex);

	kgsl_readtimestamp(device, context, KGSL_TIMESTAMP_QUEUED, &queue);
	kgsl_readtimestamp(device, context, KGSL_TIMESTAMP_CONSUMED, &start);
	kgsl_readtimestamp(device, context, KGSL_TIMESTAMP_RETIRED, &retire);

	spin_lock(&drawctxt->lock);
	dev_err(device->dev,
		"  context[%d]: queue=%d, submit=%d, start=%d, retire=%d\n",
		context->id, queue, drawctxt->submitted_timestamp,
@@ -108,7 +108,7 @@ void adreno_drawctxt_dump(struct kgsl_device *device,
	dev_err(device->dev, "  context[%d]: submit times: %s\n",
		context->id, buf);

	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);
}

/**
@@ -233,11 +233,9 @@ void adreno_drawctxt_invalidate(struct kgsl_device *device,

	trace_adreno_drawctxt_invalidate(drawctxt);

	spin_lock(&drawctxt->lock);
	set_bit(KGSL_CONTEXT_PRIV_INVALID, &context->priv);

	/* Clear the pending queue */
	mutex_lock(&drawctxt->mutex);

	/*
	 * set the timestamp to the last value since the context is invalidated
	 * and we want the pending events for this context to go away
@@ -258,18 +256,13 @@ void adreno_drawctxt_invalidate(struct kgsl_device *device,
		drawctxt->cmdqueue_head = (drawctxt->cmdqueue_head + 1) %
			ADRENO_CONTEXT_CMDQUEUE_SIZE;

		mutex_unlock(&drawctxt->mutex);

		mutex_lock(&device->mutex);
		kgsl_cancel_events_timestamp(device, &context->events,
			cmdbatch->timestamp);
		mutex_unlock(&device->mutex);

		kgsl_cmdbatch_destroy(cmdbatch);
		mutex_lock(&drawctxt->mutex);
	}

	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);

	/* Make sure all "retired" events are processed */
	kgsl_process_event_group(device, &context->events);
@@ -365,7 +358,7 @@ adreno_drawctxt_create(struct kgsl_device_private *dev_priv,
	drawctxt->base.flags |= KGSL_CONTEXT_PER_CONTEXT_TS;
	drawctxt->type = (drawctxt->base.flags & KGSL_CONTEXT_TYPE_MASK)
		>> KGSL_CONTEXT_TYPE_SHIFT;
	mutex_init(&drawctxt->mutex);
	spin_lock_init(&drawctxt->lock);
	init_waitqueue_head(&drawctxt->wq);
	init_waitqueue_head(&drawctxt->waiting);

@@ -434,7 +427,7 @@ int adreno_drawctxt_detach(struct kgsl_context *context)
	if (rb->drawctxt_active == drawctxt)
		adreno_drawctxt_switch(adreno_dev, rb, NULL, 0);

	mutex_lock(&drawctxt->mutex);
	spin_lock(&drawctxt->lock);

	while (drawctxt->cmdqueue_head != drawctxt->cmdqueue_tail) {
		struct kgsl_cmdbatch *cmdbatch =
@@ -443,7 +436,7 @@ int adreno_drawctxt_detach(struct kgsl_context *context)
		drawctxt->cmdqueue_head = (drawctxt->cmdqueue_head + 1) %
			ADRENO_CONTEXT_CMDQUEUE_SIZE;

		mutex_unlock(&drawctxt->mutex);
		spin_unlock(&drawctxt->lock);

		/*
		 * If the context is deteached while we are waiting for
@@ -459,10 +452,10 @@ int adreno_drawctxt_detach(struct kgsl_context *context)
		 */

		kgsl_cmdbatch_destroy(cmdbatch);
		mutex_lock(&drawctxt->mutex);
		spin_lock(&drawctxt->lock);
	}

	mutex_unlock(&drawctxt->mutex);
	spin_unlock(&drawctxt->lock);
	/*
	 * internal_timestamp is set in adreno_ringbuffer_addcmds,
	 * which holds the device mutex. The entire context destroy
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ struct adreno_context {
	unsigned int timestamp;
	unsigned int internal_timestamp;
	unsigned int type;
	struct mutex mutex;
	spinlock_t lock;

	/* Dispatcher */
	struct kgsl_cmdbatch *cmdqueue[ADRENO_CONTEXT_CMDQUEUE_SIZE];