[Midnightbsd-cvs] src [9353] trunk: Dtrace: enablings on defunct providers prevent providers from unregistering

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sat Mar 4 14:33:40 EST 2017


Revision: 9353
          http://svnweb.midnightbsd.org/src/?rev=9353
Author:   laffer1
Date:     2017-03-04 14:33:39 -0500 (Sat, 04 Mar 2017)
Log Message:
-----------
Dtrace: enablings on defunct providers prevent providers from unregistering

Modified Paths:
--------------
    trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreap.ksh
    trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreapring.ksh
    trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.reap.ksh
    trunk/sys/modules/dtrace/dtrace/Makefile

Modified: trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreap.ksh
===================================================================
--- trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreap.ksh	2017-03-04 19:32:15 UTC (rev 9352)
+++ trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreap.ksh	2017-03-04 19:33:39 UTC (rev 9353)
@@ -126,3 +126,131 @@
 /usr/bin/rm -rf $DIR
 
 exit $status
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2011, Joyent, Inc. All rights reserved.
+#
+
+if [ $# != 1 ]; then
+	echo expected one argument: '<'dtrace-path'>'
+	exit 2
+fi
+
+dtrace=$1
+DIR=/var/tmp/dtest.$$
+
+mkdir $DIR
+cd $DIR
+
+cat > test.c <<EOF
+#include <unistd.h>
+#include <sys/sdt.h>
+
+int
+main(int argc, char **argv)
+{
+	DTRACE_PROBE(test_prov, probe1);
+}
+EOF
+
+cat > prov.d <<EOF
+provider test_prov {
+	probe probe1();
+};
+EOF
+
+gcc -c test.c
+if [ $? -ne 0 ]; then
+	print -u2 "failed to compile test.c"
+	exit 1
+fi
+$dtrace -G -32 -s prov.d test.o
+if [ $? -ne 0 ]; then
+	print -u2 "failed to create DOF"
+	exit 1
+fi
+gcc -o test test.o prov.o
+if [ $? -ne 0 ]; then
+	print -u2 "failed to link final executable"
+	exit 1
+fi
+
+script()
+{
+	$dtrace -Zwqs /dev/stdin <<EOF
+
+	BEGIN
+	{
+		spec = speculation();
+		speculate(spec);
+		printf("this is speculative!\n");
+	}
+
+	test_prov*:::
+	{
+		probeid = id;
+	}
+
+	tick-1sec
+	/probeid == 0/
+	{
+		printf("launching test\n");
+		system("./test");
+	}
+
+	tick-1sec
+	/probeid != 0/
+	{
+		printf("attempting re-enabling\n");
+		system("dtrace -e -x errtags -i %d", probeid);
+		attempts++;
+	}
+
+	tick-1sec
+	/attempts > 10/
+	{
+		exit(0);
+	}
+EOF
+}
+
+script 2>&1 | tee test.out
+
+#
+# It should be true that our probe was not reaped after the provider was made
+# defunct: the speculative tracing action prevents reaping of any ECB in the
+# enabling.
+# 
+status=0
+
+if grep D_PDESC_INVAL test.out 2> /dev/null 1>&2 ; then
+	status=1
+else
+	grep D_PROC_GRAB test.out 2> /dev/null 1>&2
+	status=$?
+fi
+
+cd /
+/usr/bin/rm -rf $DIR
+
+exit $status

Modified: trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreapring.ksh
===================================================================
--- trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreapring.ksh	2017-03-04 19:32:15 UTC (rev 9352)
+++ trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.noreapring.ksh	2017-03-04 19:33:39 UTC (rev 9353)
@@ -122,3 +122,127 @@
 /usr/bin/rm -rf $DIR
 
 exit $status
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2011, Joyent, Inc. All rights reserved.
+#
+
+if [ $# != 1 ]; then
+	echo expected one argument: '<'dtrace-path'>'
+	exit 2
+fi
+
+dtrace=$1
+DIR=/var/tmp/dtest.$$
+
+mkdir $DIR
+cd $DIR
+
+cat > test.c <<EOF
+#include <unistd.h>
+#include <sys/sdt.h>
+
+int
+main(int argc, char **argv)
+{
+	DTRACE_PROBE(test_prov, probe1);
+}
+EOF
+
+cat > prov.d <<EOF
+provider test_prov {
+	probe probe1();
+};
+EOF
+
+gcc -c test.c
+if [ $? -ne 0 ]; then
+	print -u2 "failed to compile test.c"
+	exit 1
+fi
+$dtrace -G -32 -s prov.d test.o
+if [ $? -ne 0 ]; then
+	print -u2 "failed to create DOF"
+	exit 1
+fi
+gcc -o test test.o prov.o
+if [ $? -ne 0 ]; then
+	print -u2 "failed to link final executable"
+	exit 1
+fi
+
+script()
+{
+	$dtrace -Zwqs /dev/stdin <<EOF
+	test_prov*:::
+	{
+		probeid = id;
+	}
+
+	tick-1sec
+	/probeid == 0/
+	{
+		printf("launching test\n");
+		system("./test");
+	}
+
+	tick-1sec
+	/probeid != 0/
+	{
+		printf("attempting re-enabling\n");
+		system("dtrace -e -x errtags -i %d", probeid);
+		attempts++;
+	}
+
+	tick-1sec
+	/attempts > 10/
+	{
+		exit(0);
+	}
+EOF
+}
+
+$dtrace -x bufpolicy=ring -ZwqP test_prov\* > /dev/null 2>&1 &
+background=$!
+echo launched ring buffered enabling as pid $background
+script 2>&1 | tee test.out
+
+#
+# It should be true that our probe was not reaped after the provider was made
+# defunct: the active ring buffer in the earlier enabling prevents reaping of
+# any of the earlier enabling's ECBs.
+# 
+status=0
+
+if grep D_PDESC_INVAL test.out 2> /dev/null 1>&2 ; then
+	status=1
+else
+	grep D_PROC_GRAB test.out 2> /dev/null 1>&2
+	status=$?
+fi
+
+kill $background
+cd /
+/usr/bin/rm -rf $DIR
+
+exit $status

Modified: trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.reap.ksh
===================================================================
--- trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.reap.ksh	2017-03-04 19:32:15 UTC (rev 9352)
+++ trunk/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.reap.ksh	2017-03-04 19:33:39 UTC (rev 9353)
@@ -113,3 +113,118 @@
 /usr/bin/rm -rf $DIR
 
 exit $status
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2011, Joyent, Inc. All rights reserved.
+#
+
+if [ $# != 1 ]; then
+	echo expected one argument: '<'dtrace-path'>'
+	exit 2
+fi
+
+dtrace=$1
+DIR=/var/tmp/dtest.$$
+
+mkdir $DIR
+cd $DIR
+
+cat > test.c <<EOF
+#include <unistd.h>
+#include <sys/sdt.h>
+
+int
+main(int argc, char **argv)
+{
+	DTRACE_PROBE(test_prov, probe1);
+}
+EOF
+
+cat > prov.d <<EOF
+provider test_prov {
+	probe probe1();
+};
+EOF
+
+gcc -c test.c
+if [ $? -ne 0 ]; then
+	print -u2 "failed to compile test.c"
+	exit 1
+fi
+$dtrace -G -32 -s prov.d test.o
+if [ $? -ne 0 ]; then
+	print -u2 "failed to create DOF"
+	exit 1
+fi
+gcc -o test test.o prov.o
+if [ $? -ne 0 ]; then
+	print -u2 "failed to link final executable"
+	exit 1
+fi
+
+script()
+{
+	$dtrace -Zwqs /dev/stdin <<EOF
+	test_prov*:::
+	{
+		probeid = id;
+	}
+
+	tick-1sec
+	/probeid == 0/
+	{
+		printf("launching test\n");
+		system("./test");
+	}
+
+	tick-1sec
+	/probeid != 0/
+	{
+		printf("attempting re-enabling\n");
+		system("dtrace -e -x errtags -i %d", probeid);
+		attempts++;
+	}
+
+	tick-1sec
+	/attempts > 10/
+	{
+		exit(0);
+	}
+EOF
+}
+
+script 2>&1 | tee test.out
+
+#
+# It should be true that our probe was reaped over the course of the enabling,
+# causing the embedded DTrace invocation to fail on an invalid probe (that is,
+# D_PDESC_INVAL) instead of an inability to grab the underlying process
+# (D_PROC_GRAB).
+# 
+grep D_PDESC_INVAL test.out 2> /dev/null 1>&2
+status=$?
+
+cd /
+/usr/bin/rm -rf $DIR
+
+exit $status

Modified: trunk/sys/modules/dtrace/dtrace/Makefile
===================================================================
--- trunk/sys/modules/dtrace/dtrace/Makefile	2017-03-04 19:32:15 UTC (rev 9352)
+++ trunk/sys/modules/dtrace/dtrace/Makefile	2017-03-04 19:33:39 UTC (rev 9353)
@@ -1,8 +1,9 @@
-# $MidnightBSD: src/sys/modules/dtrace/dtrace/Makefile,v 1.1 2012/03/28 21:16:38 laffer1 Exp $
+# $MidnightBSD$
 
 ARCHDIR=	${MACHINE_CPUARCH}
 
 .PATH: ${.CURDIR}/../../../cddl/contrib/opensolaris/uts/common/dtrace
+.PATH: ${.CURDIR}/../../../cddl/compat/opensolaris/kern
 .PATH: ${.CURDIR}/../../../cddl/kern
 .PATH: ${.CURDIR}/../../../cddl/dev/dtrace
 .PATH: ${.CURDIR}/../../../cddl/dev/dtrace/${ARCHDIR}
@@ -26,6 +27,9 @@
 # These are needed for assym.s
 SRCS+=		opt_compat.h opt_kstack_pages.h opt_nfs.h opt_hwpmc_hooks.h
 
+#This is needed for dtrace.c
+SRCS += 	opensolaris_taskq.c
+
 .if ${MACHINE_CPUARCH} == "i386"
 SRCS+=		opt_apic.h
 .endif



More information about the Midnightbsd-cvs mailing list