Author: hselasky
Date: Thu Aug 10 13:00:10 2017
New Revision: 322355
URL: https://svnweb.freebsd.org/changeset/base/322355

Log:
  Fixes for wait event in the LinuxKPI. These are regression issues
  after r319757.
  
  1) Correct the return value from __wait_event_common() from 1 to 0 in
  case the timeout is specified as MAX_SCHEDULE_TIMEOUT. In the other
  case __ret is zero and will be substituted in the last part of the
  macro with the appropriate value before return.
  
  2) Make sure the "timeout" argument is casted to "int" before
  evaluating negativity. Else the signedness of a "long" might be
  checked instead of the signedness of an integer.
  
  3) The wait_event() function should not have a return value.
  
  Found by:     KrishnamRaju ErapaRaju <krish...@chelsio.com>
  MFC after:    1 week
  Sponsored by: Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/wait.h

Modified: head/sys/compat/linuxkpi/common/include/linux/wait.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/wait.h        Thu Aug 10 
12:51:04 2017        (r322354)
+++ head/sys/compat/linuxkpi/common/include/linux/wait.h        Thu Aug 10 
13:00:10 2017        (r322355)
@@ -127,16 +127,14 @@ int linux_wait_event_common(wait_queue_head_t *, wait_
  */
 #define        __wait_event_common(wqh, cond, timeout, state, lock) ({ \
        DEFINE_WAIT(__wq);                                      \
-       const int __timeout = (timeout) < 1 ? 1 : (timeout);    \
+       const int __timeout = ((int)(timeout)) < 1 ? 1 : (timeout);     \
        int __start = ticks;                                    \
        int __ret = 0;                                          \
                                                                \
        for (;;) {                                              \
                linux_prepare_to_wait(&(wqh), &__wq, state);    \
-               if (cond) {                                     \
-                       __ret = 1;                              \
+               if (cond)                                       \
                        break;                                  \
-               }                                               \
                __ret = linux_wait_event_common(&(wqh), &__wq,  \
                    __timeout, state, lock);                    \
                if (__ret != 0)                                 \
@@ -158,10 +156,10 @@ int linux_wait_event_common(wait_queue_head_t *, wait_
        __ret;                                                  \
 })
 
-#define        wait_event(wqh, cond) ({                                        
\
-       __wait_event_common(wqh, cond, MAX_SCHEDULE_TIMEOUT,            \
+#define        wait_event(wqh, cond) do {                                      
\
+       (void) __wait_event_common(wqh, cond, MAX_SCHEDULE_TIMEOUT,     \
            TASK_UNINTERRUPTIBLE, NULL);                                \
-})
+} while (0)
 
 #define        wait_event_timeout(wqh, cond, timeout) ({                       
\
        __wait_event_common(wqh, cond, timeout, TASK_UNINTERRUPTIBLE,   \
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to