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

Commit 8a46f594 authored by gkiranku's avatar gkiranku
Browse files

msm: kgsl: Avoid race of fault handler and recovery



There is a possibility of cx gdsc off timeout when stall on fault
is enabled. smmu fault handler is blocked on device mutex to keep
cx vote and dispatcher trying to turn it off for recovery. To avoid
this race condition, return from fault handler when there is contention
for device mutex.

Change-Id: Ia895152f8cf1ce9bdcfecf256558ba291dabc978
Signed-off-by: default avatargkiranku <gkiranku@codeaurora.org>
parent daae2461
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -757,6 +757,7 @@ static int kgsl_iommu_fault_handler(struct iommu_domain *domain,
	unsigned int no_page_fault_log = 0;
	char *fault_type = "unknown";
	char *comm = "unknown";
	bool fault_ret_flag = false;
	struct kgsl_process_private *private;

	static DEFINE_RATELIMIT_STATE(_rs,
@@ -800,9 +801,11 @@ static int kgsl_iommu_fault_handler(struct iommu_domain *domain,
		 * Turn off GPU IRQ so we don't get faults from it too.
		 * The device mutex must be held to change power state
		 */
		mutex_lock(&device->mutex);
		if (mutex_trylock(&device->mutex)) {
			kgsl_pwrctrl_change_state(device, KGSL_STATE_AWARE);
			mutex_unlock(&device->mutex);
		} else
			fault_ret_flag = true;
	}

	contextidr = KGSL_IOMMU_GET_CTX_REG(ctx, CONTEXTIDR);
@@ -861,6 +864,8 @@ static int kgsl_iommu_fault_handler(struct iommu_domain *domain,
				dev_err(ctx->kgsldev->dev, "*EMPTY*\n");
		}
	}
	if (fault_ret_flag)
		return ret;


	/*