Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Aug 2017 13:00:10 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r322355 - head/sys/compat/linuxkpi/common/include/linux
Message-ID:  <201708101300.v7AD0AIN091859@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <Krishna2@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,	\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201708101300.v7AD0AIN091859>