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>