From: Chris Wilson Date: Tue, 7 Oct 2014 13:13:51 +0000 (+0100) Subject: drm: Implement O_NONBLOCK support on /dev/dri/cardN X-Git-Tag: firefly_0821_release~176^2~2672^2~76^2~14 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=bd008e5b2953186fc0c6633a885ade95e7043800;p=firefly-linux-kernel-4.4.55.git drm: Implement O_NONBLOCK support on /dev/dri/cardN The implmentation is simple in the extreme: we only want to wait for events if the device was opened in blocking mode, otherwise we grab what is available and report an error if there was none. Signed-off-by: Chris Wilson Cc: dri-devel@lists.freedesktop.org Reviewed-by: Jesse Barnes Testcase: igt/kms_flip/nonblocing_read Signed-off-by: Daniel Vetter --- diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index ed7bc68f7e87..91e1105f2800 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c @@ -515,10 +515,12 @@ ssize_t drm_read(struct file *filp, char __user *buffer, size_t total; ssize_t ret; - ret = wait_event_interruptible(file_priv->event_wait, - !list_empty(&file_priv->event_list)); - if (ret < 0) - return ret; + if ((filp->f_flags & O_NONBLOCK) == 0) { + ret = wait_event_interruptible(file_priv->event_wait, + !list_empty(&file_priv->event_list)); + if (ret < 0) + return ret; + } total = 0; while (drm_dequeue_event(file_priv, total, count, &e)) { @@ -532,7 +534,7 @@ ssize_t drm_read(struct file *filp, char __user *buffer, e->destroy(e); } - return total; + return total ?: -EAGAIN; } EXPORT_SYMBOL(drm_read);