]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm: Wake up next in drm_read() chain if we are forced to putback the event
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 4 Aug 2017 08:23:28 +0000 (09:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 May 2019 13:46:34 +0000 (06:46 -0700)
[ 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

index e4ccb52c67ea47f02b4d7c658724f0a0f06ad13f..334addaca9c545ad0bdfbe86fa8ec9560afac16e 100644 (file)
@@ -567,6 +567,7 @@ put_back_event:
                                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;
                        }