DRM系列(10)之drm_read

施阳曜
2023-12-01

本系列专栏《Linux图形驱动与桌面

drm_read

返回buffer给用户层,buffer是event对象。这个file_priv->event_list链表中的drm_pending_event对象是由drm_send_event_helper添加的。

drm_event由内核中其他线程使用的completion机制/基于fence的dma机制所触发。

ssize_t drm_read(struct file *filp, char __user *buffer,
		 size_t count, loff_t *offset)
{
	struct drm_file *file_priv = filp->private_data;
	struct drm_device *dev = file_priv->minor->dev;
	ssize_t ret;

	ret = mutex_lock_interruptible(&file_priv->event_read_lock);
	if (ret)
		return ret;

	for (;;) {
		struct drm_pending_event *e = NULL;

		spin_lock_irq(&dev->event_lock);
		if (!list_empty(&file_priv->event_list)) {
			e = list_first_entry(&file_priv->event_list,
					struct drm_pending_event, link);
      //for循环每遍历一次,都将fi
 类似资料: