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

Commit 15d2f446 authored by Gopikrishnaiah Anandan's avatar Gopikrishnaiah Anandan
Browse files

drm/msm/sde: fix race condition between enable/disable events



When crtc event disable api is called, we search for the node with spin
lock to avoid race condition in traversing list with other
threads.Currently driver should remove the node with spin lock held
before freeing the node to avoid list corruption.

Change-Id: Iece8678c92e4bd6ed858e3e5174682fa01b28a0f
Signed-off-by: default avatarGopikrishnaiah Anandan <agopik@codeaurora.org>
parent 4b19ee48
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -6188,6 +6188,7 @@ static int _sde_crtc_event_disable(struct sde_kms *kms,
	spin_lock_irqsave(&crtc->spin_lock, flags);
	list_for_each_entry(node, &crtc->user_event_list, list) {
		if (node->event == event) {
			list_del(&node->list);
			found = true;
			break;
		}
@@ -6203,7 +6204,6 @@ static int _sde_crtc_event_disable(struct sde_kms *kms,
	 * no need to disable/de-register.
	 */
	if (!crtc_drm->enabled) {
		list_del(&node->list);
		kfree(node);
		return 0;
	}
@@ -6212,13 +6212,11 @@ static int _sde_crtc_event_disable(struct sde_kms *kms,
	if (ret) {
		SDE_ERROR("failed to enable power resource %d\n", ret);
		SDE_EVT32(ret, SDE_EVTLOG_ERROR);
		list_del(&node->list);
		kfree(node);
		return ret;
	}

	ret = node->func(crtc_drm, false, &node->irq);
	list_del(&node->list);
	kfree(node);
	sde_power_resource_enable(&priv->phandle, kms->core_client, false);
	return ret;