msm: kgsl: Mark the hung context in recovery before extraction

Mark the context that has caused a hang in recovery before
calling the extraction function. This updates the context
state correctly early in recovery.

Change-Id: I68cbe5cc6f867c8d32dd0115eed6f1c65c54f796
Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index d0821a2..ffe6944 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -843,27 +843,27 @@
 	"Bad context_id: %u, global_eop: 0x%x\n", rec_data->ib1,
 	rec_data->context_id, rec_data->global_eop);
 
-	/* Extract valid contents from rb which can stil be executed after
-	 * hang */
-	ret = adreno_ringbuffer_extract(rb, rec_data);
-	if (ret)
-		goto done;
-
 	context = idr_find(&device->context_idr, rec_data->context_id);
 	if (context == NULL) {
 		KGSL_DRV_ERR(device, "Last context unknown id:%d\n",
 				rec_data->context_id);
 		rec_data->context_id = KGSL_MEMSTORE_GLOBAL;
+	} else {
+		adreno_context = context->devctxt;
+		adreno_context->flags |= CTXT_FLAGS_GPU_HANG;
 	}
+	/* Extract valid contents from rb which can still be executed after
+	 * hang */
+	ret = adreno_ringbuffer_extract(rb, rec_data);
+	if (ret)
+		goto done;
 
 	timestamp = rb->timestamp[KGSL_MEMSTORE_GLOBAL];
 	KGSL_DRV_ERR(device, "Last issued global timestamp: %x\n", timestamp);
 
 	/* Make sure memory is synchronized before restarting the GPU */
 	mb();
-	KGSL_CTXT_ERR(device,
-		"Context id that caused a GPU hang: %d\n",
-		rec_data->context_id);
+
 	/* restart device */
 	ret = adreno_stop(device);
 	if (ret)
@@ -872,15 +872,6 @@
 	if (ret)
 		goto done;
 	KGSL_DRV_ERR(device, "Device has been restarted after hang\n");
-	/* Mark the invalid context so no more commands are accepted from
-	 * that context */
-
-	adreno_context = context->devctxt;
-
-	KGSL_CTXT_ERR(device,
-		"Context that caused a GPU hang: %d\n", adreno_context->id);
-
-	adreno_context->flags |= CTXT_FLAGS_GPU_HANG;
 
 	/* Restore valid commands in ringbuffer */
 	adreno_ringbuffer_restore(rb, rec_data->rb_buffer, rec_data->rb_size);
diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c
index eed8f23..9eca367 100644
--- a/drivers/gpu/msm/adreno_ringbuffer.c
+++ b/drivers/gpu/msm/adreno_ringbuffer.c
@@ -1241,9 +1241,7 @@
 		goto done;
 
 	if (context) {
-		/* Mark context as hung */
 		adreno_context = context->devctxt;
-		adreno_context->flags |= CTXT_FLAGS_GPU_HANG;
 
 		if (adreno_context->flags & CTXT_FLAGS_PREAMBLE) {
 			if (rec_data->ib1) {