[DTrace-devel] [PATCH] Clean up fbtprovider tests

eugene.loh at oracle.com eugene.loh at oracle.com
Wed Sep 15 17:39:34 PDT 2021


From: Eugene Loh <eugene.loh at oracle.com>

Specifically, add a futex trigger to the test suite and have tests
match the trigger pid rather than the dtrace pid.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 test/triggers/Build                       |  13 +-
 test/triggers/futex.c                     | 152 ++++++++++++++++++++++
 test/unittest/fbtprovider/tst.entry.d     |  14 +-
 test/unittest/fbtprovider/tst.entryargs.d |  49 ++++---
 test/unittest/fbtprovider/tst.tls.d       |   8 +-
 test/unittest/fbtprovider/tst.tls2.d      |  12 +-
 6 files changed, 206 insertions(+), 42 deletions(-)
 create mode 100644 test/triggers/futex.c

diff --git a/test/triggers/Build b/test/triggers/Build
index 54e1aff3..dcafa4a2 100644
--- a/test/triggers/Build
+++ b/test/triggers/Build
@@ -3,7 +3,14 @@
 # Licensed under the Universal Permissive License v 1.0 as shown at
 # http://oss.oracle.com/licenses/upl.
 
-EXTERNAL_64BIT_TRIGGERS = testprobe readwholedir mmap bogus-ioctl open delaydie pid-tst-args1 pid-tst-float pid-tst-fork pid-tst-gcc pid-tst-ret1 pid-tst-ret2 pid-tst-vfork pid-tst-weak1 pid-tst-weak2 proc-tst-sigwait proc-tst-omp proc-tst-pthread-exec profile-tst-ufuncsort raise-tst-raise1 raise-tst-raise2 raise-tst-raise3 syscall-tst-args ustack-tst-basic ustack-tst-bigstack ustack-tst-bigstack-spin ustack-tst-spin ustack-tst-mtspin visible-constructor visible-constructor-static visible-constructor-static-unstripped
+EXTERNAL_64BIT_TRIGGERS = testprobe readwholedir mmap bogus-ioctl open delaydie futex \
+    pid-tst-args1 pid-tst-float pid-tst-fork pid-tst-gcc \
+    pid-tst-ret1 pid-tst-ret2 pid-tst-vfork pid-tst-weak1 pid-tst-weak2 \
+    proc-tst-sigwait proc-tst-omp proc-tst-pthread-exec profile-tst-ufuncsort \
+    raise-tst-raise1 raise-tst-raise2 raise-tst-raise3 syscall-tst-args \
+    ustack-tst-basic ustack-tst-bigstack ustack-tst-bigstack-spin \
+    ustack-tst-spin ustack-tst-mtspin \
+    visible-constructor visible-constructor-static visible-constructor-static-unstripped
 
 EXTERNAL_64BIT_SDT_TRIGGERS = usdt-tst-argmap usdt-tst-args usdt-tst-forker usdt-tst-special
 EXTERNAL_64BIT_TRIGGERS += $(EXTERNAL_64BIT_SDT_TRIGGERS)
@@ -11,7 +18,9 @@ EXTERNAL_64BIT_TRIGGERS += $(EXTERNAL_64BIT_SDT_TRIGGERS)
 EXTERNAL_32BIT_TRIGGERS := visible-constructor-32
 EXTERNAL_TRIGGERS = $(EXTERNAL_64BIT_TRIGGERS) $(if $(NATIVE_BITNESS_ONLY),,$(EXTERNAL_32BIT_TRIGGERS))
 
-INTERNAL_64BIT_TRIGGERS = libproc-pldd libproc-consistency libproc-sleeper libproc-sleeper-pie libproc-dlmadopen libproc-lookup-by-name libproc-lookup-victim libproc-execing-bkpts libproc-execing-bkpts-victim
+INTERNAL_64BIT_TRIGGERS = libproc-pldd libproc-consistency libproc-sleeper \
+    libproc-sleeper-pie libproc-dlmadopen libproc-lookup-by-name \
+    libproc-lookup-victim libproc-execing-bkpts libproc-execing-bkpts-victim
 INTERNAL_32BIT_TRIGGERS := libproc-sleeper-32 libproc-sleeper-pie-32
 INTERNAL_TRIGGERS = $(INTERNAL_64BIT_TRIGGERS) $(if $(NATIVE_BITNESS_ONLY),,$(INTERNAL_32BIT_TRIGGERS))
 
diff --git a/test/triggers/futex.c b/test/triggers/futex.c
new file mode 100644
index 00000000..a9f3611a
--- /dev/null
+++ b/test/triggers/futex.c
@@ -0,0 +1,152 @@
+/*
+ * THIS PROGRAM IS ADAPTED FROM THE futex MAN PAGE.
+ *
+ * futex_demo.c
+ *
+ * Usage: futex_demo [nloops] (Default: 5)
+ *
+ * Demonstrate the use of futexes in a program where parent and child
+ * use a pair of futexes located inside a shared anonymous mapping to
+ * synchronize access to a shared resource: the terminal. The two
+ * processes each write 'num-loops' messages to the terminal and employ
+ * a synchronization protocol that ensures that they alternate in
+ * writing messages.
+ */
+/* #define _GNU_SOURCE */
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
+#include <linux/futex.h>
+#include <sys/time.h>
+
+#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
+                        } while (0)
+
+static int *futex1, *futex2, *iaddr;
+
+static int
+futex(int *uaddr, int futex_op, int val,
+      const struct timespec *timeout, int *uaddr2, int val3)
+{
+	return syscall(SYS_futex, uaddr, futex_op, val, timeout, uaddr, val3);
+}
+
+/*
+ * Acquire the futex pointed to by 'futexp': wait for its value to
+ * become 1, and then set the value to 0.
+ */
+
+static void
+fwait(int *futexp)
+{
+	int s;
+
+	/*
+	 * __sync_bool_compare_and_swap(ptr, oldval, newval) is a gcc
+	 * built-in function.  It atomically performs the equivalent of:
+	 *
+	 *     if (*ptr == oldval)
+	 *         *ptr = newval;
+	 *
+	 * It returns true if the test yielded true and *ptr was updated.
+	 * The alternative here would be to employ the equivalent atomic
+	 * machine-language instructions.  For further information, see
+	 * the GCC Manual.
+	 */
+
+	while (1) {
+
+		/* Is the futex available? */
+
+		if (__sync_bool_compare_and_swap(futexp, 1, 0))
+			break;      /* Yes */
+
+		/* Futex is not available; wait */
+
+		s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);
+		if (s == -1 && errno != EAGAIN)
+			errExit("futex-FUTEX_WAIT");
+	}
+}
+
+/*
+ * Release the futex pointed to by 'futexp': if the futex currently
+ * has the value 0, set its value to 1 and the wake any futex waiters,
+ * so that if the peer is blocked in fpost(), it can proceed.
+ **/
+
+static void
+fpost(int *futexp)
+{
+	int s;
+
+	/* __sync_bool_compare_and_swap() was described in comments above */
+
+	if (__sync_bool_compare_and_swap(futexp, 0, 1)) {
+
+		s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);
+		if (s  == -1)
+			errExit("futex-FUTEX_WAKE");
+	}
+}
+
+int
+main(int argc, char *argv[])
+{
+	pid_t childPid;
+	int j, nloops;
+
+	setbuf(stdout, NULL);
+
+	nloops = (argc > 1) ? atoi(argv[1]) : 5;
+
+	/*
+	 * Create a shared anonymous mapping that will hold the futexes.
+	 * Since the futexes are being shared between processes, we
+	 * subsequently use the "shared" futex operations (i.e., not the
+	 * ones suffixed "_PRIVATE").
+	 */
+
+	iaddr = mmap(NULL, sizeof(int) * 2, PROT_READ | PROT_WRITE,
+	            MAP_ANONYMOUS | MAP_SHARED, -1, 0);
+	if (iaddr == MAP_FAILED)
+		errExit("mmap");
+
+	futex1 = &iaddr[0];
+	futex2 = &iaddr[1];
+
+	*futex1 = 0;        /* State: unavailable */
+	*futex2 = 1;        /* State: available */
+
+	/* Create a child process that inherits the shared anonymous mapping. */
+
+	childPid = fork();
+	if (childPid == -1)
+		errExit("fork");
+
+	if (childPid == 0) {        /* Child */
+		for (j = 0; j < nloops; j++) {
+			fwait(futex1);
+			printf("Child  (%ld) %d\n", (long) getpid(), j);
+			fpost(futex2);
+		}
+
+		exit(EXIT_SUCCESS);
+	}
+
+	/* Parent falls through to here */
+
+	for (j = 0; j < nloops; j++) {
+		fwait(futex2);
+		printf("Parent (%ld) %d\n", (long) getpid(), j);
+		fpost(futex1);
+	}
+
+	wait(NULL);
+
+	exit(EXIT_SUCCESS);
+}
diff --git a/test/unittest/fbtprovider/tst.entry.d b/test/unittest/fbtprovider/tst.entry.d
index 0a88d15c..25fc6794 100644
--- a/test/unittest/fbtprovider/tst.entry.d
+++ b/test/unittest/fbtprovider/tst.entry.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -13,32 +13,32 @@
  * SECTION: FBT Provider/Probes
  */
 
-/* @@xfail: dtv2 */
 /* @@runtest-opts: -Z */
+/* @@trigger: futex */
 
 #pragma D option quiet
 #pragma D option statusrate=10ms
 
 BEGIN
 {
-	me = pid;
 	num_entry = 0;
 }
 
 syscall::futex:entry
-/me == pid/
+/pid == $target/
 {
 	num_entry++;
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0/
 {
 }
 
 syscall::futex:return
-/me == pid && num_entry > 0/
+/pid == $target && num_entry > 0/
 {
 	exit(0);
 }
diff --git a/test/unittest/fbtprovider/tst.entryargs.d b/test/unittest/fbtprovider/tst.entryargs.d
index a20f9352..fccdd1be 100644
--- a/test/unittest/fbtprovider/tst.entryargs.d
+++ b/test/unittest/fbtprovider/tst.entryargs.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -11,20 +11,19 @@
  * SECTION: FBT Provider/Probes
  */
 
-/* @@xfail: dtv2 */
 /* @@runtest-opts: -Z */
+/* @@trigger: futex */
 
 #pragma D option quiet
 #pragma D option statusrate=10ms
 
 BEGIN
 {
-	me = pid;
 	num_entry = 0;
 }
 
 syscall::futex:entry
-/me == pid/
+/pid == $target/
 {
 	num_entry++;
 	self->arg0 = arg0;
@@ -36,63 +35,71 @@ syscall::futex:entry
 }
 
 syscall::futex:entry
-/me == pid && num_entry > 0/
+/pid == $target && num_entry > 0/
 {
 	printf("args %x %x %x %x %x %x\n", arg0, arg1, arg2, arg3, arg4, arg5);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0/
 {
 	printf("args %x %x %x %x %x %x\n", arg0, arg1, arg2, arg3, arg4, arg5);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0 && self->arg0 != arg0/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0 && self->arg0 != arg0/
 {
 	printf("arg0 mismatch: %x vs %x\n", self->arg0, arg0);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0 && self->arg1 != arg1/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0 && self->arg1 != arg1/
 {
 	printf("arg1 mismatch: %x vs %x\n", self->arg1, arg1);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0 && self->arg2 != arg2/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0 && self->arg2 != arg2/
 {
 	printf("arg2 mismatch: %x vs %x\n", self->arg2, arg2);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0 && self->arg3 != arg3/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0 && self->arg3 != arg3/
 {
 	printf("arg3 mismatch: %x vs %x\n", self->arg3, arg3);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0 && self->arg4 != arg4/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0 && self->arg4 != arg4/
 {
 	printf("arg4 mismatch: %x vs %x\n", self->arg4, arg4);
 }
 
 fbt::SyS_futex:entry,
-fbt::__x64_sys_futex:entry
-/me == pid && num_entry > 0 && self->arg5 != arg5/
+fbt::__x64_sys_futex:entry,
+fbt::__arm64_sys_futex:entry
+/pid == $target && num_entry > 0 && self->arg5 != arg5/
 {
 	printf("arg5 mismatch: %x vs %x\n", self->arg5, arg5);
 }
 
 fbt::SyS_ioctl:return,
-fbt::__x64_sys_ioctl:return
-/me == pid && num_entry > 0/
+fbt::__x64_sys_ioctl:return,
+fbt::__arm64_sys_ioctl:return
+/pid == $target && num_entry > 0/
 {
 	exit(0);
 }
diff --git a/test/unittest/fbtprovider/tst.tls.d b/test/unittest/fbtprovider/tst.tls.d
index dd57f0c6..31f6a5dd 100644
--- a/test/unittest/fbtprovider/tst.tls.d
+++ b/test/unittest/fbtprovider/tst.tls.d
@@ -11,7 +11,6 @@
  * SECTION: FBT Provider/Probes
  */
 
-/* @@xfail: dtv2 */
 /* @@runtest-opts: -Z */
 /* @@trigger: pid-tst-args1 */
 
@@ -20,7 +19,6 @@
 
 BEGIN
 {
-	me = pid;
 	num_entry = 0;
 	num_return = 0;
 	fails = 0;
@@ -29,7 +27,7 @@ BEGIN
 fbt::SyS_ioctl:entry,
 fbt::__arm64_sys_ioctl:entry,
 fbt::__x64_sys_ioctl:entry
-/me == pid/
+/pid == $target/
 {
 	num_entry++;
 	self->token = pid;
@@ -38,7 +36,7 @@ fbt::__x64_sys_ioctl:entry
 fbt::SyS_ioctl:return,
 fbt::__arm64_sys_ioctl:return,
 fbt::__x64_sys_ioctl:return
-/me == pid && num_entry > 0/
+/pid == $target && num_entry > 0/
 {
 	num_return++;
 }
@@ -46,7 +44,7 @@ fbt::__x64_sys_ioctl:return
 fbt::SyS_ioctl:return,
 fbt::__arm64_sys_ioctl:return,
 fbt::__x64_sys_ioctl:return
-/me == pid && num_entry > 0 && self->token != pid/
+/pid == $target && num_entry > 0 && self->token != pid/
 {
 	fails++;
 }
diff --git a/test/unittest/fbtprovider/tst.tls2.d b/test/unittest/fbtprovider/tst.tls2.d
index e8c44eab..88b02299 100644
--- a/test/unittest/fbtprovider/tst.tls2.d
+++ b/test/unittest/fbtprovider/tst.tls2.d
@@ -11,7 +11,6 @@
  * SECTION: FBT Provider/Probes
  */
 
-/* @@xfail: dtv2 */
 /* @@runtest-opts: -Z */
 /* @@trigger: pid-tst-args1 */
 
@@ -20,14 +19,13 @@
 
 BEGIN
 {
-	me = pid;
 	num_entry = 0;
 	num_return = 0;
 	fails = 0;
 }
 
 syscall::ioctl:entry
-/me == pid/
+/pid == $target/
 {
 	num_entry++;
 	self->token = pid;
@@ -36,27 +34,27 @@ syscall::ioctl:entry
 fbt::SyS_ioctl:entry,
 fbt::__arm64_sys_ioctl:entry,
 fbt::__x64_sys_ioctl:entry
-/me == pid && num_entry > 0/
+/pid == $target && num_entry > 0/
 {
 }
 
 fbt::SyS_ioctl:return,
 fbt::__arm64_sys_ioctl:return,
 fbt::__x64_sys_ioctl:return
-/me == pid && num_entry > 0/
+/pid == $target && num_entry > 0/
 {
 }
 
 fbt::SyS_ioctl:return,
 fbt::__arm64_sys_ioctl:return,
 fbt::__x64_sys_ioctl:return
-/me == pid && num_entry > 0 && self->token != pid/
+/pid == $target && num_entry > 0 && self->token != pid/
 {
 	fails++;
 }
 
 syscall::ioctl:return
-/me == pid && num_entry > 0/
+/pid == $target && num_entry > 0/
 {
 	num_return++;
 }
-- 
2.18.4




More information about the DTrace-devel mailing list