本系列专栏《Linux图形驱动与桌面》
返回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