diff options
Diffstat (limited to 'drivers/gpu/drm/drm_vblank.c')
| -rw-r--r-- | drivers/gpu/drm/drm_vblank.c | 25 | 
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index 603ab105125d..fd1fbc77871f 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -31,7 +31,6 @@  #include <drm/drm_drv.h>  #include <drm/drm_framebuffer.h>  #include <drm/drm_print.h> -#include <drm/drm_os_linux.h>  #include <drm/drm_vblank.h>  #include "drm_internal.h" @@ -1670,12 +1669,28 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,  	}  	if (req_seq != seq) { +		int wait; +  		DRM_DEBUG("waiting on vblank count %llu, crtc %u\n",  			  req_seq, pipe); -		DRM_WAIT_ON(ret, vblank->queue, 3 * HZ, -			    vblank_passed(drm_vblank_count(dev, pipe), -					  req_seq) || -			    !READ_ONCE(vblank->enabled)); +		wait = wait_event_interruptible_timeout(vblank->queue, +			vblank_passed(drm_vblank_count(dev, pipe), req_seq) || +				      !READ_ONCE(vblank->enabled), +			msecs_to_jiffies(3000)); + +		switch (wait) { +		case 0: +			/* timeout */ +			ret = -EBUSY; +			break; +		case -ERESTARTSYS: +			/* interrupted by signal */ +			ret = -EINTR; +			break; +		default: +			ret = 0; +			break; +		}  	}  	if (ret != -EINTR) {  |