Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2/include/drm Don't break when hardclock...



details:   https://anonhg.NetBSD.org/src/rev/bffab0646101
branches:  trunk
changeset: 337350:bffab0646101
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Sun Apr 12 20:55:02 2015 +0000

description:
Don't break when hardclock_ticks wraps around.

Since we now only count time spent in wait, rather than determining
the end time and checking whether we've passed it, timeouts might be
marginally longer in effect.  Unlikely to be an issue.

diffstat:

 sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h |  74 +++++++++++---------
 1 files changed, 42 insertions(+), 32 deletions(-)

diffs (143 lines):

diff -r 16041da5d591 -r bffab0646101 sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h
--- a/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h       Sun Apr 12 20:00:42 2015 +0000
+++ b/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h       Sun Apr 12 20:55:02 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_wait_netbsd.h,v 1.12 2015/04/04 15:46:53 riastradh Exp $   */
+/*     $NetBSD: drm_wait_netbsd.h,v 1.13 2015/04/12 20:55:02 riastradh Exp $   */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -124,9 +124,8 @@
 
 #define        DRM_SPIN_WAIT_ON(RET, Q, INTERLOCK, TICKS, CONDITION)   do            \
 {                                                                            \
-       extern int hardclock_ticks;                                           \
-       const int _dswo_start = hardclock_ticks;                              \
-       const int _dswo_end = _dswo_start + (TICKS);                          \
+       unsigned _dswo_ticks = (TICKS);                                       \
+       unsigned _dswo_start, _dswo_end;                                      \
                                                                              \
        KASSERT(spin_is_locked((INTERLOCK)));                                 \
        KASSERT(!cpu_intr_p());                                               \
@@ -138,13 +137,18 @@
                        (RET) = 0;                                            \
                        break;                                                \
                }                                                             \
-               const int _dswo_now = hardclock_ticks;                        \
-               if (_dswo_end < _dswo_now) {                                  \
+               if (_dswo_ticks == 0) {                                       \
                        (RET) = -EBUSY;         /* Match Linux...  */         \
                        break;                                                \
                }                                                             \
+               _dswo_start = hardclock_ticks;                                \
                /* XXX errno NetBSD->Linux */                                 \
                (RET) = -cv_timedwait_sig((Q), &(INTERLOCK)->sl_lock, 1);     \
+               _dswo_end = hardclock_ticks;                                  \
+               if (_dswo_end - _dswo_start < _dswo_ticks)                    \
+                       _dswo_ticks -= _dswo_end - _dswo_start;               \
+               else                                                          \
+                       _dswo_ticks = 0;                                      \
                if (RET) {                                                    \
                        if ((RET) == -EWOULDBLOCK)                            \
                                /* Waited only one tick.  */                  \
@@ -212,33 +216,36 @@
 
 #define        _DRM_TIMED_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, TICKS, CONDITION) do \
 {                                                                      \
-       extern int hardclock_ticks;                                     \
-       const int _dtwu_start = hardclock_ticks;                        \
-       int _dtwu_ticks = (TICKS);                                      \
+       unsigned _dtwu_ticks = (TICKS);                                 \
+       unsigned _dtwu_start, _dtwu_end;                                \
+                                                                       \
        KASSERT(mutex_is_locked((INTERLOCK)));                          \
        ASSERT_SLEEPABLE();                                             \
        KASSERT(!cold);                                                 \
+                                                                       \
        for (;;) {                                                      \
                if (CONDITION) {                                        \
-                       (RET) = _dtwu_ticks;                            \
+                       (RET) = MAX(_dtwu_ticks, 1);                    \
+                       break;                                          \
+               }                                                       \
+               if (_dtwu_ticks == 0) {                                 \
+                       (RET) = 0;                                      \
                        break;                                          \
                }                                                       \
+               _dtwu_start = hardclock_ticks;                          \
                /* XXX errno NetBSD->Linux */                           \
                (RET) = -WAIT((Q), &(INTERLOCK)->mtx_lock,              \
-                   _dtwu_ticks);                                       \
+                   MIN(_dtwu_ticks, INT_MAX/2));                       \
+               _dtwu_end = hardclock_ticks;                            \
+               if ((_dtwu_end - _dtwu_start) < _dtwu_ticks)            \
+                       _dtwu_ticks -= _dtwu_end - _dtwu_start;         \
+               else                                                    \
+                       _dtwu_ticks = 0;                                \
                if (RET) {                                              \
                        if ((RET) == -EWOULDBLOCK)                      \
                                (RET) = (CONDITION) ? 1 : 0;            \
                        break;                                          \
                }                                                       \
-               const int _dtwu_now = hardclock_ticks;                  \
-               KASSERT(_dtwu_start <= _dtwu_now);                      \
-               if ((_dtwu_now - _dtwu_start) < _dtwu_ticks) {          \
-                       _dtwu_ticks -= (_dtwu_now - _dtwu_start);       \
-               } else {                                                \
-                       (RET) = (CONDITION) ? 1 : 0;                    \
-                       break;                                          \
-               }                                                       \
        }                                                               \
 } while (0)
 
@@ -279,34 +286,37 @@
 #define        _DRM_SPIN_TIMED_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, TICKS, CONDITION) \
        do                                                              \
 {                                                                      \
-       extern int hardclock_ticks;                                     \
-       const int _dstwu_start = hardclock_ticks;                       \
-       int _dstwu_ticks = (TICKS);                                     \
+       unsigned _dstwu_ticks = (TICKS);                                \
+       unsigned _dstwu_start, _dstwu_end;                              \
+                                                                       \
        KASSERT(spin_is_locked((INTERLOCK)));                           \
        KASSERT(!cpu_intr_p());                                         \
        KASSERT(!cpu_softintr_p());                                     \
        KASSERT(!cold);                                                 \
+                                                                       \
        for (;;) {                                                      \
                if (CONDITION) {                                        \
-                       (RET) = _dstwu_ticks;                           \
+                       (RET) = MAX(_dstwu_ticks, 1);                   \
+                       break;                                          \
+               }                                                       \
+               if (_dstwu_ticks == 0) {                                \
+                       (RET) = 0;                                      \
                        break;                                          \
                }                                                       \
+               _dstwu_start = hardclock_ticks;                         \
                /* XXX errno NetBSD->Linux */                           \
                (RET) = -WAIT((Q), &(INTERLOCK)->sl_lock,               \
-                   _dstwu_ticks);                                      \
+                   MIN(_dstwu_ticks, INT_MAX/2));                      \
+               _dstwu_end = hardclock_ticks;                           \
+               if ((_dstwu_end - _dstwu_start) < _dstwu_ticks)         \
+                       _dstwu_ticks -= _dstwu_end - _dstwu_start;      \
+               else                                                    \
+                       _dstwu_ticks = 0;                               \
                if (RET) {                                              \
                        if ((RET) == -EWOULDBLOCK)                      \
                                (RET) = (CONDITION) ? 1 : 0;            \
                        break;                                          \
                }                                                       \
-               const int _dstwu_now = hardclock_ticks;                 \
-               KASSERT(_dstwu_start <= _dstwu_now);                    \
-               if ((_dstwu_now - _dstwu_start) < _dstwu_ticks) {       \
-                       _dstwu_ticks -= (_dstwu_now - _dstwu_start);    \
-               } else {                                                \
-                       (RET) = (CONDITION) ? 1 : 0;                    \
-                       break;                                          \
-               }                                                       \
        }                                                               \
 } while (0)
 



Home | Main Index | Thread Index | Old Index