[PATCH 108/133] drm: Don't pass negative delta to ktime_sub_ns()

2013-08-16 Thread Kamal Mostafa
3.8.13.7 -stable review patch.  If anyone has any objections, please let me 
know.

--

From: =?UTF-8?q?Michel=20D=C3=A4nzer?= 

commit e91abf80a0998f326107874c88d549f94839f13c upstream.

It takes an unsigned value. This happens not to blow up on 64-bit
architectures, but it does on 32-bit, causing
drm_calc_vbltimestamp_from_scanoutpos() to calculate totally bogus
timestamps for vblank events. Which in turn causes e.g. gnome-shell to
hang after a DPMS off cycle with current xf86-video-ati Git.

[airlied: regression introduced in drm: use monotonic time in 
drm_calc_vbltimestamp_from_scanoutpos]

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59339
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59836
Tested-by: shui yangwei 
Signed-off-by: Michel Dänzer 
Reviewed-by: Imre Deak 
Signed-off-by: Dave Airlie 
Signed-off-by: Kamal Mostafa 
---
 drivers/gpu/drm/drm_irq.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 570dac6..0f3cdda 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -704,7 +704,10 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct 
drm_device *dev, int crtc,
/* Subtract time delta from raw timestamp to get final
 * vblank_time timestamp for end of vblank.
 */
-   etime = ktime_sub_ns(etime, delta_ns);
+   if (delta_ns < 0)
+   etime = ktime_add_ns(etime, -delta_ns);
+   else
+   etime = ktime_sub_ns(etime, delta_ns);
*vblank_time = ktime_to_timeval(etime);
 
DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d 
rep]\n",
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 108/133] drm: Don't pass negative delta to ktime_sub_ns()

2013-08-16 Thread Kamal Mostafa
3.8.13.7 -stable review patch.  If anyone has any objections, please let me 
know.

--

From: =?UTF-8?q?Michel=20D=C3=A4nzer?= michel.daen...@amd.com

commit e91abf80a0998f326107874c88d549f94839f13c upstream.

It takes an unsigned value. This happens not to blow up on 64-bit
architectures, but it does on 32-bit, causing
drm_calc_vbltimestamp_from_scanoutpos() to calculate totally bogus
timestamps for vblank events. Which in turn causes e.g. gnome-shell to
hang after a DPMS off cycle with current xf86-video-ati Git.

[airlied: regression introduced in drm: use monotonic time in 
drm_calc_vbltimestamp_from_scanoutpos]

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59339
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59836
Tested-by: shui yangwei yangweix.s...@intel.com
Signed-off-by: Michel Dänzer michel.daen...@amd.com
Reviewed-by: Imre Deak imre.d...@intel.com
Signed-off-by: Dave Airlie airl...@redhat.com
Signed-off-by: Kamal Mostafa ka...@canonical.com
---
 drivers/gpu/drm/drm_irq.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 570dac6..0f3cdda 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -704,7 +704,10 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct 
drm_device *dev, int crtc,
/* Subtract time delta from raw timestamp to get final
 * vblank_time timestamp for end of vblank.
 */
-   etime = ktime_sub_ns(etime, delta_ns);
+   if (delta_ns  0)
+   etime = ktime_add_ns(etime, -delta_ns);
+   else
+   etime = ktime_sub_ns(etime, delta_ns);
*vblank_time = ktime_to_timeval(etime);
 
DRM_DEBUG(crtc %d : v %d p(%d,%d)@ %ld.%ld - %ld.%ld [e %d us, %d 
rep]\n,
-- 
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/