1#!/bin/sh 2 3# 4# Copyright (c) 2016 EMC Corp. 5# All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28 29# Stress vm object collapse. 30 31# "panic: backing_object 0xfffff800a018f420 was somehow re-referenced during 32# collapse!" seen with uma_zalloc_arg fail point enabled. 33 34. ../default.cfg 35 36dir=/tmp 37odir=`pwd` 38cd $dir 39sed '1,/^EOF/d' < $odir/$0 > $dir/pipe.c 40mycc -o pipe -Wall -Wextra -O0 -g pipe.c || exit 1 41rm -f pipe.c 42cd $odir 43 44daemon sh -c '(cd ../testcases/swap; ./swap -t 10m -i 20)' > /dev/null 2>&1 45sleep 1 46e=0 47export e 48start=`date '+%s'` 49while [ $((`date '+%s'` - start)) -lt 300 ]; do 50 for i in `jot $(sysctl -n hw.ncpu)`; do 51 /tmp/pipe & 52 pids="$pids $!" 53 done 54 for i in $pids; do 55 wait $i 56 [ $? -ne 0 ] && e=$((e + 1)) 57 done 58 pids="" 59 [ $e -ne 0 ] && break 60done 61while pgrep -q swap; do 62 pkill -9 swap 63done 64rm -rf /tmp/pipe pipe.core 65exit $e 66 67EOF 68#include <sys/wait.h> 69 70#include <err.h> 71#include <stdio.h> 72#include <time.h> 73#include <unistd.h> 74 75#define PIPES 64 76#define RUNTIME 300 77 78int 79test(void) 80{ 81 int c, e, status; 82 int fds[PIPES][2]; 83 int i; 84 85 for (i = 0; i < PIPES; i++) { 86 if (pipe(fds[i]) == -1) 87 err(1, "pipe"); 88 } 89 c = e = 0; 90 if (write(fds[0][1], &c, sizeof(c)) != sizeof(c)) 91 err(1, "pipe write"); 92 for (i = 0; i < PIPES; i++) { 93 if (fork() == 0) { 94 close(fds[i][1]); 95 if (read(fds[i][0], &c, sizeof(c)) != sizeof(c)) 96 err(1, "pipe read"); 97#if defined(DEBUG) 98 fprintf(stderr, "pid %d: i = %d: read %d\n", getpid(), 99 i, c); 100#endif 101 c++; 102 if (i != PIPES - 1) 103 if (write(fds[i + 1][1], &c, sizeof(c)) != 104 sizeof(c)) 105 err(1, "pipe write"); 106 107 _exit(0); 108 } 109 close(fds[i][0]); 110 close(fds[i][1]); 111 } 112 for (i = 0; i < PIPES; i++) { 113 wait(&status); 114 e += status == 0 ? 0 : 1; 115 } 116 117 return (e); 118} 119 120int 121main(void) 122{ 123 time_t start; 124 int e; 125 126 e = 0; 127 start = time(NULL); 128 while (time(NULL) - start < RUNTIME && e == 0) 129 e = test(); 130 131 return (e); 132} 133