Commit 44a2d564 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Daniel Vetter

drm/via: use monotonic time for VIA_WAIT_IRQ

The normal DRM vblank interrupt events started using monotonic times in
commit c61eef72 ("drm: add support for monotonic vblank timestamps"),
which is useful for a number of reasons, including the possible y2038
overflow.

The VIA_WAIT_IRQ ioctl uses the same drm_wait_vblank_reply as
DRM_IOCTL_WAIT_VBLANK, but still uses wall-clock time.

This converts it to using monotonic time as well, which is more
consistent, and avoids problems with the y2038 overflow as well
as synchronization issues when the real time skips.

I could not find the matching user space that calls the VIA_WAIT_IRQ
ioctl to verify that this is safe, but it very likely is. Please
either test or review the user space side before applying this.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20171127111728.1710742-1-arnd@arndb.de
parent 298b6a81
...@@ -343,7 +343,7 @@ void via_driver_irq_uninstall(struct drm_device *dev) ...@@ -343,7 +343,7 @@ void via_driver_irq_uninstall(struct drm_device *dev)
int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv) int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
drm_via_irqwait_t *irqwait = data; drm_via_irqwait_t *irqwait = data;
struct timeval now; struct timespec64 now;
int ret = 0; int ret = 0;
drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
drm_via_irq_t *cur_irq = dev_priv->via_irqs; drm_via_irq_t *cur_irq = dev_priv->via_irqs;
...@@ -377,9 +377,9 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv) ...@@ -377,9 +377,9 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
ret = via_driver_irq_wait(dev, irqwait->request.irq, force_sequence, ret = via_driver_irq_wait(dev, irqwait->request.irq, force_sequence,
&irqwait->request.sequence); &irqwait->request.sequence);
do_gettimeofday(&now); ktime_get_ts64(&now);
irqwait->reply.tval_sec = now.tv_sec; irqwait->reply.tval_sec = now.tv_sec;
irqwait->reply.tval_usec = now.tv_usec; irqwait->reply.tval_usec = now.tv_nsec / NSEC_PER_USEC;
return ret; return ret;
} }
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