From 4ef8a6301fb73f38c3aec05d88ede98400ed04f6 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Thu, 10 Aug 2017 13:00:10 +0000 Subject: [PATCH] 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 MFC after: 1 week Sponsored by: Mellanox Technologies --- sys/compat/linuxkpi/common/include/linux/wait.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/wait.h b/sys/compat/linuxkpi/common/include/linux/wait.h index c04a79092c6..ea4586f2e2e 100644 --- a/sys/compat/linuxkpi/common/include/linux/wait.h +++ b/sys/compat/linuxkpi/common/include/linux/wait.h @@ -127,16 +127,14 @@ int linux_wait_event_common(wait_queue_head_t *, wait_queue_t *, int, */ #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_queue_t *, int, __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, \