xref: /freebsd/tools/test/stress2/misc/stealer.sh (revision fd45b686f9d92f583366c75b22c04c7ee49709c0)
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