| From 9cbb5d3ca6a9ad311765c63710a4fda6d0995a8c Mon Sep 17 00:00:00 2001 |
| From: Chris Wilson <chris@chris-wilson.co.uk> |
| Date: Fri, 4 Aug 2017 09:23:28 +0100 |
| Subject: drm: Wake up next in drm_read() chain if we are forced to putback the |
| event |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| [ Upstream commit 60b801999c48b6c1dd04e653a38e2e613664264e ] |
| |
| 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: Chris Wilson <chris@chris-wilson.co.uk> |
| Cc: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20170804082328.17173-1-chris@chris-wilson.co.uk |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/drm_file.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c |
| index 7caa3c7ed9789..9701469a6e933 100644 |
| --- a/drivers/gpu/drm/drm_file.c |
| +++ b/drivers/gpu/drm/drm_file.c |
| @@ -577,6 +577,7 @@ ssize_t drm_read(struct file *filp, char __user *buffer, |
| file_priv->event_space -= length; |
| list_add(&e->link, &file_priv->event_list); |
| spin_unlock_irq(&dev->event_lock); |
| + wake_up_interruptible(&file_priv->event_wait); |
| break; |
| } |
| |
| -- |
| 2.20.1 |
| |