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

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

Merge "drm/msm/sde: fix race condition in client_event_list deregister"

parents 146254ef bc0239f4
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -1434,9 +1434,10 @@ static int msm_release(struct inode *inode, struct file *filp)
	struct drm_minor *minor = file_priv->minor;
	struct drm_device *dev = minor->dev;
	struct msm_drm_private *priv = dev->dev_private;
	struct msm_drm_event *node, *temp;
	struct msm_drm_event *node, *temp, *tmp_node;
	u32 count;
	unsigned long flags;
	LIST_HEAD(tmp_head);

	spin_lock_irqsave(&dev->event_lock, flags);
	list_for_each_entry_safe(node, temp, &priv->client_event_list,
@@ -1444,14 +1445,25 @@ static int msm_release(struct inode *inode, struct file *filp)
		if (node->base.file_priv != file_priv)
			continue;
		list_del(&node->base.link);
		list_add_tail(&node->base.link, &tmp_head);
	}
	spin_unlock_irqrestore(&dev->event_lock, flags);
		count = msm_event_client_count(dev, &node->info, true);

	list_for_each_entry_safe(node, temp, &tmp_head,
			base.link) {
		list_del(&node->base.link);
		count = msm_event_client_count(dev, &node->info, false);

		list_for_each_entry(tmp_node, &tmp_head, base.link) {
			if (tmp_node->event.type == node->info.event &&
				tmp_node->info.object_id ==
					node->info.object_id)
				count++;
		}
		if (!count)
			msm_register_event(dev, &node->info, file_priv, false);
		kfree(node);
		spin_lock_irqsave(&dev->event_lock, flags);
	}
	spin_unlock_irqrestore(&dev->event_lock, flags);

	return drm_release(inode, filp);
}