]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/test/stress2/misc/stealer.sh
Update DTS files from Linux v5.10
[FreeBSD/FreeBSD.git] / tools / test / stress2 / misc / stealer.sh
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
40 here=`pwd`
41 cd /tmp
42 sed '1,/^EOF/d' < $here/$0 > stealer.c
43 mycc -o stealer -Wall -Wextra stealer.c || exit 1
44 rm -f stealer.c
45 cd $here
46 swapoff -a > /dev/null
47
48 dd if=/dev/zero of=$diskimage bs=1m count=1k status=none
49 mdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
50 mdconfig -a -t vnode -f $diskimage -u $mdstart
51 swapon /dev/md$mdstart
52
53 hw=`sysctl hw.pagesize | sed 's/.*: //'`
54 pages=`sysctl hw.usermem  | sed 's/.*: //'`
55 pages=$((pages / hw))
56 echo "`date '+%T'` Test with $pages pages."
57 su $testuser -c "sh -c \"/tmp/stealer $pages\"" &
58 sleep 30
59 while swapinfo | grep -q /dev/md$mdstart; do
60         swapoff /dev/md$mdstart 2>&1 |
61             grep -v "Cannot allocate memory"
62         sleep 2
63 done
64 ps auxwwl | grep -v grep | grep objtrm && echo FAIL
65 wait
66
67 swapon -a > /dev/null
68
69 mdconfig -d -u $mdstart
70 rm -rf /tmp/stealer $diskimage
71 exit 0
72 EOF
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
82 void
83 handler(int i __unused)
84 {
85         _exit(0);
86 }
87
88 void
89 stealer(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
110 int
111 main(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 }