Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Jun 2016 11:16:37 +0000 (UTC)
From:      Peter Holm <pho@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r301599 - user/pho/stress2/misc
Message-ID:  <201606081116.u58BGbD2088595@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pho
Date: Wed Jun  8 11:16:37 2016
New Revision: 301599
URL: https://svnweb.freebsd.org/changeset/base/301599

Log:
  Added new pipe(2) tests.
  
  Sponsored by:	EMC / Isilon Storage Division

Added:
  user/pho/stress2/misc/context.sh   (contents, props changed)
  user/pho/stress2/misc/context2.sh   (contents, props changed)
  user/pho/stress2/misc/pipe.sh   (contents, props changed)
  user/pho/stress2/misc/pipe2.sh   (contents, props changed)

Added: user/pho/stress2/misc/context.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/pho/stress2/misc/context.sh	Wed Jun  8 11:16:37 2016	(r301599)
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2016 EMC Corp.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+. ../default.cfg
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > context.c
+mycc -o context -Wall -Wextra -O2 -g context.c || exit 1
+rm -f context.c
+[ -d $RUNDIR ] || mkdir -p $RUNDIR
+cd $RUNDIR
+
+daemon sh -c "(cd $here/../testcases/swap; ./swap -t 10m -i 20)" > \
+    /dev/null 2>&1
+for i in `jot 4`; do
+	/tmp/context &
+	pids="$pids $!"
+done
+s=0
+for i in $pids; do
+	wait $i
+	[ $? -ne 0 ] && s=$((s + 1))
+done
+while pgrep -q swap; do
+	pkill -9 swap
+done
+rm -f /tmp/context
+exit $s
+EOF
+/*
+ * Inspired by lmbench-3.0-a9/src/lat_ctx.c
+ * Pass a token thru pipes to CHILDREN+1 processes in a circular list
+ */
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#define CHILDREN 64
+#define RUNTIME 300
+
+int fds[CHILDREN +1 ][2];
+pid_t pid[CHILDREN];
+
+void
+handler(int s __unused)
+{
+	_exit(0);
+}
+
+int
+main(void)
+{
+	time_t start;
+	int i, j;
+	int token;
+
+	for (i = 0; i < CHILDREN + 1; i++) {
+		if (pipe(fds[i]) == -1)
+			err(1, "pipe");
+	}
+
+	signal(SIGHUP, handler);
+	start = time(NULL);
+	for (i = 0; i < CHILDREN; i++) {
+		pid[i] = fork();
+		if (pid[i] == -1) {
+			perror("fork");
+			exit(2);
+		}
+
+		if (pid[i] == 0) {	/* child */
+			for (;;) {
+				if (read(fds[i][0], &token, sizeof(token))
+				    != sizeof(token))
+					err(1, "read pipe 2");
+				if (write(fds[i+1][1], &token, sizeof(token))
+				    != sizeof(token))
+					err(1, "write pipe 1");
+			}
+		}
+
+	} 	/* parent */
+
+	for (j = 0; time(NULL) - start < RUNTIME; j++) {
+		token = j;
+		if (write(fds[0][1], &token, sizeof(token)) != sizeof(token))
+			err(1, "write pipe 2");
+		if (read(fds[CHILDREN][0], &token, sizeof(token))
+		    != sizeof(token))
+			err(1, "read pipe 1");
+	}
+
+	for (i = 0; i < CHILDREN; i++)
+		kill(pid[i], SIGHUP);
+
+        return (0);
+}

Added: user/pho/stress2/misc/context2.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/pho/stress2/misc/context2.sh	Wed Jun  8 11:16:37 2016	(r301599)
@@ -0,0 +1,128 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2016 EMC Corp.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+. ../default.cfg
+
+here=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $here/$0 > context2.c
+mycc -o context2 -Wall -Wextra -O2 context2.c -lpthread || exit 1
+rm -f context2.c
+[ -d $RUNDIR ] || mkdir -p $RUNDIR
+cd $RUNDIR
+
+daemon sh -c "(cd $here/../testcases/swap; ./swap -t 10m -i 20)" > \
+    /dev/null 2>&1
+for i in `jot 4`; do
+	/tmp/context2 &
+done
+wait
+while pgrep -q swap; do
+	pkill -9 swap
+done
+rm -f /tmp/context2
+exit 0
+EOF
+/*
+ * Inspired by lmbench-3.0-a9/src/lat_ctx.c
+ * Pass a token thru pipes to NTHREADS+1 threads in a circular list.
+ */
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define NTHREADS 64
+#define RUNTIME 300
+
+pid_t pid[NTHREADS];
+int fds[NTHREADS+1][2];
+
+void *
+thr_routine(void *arg)
+{
+	int i;
+	int token;
+
+	i = (int)arg;
+	for (;;) {
+		if (read(fds[i][0], &token, sizeof(token)) != sizeof(token))
+			err(1, "read pipe 2");
+		token++;
+		if (write(fds[i+1][1], &token, sizeof(token)) != sizeof(token))
+			err(1, "write pipe 1");
+	}
+	return (0);
+}
+
+int
+main(void)
+{
+	pthread_t threads[NTHREADS];
+	time_t start;
+	int i, r, token;
+
+	for (i = 0; i < NTHREADS + 1; i++) {
+		if (pipe(fds[i]) == -1)
+			err(1, "pipe");
+	}
+
+	for (i = 0; i < NTHREADS; i++)
+		if ((r = pthread_create(&threads[i], NULL, thr_routine,
+		    (void *)i)) != 0)
+			errc(1, r, "pthread_create(): %s\n", strerror(r));
+
+
+	start = time(NULL);
+	while (time(NULL) - start < RUNTIME) {
+		token = 0;
+		if (write(fds[0][1], &token, sizeof(token)) != sizeof(token))
+			err(1, "write pipe 2");
+		if (read(fds[NTHREADS][0], &token, sizeof(token)) !=
+		    sizeof(token))
+			err(1, "read pipe 1");
+	}
+
+	for (i = 0; i < NTHREADS; i++)
+		if ((r = pthread_cancel(threads[i])) != 0)
+			errc(1, r, "pthread_cancel(%d)", i);
+	for (i = 0; i < NTHREADS; i++)
+		if ((r = pthread_join(threads[i], NULL)) != 0)
+			errc(1, r, "pthread_join(%d)", i);
+
+        return (0);
+}

Added: user/pho/stress2/misc/pipe.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/pho/stress2/misc/pipe.sh	Wed Jun  8 11:16:37 2016	(r301599)
@@ -0,0 +1,134 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2016 EMC Corp.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# Stress vm object collapse.
+
+# "panic: backing_object 0xfffff800a018f420 was somehow re-referenced during
+# collapse!" seen with uma_zalloc_arg fail point enabled.
+
+. ../default.cfg
+
+dir=/tmp
+odir=`pwd`
+cd $dir
+sed '1,/^EOF/d' < $odir/$0 > $dir/pipe.c
+mycc -o pipe -Wall -Wextra -O0 -g pipe.c || exit 1
+rm -f pipe.c
+cd $odir
+
+daemon sh -c '(cd ../testcases/swap; ./swap -t 10m -i 20)' > /dev/null 2>&1
+sleep 1
+e=0
+export e
+start=`date '+%s'`
+while [ $((`date '+%s'` - start)) -lt 300 ]; do
+	for i in `jot $(sysctl -n hw.ncpu)`; do
+		/tmp/pipe &
+		pids="$pids $!"
+	done
+	for i in $pids; do
+		wait $i
+		[ $? -ne 0 ] && e=$((e + 1))
+	done
+	pids=""
+	[ $e -ne 0 ] && break
+done
+while pgrep -q swap; do
+	pkill -9 swap
+done
+rm -rf /tmp/pipe pipe.core
+exit $e
+
+EOF
+#include <sys/wait.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+#define PIPES 64
+#define RUNTIME 300
+
+int
+test(void)
+{
+	int c, e, status;
+	int fds[PIPES][2];
+	int i;
+
+	for (i = 0; i < PIPES; i++) {
+		if (pipe(fds[i]) == -1)
+			err(1, "pipe");
+	}
+	c = e = 0;
+	if (write(fds[0][1], &c, sizeof(c)) != sizeof(c))
+		err(1, "pipe write");
+	for (i = 0; i < PIPES; i++) {
+		if (fork() == 0) {
+			close(fds[i][1]);
+			if (read(fds[i][0], &c, sizeof(c)) != sizeof(c))
+				err(1, "pipe read");
+#if defined(DEBUG)
+			fprintf(stderr, "pid %d: i = %d: read %d\n", getpid(),
+			    i, c);
+#endif
+			c++;
+			if (i != PIPES - 1)
+				if (write(fds[i + 1][1], &c, sizeof(c)) !=
+				    sizeof(c))
+					err(1, "pipe write");
+
+			_exit(0);
+		}
+		close(fds[i][0]);
+		close(fds[i][1]);
+	}
+	for (i = 0; i < PIPES; i++) {
+		wait(&status);
+		e += status == 0 ? 0 : 1;
+	}
+
+	return (e);
+}
+
+int
+main(void)
+{
+	time_t start;
+	int e;
+
+	e = 0;
+	start = time(NULL);
+	while (time(NULL) - start < RUNTIME && e == 0)
+		e = test();
+
+	return (e);
+}

Added: user/pho/stress2/misc/pipe2.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/pho/stress2/misc/pipe2.sh	Wed Jun  8 11:16:37 2016	(r301599)
@@ -0,0 +1,166 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2016 EMC Corp.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# pipe(2) test
+
+. ../default.cfg
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+dir=/tmp
+odir=`pwd`
+cd $dir
+sed '1,/^EOF/d' < $odir/$0 > $dir/pipe2.c
+mycc -o pipe2 -Wall -Wextra -O0 -g pipe2.c || exit 1
+rm -f pipe2.c
+
+daemon sh -c "(cd $odir/../testcases/swap; ./swap -t 10m -i 20)" > \
+    /dev/null 2>&1
+sleep 10
+
+su $testuser -c /tmp/pipe2
+s=$?
+
+while pgrep -q swap; do
+	pkill -9 swap
+done
+
+rm -rf /tmp/pipe2
+exit $s
+
+EOF
+#include <sys/param.h>
+#include <sys/mman.h>
+
+#include <machine/atomic.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+volatile u_int *share, *share2;
+
+#define R1 1 /* sync start  */
+#define R2 2 /* forks       */
+
+#define PIPES 128
+#define PARALLEL 32
+
+static void
+hand(int i __unused) {	/* handler */
+	fprintf(stderr, "Timed out\n");
+	_exit(1);
+}
+
+void
+test(void)
+{
+	size_t len;
+	int fds[2], r;
+	int token;
+
+	len = PAGE_SIZE;
+	if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE,
+	    MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
+		err(1, "mmap");
+
+	if (pipe(fds) == -1)
+		err(1, "pipe");
+	token = 0;
+	write(fds[1], &token, sizeof(token));
+	for (;;) {
+		if (share[R2] >= PIPES)
+			break;
+		if ((r = fork()) == 0) {
+			atomic_add_int(&share[R2], 1);
+			if (read(fds[0], &token, sizeof(token)) != sizeof(token))
+				err(1, "read");
+			close(fds[0]);
+			if (pipe(fds) == -1)
+				err(1, "pipe");
+			token++;
+			if (write(fds[1], &token, sizeof(token)) != sizeof(token))
+				err(1, "write");
+		}
+		if (r == -1)
+			err(1, "fork()");
+		if (r != 0)
+			_exit(0);
+	}
+
+	if (share[R2] == PIPES) {
+#if defined(DEBUG)
+		if (read(fds[0], &token, sizeof(token)) != sizeof(token))
+			err(1, "final read");
+		fprintf(stderr, "FINAL read %d from %d\n", token, fds[0]);
+#endif
+		atomic_add_int(&share2[R1], 1);
+	}
+	_exit(0);
+}
+
+int
+main(void)
+{
+	struct sigaction sa;
+	size_t len;
+	int i;
+
+	len = PAGE_SIZE;
+	if ((share2 = mmap(NULL, len, PROT_READ | PROT_WRITE,
+	    MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
+		err(1, "mmap");
+
+	sa.sa_handler = SIG_IGN;
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = 0;
+	if (sigaction(SIGCHLD, &sa, 0) == -1)
+		err(1, "sigaction");
+
+	for (i = 0; i < PARALLEL; i++) {
+		if (fork() == 0)
+			test();
+	}
+
+
+	signal(SIGALRM, hand);
+	alarm(60);
+	while (share2[R1] != PARALLEL) {
+		sleep(1);
+#if defined(DEBUG)
+		fprintf(stderr, "share2 = %d\n", share2[R1]);
+#endif
+	}
+
+	return (0);
+}



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