changeset 25431:871cc4355352

OS-6580 LX fails to handle futex_requeue correctly (#333) Reviewed by: Dan McDonald <danmcd@joyent.com> Reviewed by: Mike Zeller <mike.zeller@joyent.com> Approved by: Dan McDonald <danmcd@joyent.com>
author Jason King <jasonbking@users.noreply.github.com>
date Wed, 30 Sep 2020 12:31:40 -0500
parents f57f3c747779
children 1cdaa18973ab
files usr/src/uts/common/brand/lx/syscall/lx_futex.c
diffstat 1 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/brand/lx/syscall/lx_futex.c	Tue Sep 29 11:36:29 2020 +0000
+++ b/usr/src/uts/common/brand/lx/syscall/lx_futex.c	Wed Sep 30 12:31:40 2020 -0500
@@ -1401,12 +1401,23 @@
 		break;
 
 	case FUTEX_CMP_REQUEUE:
-	case FUTEX_REQUEUE:
 		rval = futex_requeue(&memid, &memid2, val,
 		    val2, (void *)addr2, &val3);
 
 		break;
 
+	case FUTEX_REQUEUE:
+		/*
+		 * Per Linux futex(2), FUTEX_REQUEUE is the same as
+		 * FUTEX_CMP_REQUEUE, except val3 is ignored. futex_requeue()
+		 * will elide the val3 check if cmpval (the last argument) is
+		 * NULL.
+		 */
+		rval = futex_requeue(&memid, &memid2, val,
+		    val2, (void *)addr2, NULL);
+
+		break;
+
 	case FUTEX_LOCK_PI:
 		rval = futex_lock_pi(&memid, (uint32_t *)addr, tptr, B_FALSE);
 		break;