1#!/bin/sh 2 3# 4# Copyright (c) 2014 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# Process stuck in objtrm wait state 30# http://people.freebsd.org/~pho/stress/log/stealer.txt 31# Fixed in r263328. 32 33# "panic: freeing free block" seen: 34# https://people.freebsd.org/~pho/stress/log/stealer-2.txt 35 36[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 37 38. ../default.cfg 39 40here=`pwd` 41cd /tmp 42sed '1,/^EOF/d' < $here/$0 > stealer.c 43mycc -o stealer -Wall -Wextra stealer.c || exit 1 44rm -f stealer.c 45cd $here 46swapoff -a > /dev/null 47 48dd if=/dev/zero of=$diskimage bs=1m count=1k status=none 49mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart 50mdconfig -a -t vnode -f $diskimage -u $mdstart 51swapon /dev/md$mdstart 52 53hw=`sysctl hw.pagesize | sed 's/.*: //'` 54pages=`sysctl hw.usermem | sed 's/.*: //'` 55pages=$((pages / hw)) 56echo "`date '+%T'` Test with $pages pages." 57su $testuser -c "sh -c \"/tmp/stealer $pages\"" & 58sleep 30 59while swapinfo | grep -q /dev/md$mdstart; do 60 swapoff /dev/md$mdstart 2>&1 | 61 grep -v "Cannot allocate memory" 62 sleep 2 63done 64ps auxwwl | grep -v grep | grep objtrm && echo FAIL 65wait 66 67swapon -a > /dev/null 68 69mdconfig -d -u $mdstart 70rm -rf /tmp/stealer $diskimage 71exit 0 72EOF 73#include <err.h> 74#include <signal.h> 75#include <stdio.h> 76#include <stdlib.h> 77#include <unistd.h> 78#include <sys/wait.h> 79 80#define N 200 81 82void 83handler(int i __unused) 84{ 85 _exit(0); 86} 87 88void 89stealer(int pages) 90{ 91 volatile char *c; 92 int i, page, size; 93 94 page = getpagesize(); 95 size = pages * page; 96 if ((c = malloc(size)) == 0) 97 err(1, "malloc(%d pages)", pages); 98 99 signal(SIGALRM, handler); 100 alarm(3 * 60); 101 for (;;) { 102 i = 0; 103 while (i < size) { 104 c[i] = 0; 105 i += page; 106 } 107 } 108} 109 110int 111main(int argc __unused, char **argv) 112{ 113 int i, j, n, pages, status; 114 115 pages = atoi(argv[1]); 116 n = pages / N; 117 118 j = 0; 119 for ( i = 0; i < N; i++, j++) { 120 if (fork() == 0) 121 stealer(n); 122 pages = pages - n; 123 } 124 if (pages > 0) { 125 j++; 126 if (fork() == 0) 127 stealer(pages); 128 } 129 while (j-- > 0) 130 if (wait(&status) == -1) 131 err(1, "wait()"); 132 return (0); 133} 134