diff --git a/SOURCES/strace-rh1540954-1.patch b/SOURCES/strace-rh1540954-1.patch
new file mode 100644
index 0000000..f1c1b7e
--- /dev/null
+++ b/SOURCES/strace-rh1540954-1.patch
@@ -0,0 +1,72 @@
+commit 52231be034160c786735c6ae2f51ac7723c2e1fd
+Author: Dmitry V. Levin <ldv@altlinux.org>
+Date:   Fri Sep 15 16:06:14 2017 +0000
+
+    Update MEMBARRIER_CMD_* constants
+    
+    * xlat/membarrier_cmds.in: Add MEMBARRIER_CMD_PRIVATE_EXPEDITED
+    introduced by kernel commit v4.14-rc1~174^2^2^4.
+    * NEWS: Mention this.
+    * tests/membarrier.c (main): Update expected output.
+
+diff -rup a/tests/membarrier.c b/tests/membarrier.c
+--- a/tests/membarrier.c	2016-12-20 00:10:21.000000000 -0500
++++ b/tests/membarrier.c	2018-03-07 16:08:39.803150889 -0500
+@@ -44,10 +44,23 @@ main(void)
+ 	printf("membarrier(0x3 /* MEMBARRIER_CMD_??? */, 255) = %s\n",
+ 	       sprintrc(-1));
+ 	if (saved_errno != ENOSYS) {
+-		/* the test needs to be updated? */
+-		assert(syscall(__NR_membarrier, 0, 0) == 1);
+-		puts("membarrier(MEMBARRIER_CMD_QUERY, 0)"
+-		     " = 0x1 (MEMBARRIER_CMD_SHARED)");
++		const char *text;
++		int rc = syscall(__NR_membarrier, 0, 0);
++
++		switch (rc) {
++		case 1:
++			text = "MEMBARRIER_CMD_SHARED";
++			break;
++		case 1|8:
++			text = "MEMBARRIER_CMD_SHARED|"
++			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED";
++			break;
++		default:
++			error_msg_and_fail("membarrier returned %#x, does"
++					   " the test have to be updated?", rc);
++		}
++		printf("membarrier(MEMBARRIER_CMD_QUERY, 0) = %#x (%s)\n",
++		       rc, text);
+ 	}
+ 	puts("+++ exited with 0 +++");
+ 	return 0;
+diff -rup a/xlat/membarrier_cmds.h b/xlat/membarrier_cmds.h
+--- a/xlat/membarrier_cmds.h	2017-05-24 15:55:51.000000000 -0400
++++ b/xlat/membarrier_cmds.h	2018-03-07 16:08:54.883976263 -0500
+@@ -5,6 +5,9 @@
+ #if !(defined(MEMBARRIER_CMD_SHARED) || (defined(HAVE_DECL_MEMBARRIER_CMD_SHARED) && HAVE_DECL_MEMBARRIER_CMD_SHARED))
+ # define MEMBARRIER_CMD_SHARED 1
+ #endif
++#if !(defined(MEMBARRIER_CMD_PRIVATE_EXPEDITED) || (defined(HAVE_DECL_MEMBARRIER_CMD_PRIVATE_EXPEDITED) && HAVE_DECL_MEMBARRIER_CMD_PRIVATE_EXPEDITED))
++# define MEMBARRIER_CMD_PRIVATE_EXPEDITED 8
++#endif
+ 
+ #ifdef IN_MPERS
+ 
+@@ -16,6 +19,7 @@ static
+ const struct xlat membarrier_cmds[] = {
+  XLAT(MEMBARRIER_CMD_QUERY),
+  XLAT(MEMBARRIER_CMD_SHARED),
++ XLAT(MEMBARRIER_CMD_PRIVATE_EXPEDITED),
+  XLAT_END
+ };
+ 
+diff -rup a/xlat/membarrier_cmds.in b/xlat/membarrier_cmds.in
+--- a/xlat/membarrier_cmds.in	2015-11-16 19:40:22.000000000 -0500
++++ b/xlat/membarrier_cmds.in	2018-03-07 16:08:39.804150878 -0500
+@@ -1,2 +1,3 @@
+-MEMBARRIER_CMD_QUERY	0
+-MEMBARRIER_CMD_SHARED	1
++MEMBARRIER_CMD_QUERY			0
++MEMBARRIER_CMD_SHARED			1
++MEMBARRIER_CMD_PRIVATE_EXPEDITED	8
diff --git a/SOURCES/strace-rh1540954-2.patch b/SOURCES/strace-rh1540954-2.patch
new file mode 100644
index 0000000..ce64d0e
--- /dev/null
+++ b/SOURCES/strace-rh1540954-2.patch
@@ -0,0 +1,54 @@
+commit 73354cff1aae409d6ef7d8a539a2a0a09c2480f9
+Author: Dmitry V. Levin <ldv@altlinux.org>
+Date:   Wed Nov 1 00:20:44 2017 +0000
+
+    Update MEMBARRIER_CMD_* constants
+    
+    * xlat/membarrier_cmds.in: Add MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED
+    introduced by kernel commit v4.14-rc6~26.
+    * tests/membarrier.c (main): Update expected output.
+
+diff -rup a/tests/membarrier.c b/tests/membarrier.c
+--- a/tests/membarrier.c	2018-03-07 16:10:10.000000000 -0500
++++ b/tests/membarrier.c	2018-03-07 16:10:36.596808428 -0500
+@@ -55,6 +55,11 @@ main(void)
+ 			text = "MEMBARRIER_CMD_SHARED|"
+ 			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED";
+ 			break;
++		case 1|8|16:
++			text = "MEMBARRIER_CMD_SHARED|"
++			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
++			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
++			break;
+ 		default:
+ 			error_msg_and_fail("membarrier returned %#x, does"
+ 					   " the test have to be updated?", rc);
+diff -rup a/xlat/membarrier_cmds.h b/xlat/membarrier_cmds.h
+--- a/xlat/membarrier_cmds.h	2018-03-07 16:10:10.000000000 -0500
++++ b/xlat/membarrier_cmds.h	2018-03-07 16:10:41.723750016 -0500
+@@ -8,6 +8,9 @@
+ #if !(defined(MEMBARRIER_CMD_PRIVATE_EXPEDITED) || (defined(HAVE_DECL_MEMBARRIER_CMD_PRIVATE_EXPEDITED) && HAVE_DECL_MEMBARRIER_CMD_PRIVATE_EXPEDITED))
+ # define MEMBARRIER_CMD_PRIVATE_EXPEDITED 8
+ #endif
++#if !(defined(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED) || (defined(HAVE_DECL_MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED) && HAVE_DECL_MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED))
++# define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED 16
++#endif
+ 
+ #ifdef IN_MPERS
+ 
+@@ -20,6 +23,7 @@ const struct xlat membarrier_cmds[] = {
+  XLAT(MEMBARRIER_CMD_QUERY),
+  XLAT(MEMBARRIER_CMD_SHARED),
+  XLAT(MEMBARRIER_CMD_PRIVATE_EXPEDITED),
++ XLAT(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED),
+  XLAT_END
+ };
+ 
+diff -rup a/xlat/membarrier_cmds.in b/xlat/membarrier_cmds.in
+--- a/xlat/membarrier_cmds.in	2018-03-07 16:10:10.000000000 -0500
++++ b/xlat/membarrier_cmds.in	2018-03-07 16:10:36.597808417 -0500
+@@ -1,3 +1,4 @@
+ MEMBARRIER_CMD_QUERY			0
+ MEMBARRIER_CMD_SHARED			1
+ MEMBARRIER_CMD_PRIVATE_EXPEDITED	8
++MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED	16
diff --git a/SOURCES/strace-rh1562124.patch b/SOURCES/strace-rh1562124.patch
new file mode 100644
index 0000000..1f95d32
--- /dev/null
+++ b/SOURCES/strace-rh1562124.patch
@@ -0,0 +1,314 @@
+commit 79d10dfc20985225e4ea044d3875c4cea09053d7
+Author: Eugene Syromyatnikov <evgsyr@gmail.com>
+Date:   Wed Jan 24 09:55:50 2018 -0500
+
+    Update futex test in accordance with kernel's v4.15-rc7-202-gfbe0e83
+    
+    * futex.c (VALP, VALP_PR, VAL2P, VAL2P_PR): New macro definitions.
+    (main): Allow EINVAL on *REQUEUE* checks with VAL/VAL2 with higher bit
+    being set, check that the existing behaviour preserved with VALP/VAL2P
+    where higher bit is unset.
+
+diff -rup a/tests/futex.c b/tests/futex.c
+--- a/tests/futex.c	2017-05-22 13:33:51.000000000 -0400
++++ b/tests/futex.c	2018-04-03 12:12:08.445383018 -0400
+@@ -150,14 +150,20 @@ void invalid_op(int *val, int op, uint32
+ 	} while (0)
+ 
+ /* Value which differs from one stored in int *val */
+-# define VAL     ((unsigned long) 0xbadda7a0facefeedLLU)
+-# define VAL_PR  ((unsigned) VAL)
++# define VAL      ((unsigned long) 0xbadda7a0facefeedLLU)
++# define VAL_PR   ((unsigned) VAL)
+ 
+-# define VAL2    ((unsigned long) 0xbadda7a0ca7b100dLLU)
+-# define VAL2_PR ((unsigned) VAL2)
++# define VALP     ((unsigned long) 0xbadda7a01acefeedLLU)
++# define VALP_PR  ((unsigned) VALP)
+ 
+-# define VAL3    ((unsigned long) 0xbadda7a09caffee1LLU)
+-# define VAL3_PR ((unsigned) VAL3)
++# define VAL2     ((unsigned long) 0xbadda7a0ca7b100dLLU)
++# define VAL2_PR  ((unsigned) VAL2)
++
++# define VAL2P    ((unsigned long) 0xbadda7a07a7b100dLLU)
++# define VAL2P_PR ((unsigned) VAL2P)
++
++# define VAL3     ((unsigned long) 0xbadda7a09caffee1LLU)
++# define VAL3_PR  ((unsigned) VAL3)
+ 
+ int
+ main(int argc, char *argv[])
+@@ -417,16 +423,26 @@ main(int argc, char *argv[])
+ 
+ 	/* Trying to re-queue some processes but there's nothing to re-queue */
+ 	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VAL, VAL2, uaddr2, VAL3,
+-		(rc == 0));
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VALP, VAL2P, uaddr2, VAL3,
++		(rc == 0));
++	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, sprintrc(rc));
++
+ 	/* Trying to re-queue some processes but there's nothing to re-queue */
+ 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VAL, VAL2,
+-		uaddr2, VAL3, (rc == 0));
++		uaddr2, VAL3, (rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
+ 
++	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VALP,
++		VAL2P, uaddr2, VAL3, (rc == 0));
++	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, sprintrc(rc));
++
+ 	CHECK_INVALID_CLOCKRT(FUTEX_REQUEUE, ARG3 | ARG4 | ARG5, "%u", "%u",
+ 		"%#lx");
+ 
+@@ -443,22 +459,38 @@ main(int argc, char *argv[])
+ 
+ 	/* Comparison re-queue with wrong val value */
+ 	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, VAL3,
+-		(rc == -1) && (errno == EAGAIN));
++		(rc == -1) && (errno == EAGAIN || errno == EINVAL));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, VAL3_PR, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VALP, VAL2P, uaddr2, VAL3,
++		(rc == -1) && (errno == EAGAIN));
++	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, VAL3_PR, sprintrc(rc));
++
+ 	/* Successful comparison re-queue */
+ 	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, *uaddr,
+-		(rc == 0));
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VALP, VAL2P, uaddr2, *uaddr,
++		(rc == 0));
++	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, *uaddr, sprintrc(rc));
++
+ 	/* Successful comparison re-queue */
+ 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VAL,
+-		VAL2, uaddr2, *uaddr, (rc == 0));
++		VAL2, uaddr2, *uaddr,
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
+ 
++	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VALP,
++		VAL2P, uaddr2, *uaddr, (rc == 0));
++	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, *uaddr, sprintrc(rc));
++
+ 	CHECK_INVALID_CLOCKRT(FUTEX_CMP_REQUEUE, ARG3 | ARG4 | ARG5 | ARG6,
+ 		"%u", "%u", "%#lx", "%u");
+ 
+diff -rup a/tests-m32/futex.c b/tests-m32/futex.c
+--- a/tests-m32/futex.c	2017-05-22 13:33:51.000000000 -0400
++++ b/tests-m32/futex.c	2018-04-03 12:13:23.219848033 -0400
+@@ -150,14 +150,20 @@ void invalid_op(int *val, int op, uint32
+ 	} while (0)
+ 
+ /* Value which differs from one stored in int *val */
+-# define VAL     ((unsigned long) 0xbadda7a0facefeedLLU)
+-# define VAL_PR  ((unsigned) VAL)
++# define VAL      ((unsigned long) 0xbadda7a0facefeedLLU)
++# define VAL_PR   ((unsigned) VAL)
+ 
+-# define VAL2    ((unsigned long) 0xbadda7a0ca7b100dLLU)
+-# define VAL2_PR ((unsigned) VAL2)
++# define VALP     ((unsigned long) 0xbadda7a01acefeedLLU)
++# define VALP_PR  ((unsigned) VALP)
+ 
+-# define VAL3    ((unsigned long) 0xbadda7a09caffee1LLU)
+-# define VAL3_PR ((unsigned) VAL3)
++# define VAL2     ((unsigned long) 0xbadda7a0ca7b100dLLU)
++# define VAL2_PR  ((unsigned) VAL2)
++
++# define VAL2P    ((unsigned long) 0xbadda7a07a7b100dLLU)
++# define VAL2P_PR ((unsigned) VAL2P)
++
++# define VAL3     ((unsigned long) 0xbadda7a09caffee1LLU)
++# define VAL3_PR  ((unsigned) VAL3)
+ 
+ int
+ main(int argc, char *argv[])
+@@ -417,16 +423,26 @@ main(int argc, char *argv[])
+ 
+ 	/* Trying to re-queue some processes but there's nothing to re-queue */
+ 	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VAL, VAL2, uaddr2, VAL3,
+-		(rc == 0));
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VALP, VAL2P, uaddr2, VAL3,
++		(rc == 0));
++	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, sprintrc(rc));
++
+ 	/* Trying to re-queue some processes but there's nothing to re-queue */
+ 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VAL, VAL2,
+-		uaddr2, VAL3, (rc == 0));
++		uaddr2, VAL3, (rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
+ 
++	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VALP,
++		VAL2P, uaddr2, VAL3, (rc == 0));
++	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, sprintrc(rc));
++
+ 	CHECK_INVALID_CLOCKRT(FUTEX_REQUEUE, ARG3 | ARG4 | ARG5, "%u", "%u",
+ 		"%#lx");
+ 
+@@ -443,22 +459,38 @@ main(int argc, char *argv[])
+ 
+ 	/* Comparison re-queue with wrong val value */
+ 	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, VAL3,
+-		(rc == -1) && (errno == EAGAIN));
++		(rc == -1) && (errno == EAGAIN || errno == EINVAL));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, VAL3_PR, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VALP, VAL2P, uaddr2, VAL3,
++		(rc == -1) && (errno == EAGAIN));
++	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, VAL3_PR, sprintrc(rc));
++
+ 	/* Successful comparison re-queue */
+ 	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, *uaddr,
+-		(rc == 0));
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VALP, VAL2P, uaddr2, *uaddr,
++		(rc == 0));
++	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, *uaddr, sprintrc(rc));
++
+ 	/* Successful comparison re-queue */
+ 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VAL,
+-		VAL2, uaddr2, *uaddr, (rc == 0));
++		VAL2, uaddr2, *uaddr,
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
+ 
++	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VALP,
++		VAL2P, uaddr2, *uaddr, (rc == 0));
++	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, *uaddr, sprintrc(rc));
++
+ 	CHECK_INVALID_CLOCKRT(FUTEX_CMP_REQUEUE, ARG3 | ARG4 | ARG5 | ARG6,
+ 		"%u", "%u", "%#lx", "%u");
+ 
+diff -rup a/tests-mx32/futex.c b/tests-mx32/futex.c
+--- a/tests-mx32/futex.c	2017-05-22 13:33:51.000000000 -0400
++++ b/tests-mx32/futex.c	2018-04-03 12:13:25.235860501 -0400
+@@ -150,14 +150,20 @@ void invalid_op(int *val, int op, uint32
+ 	} while (0)
+ 
+ /* Value which differs from one stored in int *val */
+-# define VAL     ((unsigned long) 0xbadda7a0facefeedLLU)
+-# define VAL_PR  ((unsigned) VAL)
++# define VAL      ((unsigned long) 0xbadda7a0facefeedLLU)
++# define VAL_PR   ((unsigned) VAL)
+ 
+-# define VAL2    ((unsigned long) 0xbadda7a0ca7b100dLLU)
+-# define VAL2_PR ((unsigned) VAL2)
++# define VALP     ((unsigned long) 0xbadda7a01acefeedLLU)
++# define VALP_PR  ((unsigned) VALP)
+ 
+-# define VAL3    ((unsigned long) 0xbadda7a09caffee1LLU)
+-# define VAL3_PR ((unsigned) VAL3)
++# define VAL2     ((unsigned long) 0xbadda7a0ca7b100dLLU)
++# define VAL2_PR  ((unsigned) VAL2)
++
++# define VAL2P    ((unsigned long) 0xbadda7a07a7b100dLLU)
++# define VAL2P_PR ((unsigned) VAL2P)
++
++# define VAL3     ((unsigned long) 0xbadda7a09caffee1LLU)
++# define VAL3_PR  ((unsigned) VAL3)
+ 
+ int
+ main(int argc, char *argv[])
+@@ -417,16 +423,26 @@ main(int argc, char *argv[])
+ 
+ 	/* Trying to re-queue some processes but there's nothing to re-queue */
+ 	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VAL, VAL2, uaddr2, VAL3,
+-		(rc == 0));
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VALP, VAL2P, uaddr2, VAL3,
++		(rc == 0));
++	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, sprintrc(rc));
++
+ 	/* Trying to re-queue some processes but there's nothing to re-queue */
+ 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VAL, VAL2,
+-		uaddr2, VAL3, (rc == 0));
++		uaddr2, VAL3, (rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
+ 
++	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VALP,
++		VAL2P, uaddr2, VAL3, (rc == 0));
++	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, sprintrc(rc));
++
+ 	CHECK_INVALID_CLOCKRT(FUTEX_REQUEUE, ARG3 | ARG4 | ARG5, "%u", "%u",
+ 		"%#lx");
+ 
+@@ -443,22 +459,38 @@ main(int argc, char *argv[])
+ 
+ 	/* Comparison re-queue with wrong val value */
+ 	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, VAL3,
+-		(rc == -1) && (errno == EAGAIN));
++		(rc == -1) && (errno == EAGAIN || errno == EINVAL));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, VAL3_PR, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VALP, VAL2P, uaddr2, VAL3,
++		(rc == -1) && (errno == EAGAIN));
++	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, VAL3_PR, sprintrc(rc));
++
+ 	/* Successful comparison re-queue */
+ 	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, *uaddr,
+-		(rc == 0));
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
+ 
++	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VALP, VAL2P, uaddr2, *uaddr,
++		(rc == 0));
++	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, *uaddr, sprintrc(rc));
++
+ 	/* Successful comparison re-queue */
+ 	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VAL,
+-		VAL2, uaddr2, *uaddr, (rc == 0));
++		VAL2, uaddr2, *uaddr,
++		(rc == 0) || ((rc == -1) && (errno == EINVAL)));
+ 	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
+ 		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
+ 
++	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VALP,
++		VAL2P, uaddr2, *uaddr, (rc == 0));
++	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
++		uaddr, VALP_PR, VAL2P_PR, uaddr2, *uaddr, sprintrc(rc));
++
+ 	CHECK_INVALID_CLOCKRT(FUTEX_CMP_REQUEUE, ARG3 | ARG4 | ARG5 | ARG6,
+ 		"%u", "%u", "%#lx", "%u");
+ 
diff --git a/SPECS/strace.spec b/SPECS/strace.spec
index 771207e..e52033c 100644
--- a/SPECS/strace.spec
+++ b/SPECS/strace.spec
@@ -3,7 +3,7 @@
 Summary: Tracks and displays system calls associated with a running process
 Name: %{?scl_prefix}strace
 Version: 4.17
-Release: 3%{?dist}
+Release: 7%{?dist}
 License: BSD
 Group: Development/Debuggers
 URL: http://sourceforge.net/projects/strace/
@@ -37,6 +37,9 @@ Patch3000: strace-no-rhel5-tests.patch
 Patch3001: strace-rpmbuild-m64.patch
 Patch3002: strace-rh1377847.patch
 Patch3003: strace-rh1276132.patch
+Patch3004: strace-rh1540954-1.patch
+Patch3005: strace-rh1540954-2.patch
+Patch3006: strace-rh1562124.patch
 
 # In the past we had a separate strace64 package, these days the
 # stndard 64 bit build provides that functionality.  For tracing
@@ -88,6 +91,9 @@ This package provides the `strace32' program to trace 32-bit processes on
 %patch3001 -p1
 %patch3002 -p1
 %patch3003 -p1
+%patch3004 -p1
+%patch3005 -p1
+%patch3006 -p1
 
 %build
 uname -a
@@ -135,6 +141,18 @@ rm -rf %{buildroot}
 %endif
 
 %changelog
+* Tue Apr  3 2018 DJ Delorie <dj@redhat.com> - 4.17-7
+- Update futex 32-bit tests for newer kernels. (#1562124)
+
+* Tue Apr  3 2018 DJ Delorie <dj@redhat.com> - 4.17-6
+- Update futex tests for newer kernels. (#1562124)
+
+* Thu Mar  8 2018 DJ Delorie <dj@redhat.com> - 4.17-5
+- Add regenerated files to previous commit. (#1540954)
+
+* Wed Feb 21 2018 DJ Delorie <dj@redhat.com> - 4.17-4
+- Handle MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED (#1540954)
+
 * Fri Aug 11 2017 DJ Delorie <dj@redhat.com> - 4.17-3
 - Handle PTRACE_CONT (#1276132)