Index: user/pho/stress2/misc/context2.sh =================================================================== --- user/pho/stress2/misc/context2.sh (revision 301636) +++ user/pho/stress2/misc/context2.sh (revision 301637) @@ -1,128 +1,131 @@ #!/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 #include #include #include #include #include #include #include #include #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; + i = (long)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; + long arg; 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++) + for (i = 0; i < NTHREADS; i++) { + arg = i; if ((r = pthread_create(&threads[i], NULL, thr_routine, - (void *)i)) != 0) + (void *)arg)) != 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); } Index: user/pho/stress2/misc/nfs15.sh =================================================================== --- user/pho/stress2/misc/nfs15.sh (revision 301636) +++ user/pho/stress2/misc/nfs15.sh (revision 301637) @@ -1,203 +1,203 @@ #!/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$ # # Test effort to reproduce reported: "observed a hang in a multi-threaded # process that had hit an assertion failure and was attempting to dump core". # Problem never seen. # Most interesting load are: # - coredumping of the multithreaded program with the current dir on NFS, # which also accesses NFS files; # - advisory locking tests on NFS files, while e.g. sending SIGSTOP/SIGCONT # to the test programs. [ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 . ../default.cfg [ -z "$nfs_export" ] && exit 0 ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || exit 0 here=`pwd` cd /tmp sed '1,/^EOF/d' < $here/$0 > nfs15.c mycc -o nfs15 -Wall -Wextra -O2 -g nfs15.c -lpthread || exit 1 rm -f nfs15.c cd $here mount | grep "on $mntpoint " | grep nfs > /dev/null && umount $mntpoint mount -t nfs -o tcp -o retrycnt=3 -o soft -o rw -o nolockd -o intr \ $nfs_export $mntpoint sleep 2 wd=$mntpoint/nfs15.dir rm -rf $wd mkdir $wd (cd $wd; /tmp/nfs15) rm -rf $wd while mount | grep "on $mntpoint " | grep -q nfs; do umount $mntpoint || sleep 1 done rm -f /tmp/nfs15 exit 0 EOF #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PARALLEL 4 #define RUNTIME 300 #define SYNC 0 volatile u_int *share; static void * t1(void *data __unused) { atomic_add_int(&share[SYNC], 1); usleep(arc4random() % 8000); raise(SIGABRT); return (NULL); } static void * t2(void *data __unused) { int fd, i, r; char file[80]; for (i = 0; i < 100; i++) { atomic_add_int(&share[SYNC], 1); snprintf(file, sizeof(file), "file.%06d", i); if ((fd = open(file, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE)) == -1) err(1, "open(%s)", file); do { r = lockf(fd, F_LOCK, 0); - } while (r == -1 & errno == EDEADLK); + } while (r == -1 && errno == EDEADLK); if (r == -1) err(1, "lockf(%s, F_LOCK)", file); write(fd, "x", 1); if (lseek(fd, 0, SEEK_SET) == -1) err(1, "lseek"); if (lockf(fd, F_ULOCK, 0) == -1) err(1, "lockf(%s, F_ULOCK)", file); close(fd); } return (NULL); } int test(void) { pthread_t tid[3]; int i, rc; for (i = 0; i < 10; i++) { if ((rc = pthread_create(&tid[0], NULL, t2, NULL)) == -1) errc(1, rc, "pthread_create"); if ((rc = pthread_create(&tid[1], NULL, t2, NULL)) == -1) errc(1, rc, "pthread_create"); if ((rc = pthread_create(&tid[2], NULL, t1, NULL)) == -1) errc(1, rc, "pthread_create"); if ((rc = pthread_join(tid[0], NULL)) == -1) errc(1, rc, "pthread_join"); if ((rc = pthread_join(tid[1], NULL)) == -1) errc(1, rc, "pthread_join"); if ((rc = pthread_join(tid[2], NULL)) == -1) errc(1, rc, "pthread_join"); } _exit(0); } int main(void) { pid_t pids[PARALLEL]; size_t len; time_t start; int i, status; len = PAGE_SIZE; if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) err(1, "mmap"); start = time(NULL); while (time(NULL) - start < RUNTIME) { for (i = 0; i < PARALLEL; i++) { if ((pids[i] = fork()) == 0) test(); } for(;;) { if (share[SYNC] > 0) atomic_add_int(&share[SYNC], -1); for (i = 0; i < PARALLEL; i++) kill(pids[i], SIGSTOP); usleep(100 + arc4random() % 1000); for (i = 0; i < PARALLEL; i++) kill(pids[i], SIGCONT); usleep(100 + arc4random() % 400); if (share[SYNC] == 0) { /* If all procs are done */ usleep(500); if (share[SYNC] == 0) break; } } for (i = 0; i < PARALLEL; i++) { if (waitpid(pids[i], &status, 0) != pids[i]) err(1, "waitpid"); } } return (0); } Index: user/pho/stress2/misc/nfs16.sh =================================================================== --- user/pho/stress2/misc/nfs16.sh (revision 301636) +++ user/pho/stress2/misc/nfs16.sh (revision 301637) @@ -1,198 +1,198 @@ #!/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$ # # Variation of nfs15.sh, using lockd(8). # "panic: Failed to register NFS lock locally - error=11" seen: # https://people.freebsd.org/~pho/stress/log/kostik897.txt [ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 . ../default.cfg [ -z "$nfs_export" ] && exit 0 ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || exit 0 here=`pwd` cd /tmp sed '1,/^EOF/d' < $here/$0 > nfs16.c mycc -o nfs16 -Wall -Wextra -O2 -g nfs16.c -lpthread || exit 1 rm -f nfs16.c cd $here mount | grep "on $mntpoint " | grep nfs > /dev/null && umount $mntpoint mount -t nfs -o tcp -o retrycnt=3 -o soft -o rw \ $nfs_export $mntpoint sleep 2 wd=$mntpoint/nfs16.dir rm -rf $wd mkdir $wd (cd $wd; /tmp/nfs16) rm -rf $wd while mount | grep "on $mntpoint " | grep -q nfs; do umount $mntpoint || sleep 1 done rm -f /tmp/nfs16 exit 0 EOF #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PARALLEL 4 #define RUNTIME 300 #define SYNC 0 volatile u_int *share; static void * t1(void *data __unused) { atomic_add_int(&share[SYNC], 1); usleep(arc4random() % 8000); raise(SIGABRT); return (NULL); } static void * t2(void *data __unused) { int fd, i, r; char file[80]; for (i = 0; i < 100; i++) { atomic_add_int(&share[SYNC], 1); snprintf(file, sizeof(file), "file.%06d", i); if ((fd = open(file, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE)) == -1) err(1, "open(%s)", file); do { r = lockf(fd, F_LOCK, 0); - } while (r == -1 & errno == EDEADLK); + } while (r == -1 && errno == EDEADLK); if (r == -1) err(1, "lockf(%s, F_LOCK)", file); write(fd, "x", 1); usleep(arc4random() % 1000); if (lseek(fd, 0, SEEK_SET) == -1) err(1, "lseek"); if (lockf(fd, F_ULOCK, 0) == -1) err(1, "lockf(%s, F_ULOCK)", file); close(fd); } return (NULL); } int test(void) { pthread_t tid[3]; int i, rc; for (i = 0; i < 10; i++) { if ((rc = pthread_create(&tid[0], NULL, t2, NULL)) == -1) errc(1, rc, "pthread_create"); if ((rc = pthread_create(&tid[1], NULL, t2, NULL)) == -1) errc(1, rc, "pthread_create"); if ((rc = pthread_create(&tid[2], NULL, t1, NULL)) == -1) errc(1, rc, "pthread_create"); if ((rc = pthread_join(tid[0], NULL)) == -1) errc(1, rc, "pthread_join"); if ((rc = pthread_join(tid[1], NULL)) == -1) errc(1, rc, "pthread_join"); if ((rc = pthread_join(tid[2], NULL)) == -1) errc(1, rc, "pthread_join"); } _exit(0); } int main(void) { pid_t pids[PARALLEL]; size_t len; time_t start; int i, status; len = PAGE_SIZE; if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) err(1, "mmap"); start = time(NULL); while (time(NULL) - start < RUNTIME) { for (i = 0; i < PARALLEL; i++) { if ((pids[i] = fork()) == 0) test(); } for(;;) { if (share[SYNC] > 0) atomic_add_int(&share[SYNC], -1); for (i = 0; i < PARALLEL; i++) kill(pids[i], SIGSTOP); usleep(1000); for (i = 0; i < PARALLEL; i++) kill(pids[i], SIGCONT); usleep(100 + arc4random() % 400); if (share[SYNC] == 0) { /* If all procs are done */ usleep(500); if (share[SYNC] == 0) break; } } for (i = 0; i < PARALLEL; i++) { if (waitpid(pids[i], &status, 0) != pids[i]) err(1, "waitpid"); } } return (0); }