svn commit: r301599 - user/pho/stress2/misc
Peter Holm
pho at FreeBSD.org
Wed Jun 8 11:16:39 UTC 2016
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);
+}
More information about the svn-src-user
mailing list