Commit 60b80199 authored by Chris Wilson's avatar Chris Wilson

drm: Wake up next in drm_read() chain if we are forced to putback the event

After an event is sent, we try to copy it into the user buffer of the
first waiter in drm_read() and if the user buffer doesn't have enough
room we put it back onto the list. However, we didn't wake up any
subsequent waiter, so that event may sit on the list until either a new
vblank event is sent or a new waiter appears. Rare, but in the worst
case may lead to a stuck process.

Testcase: igt/drm_read/short-buffer-wakeup
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170804082328.17173-1-chris@chris-wilson.co.uk
parent 979a1bb6
...@@ -567,6 +567,7 @@ ssize_t drm_read(struct file *filp, char __user *buffer, ...@@ -567,6 +567,7 @@ ssize_t drm_read(struct file *filp, char __user *buffer,
file_priv->event_space -= length; file_priv->event_space -= length;
list_add(&e->link, &file_priv->event_list); list_add(&e->link, &file_priv->event_list);
spin_unlock_irq(&dev->event_lock); spin_unlock_irq(&dev->event_lock);
wake_up_interruptible(&file_priv->event_wait);
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment