1 /*-
2 * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 */
27
28 #include <sys/types.h>
29 #include <sys/sysctl.h>
30 #include <unistd.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <sys/time.h>
34 #include <sys/resource.h>
35 #include <err.h>
36
37
38 #include "stress.h"
39
40 static unsigned long size;
41
42 int
setup(int nb)43 setup(int nb)
44 {
45 int pct;
46 unsigned long mem;
47 int64_t swapinfo = 0;
48 struct rlimit rlp;
49
50 if (nb == 0) {
51 mem = usermem();
52 swapinfo = swap();
53 if (swapinfo > mem)
54 swapinfo = mem;
55
56 if (op->hog == 0)
57 pct = random_int(1, 10);
58
59 if (op->hog == 1)
60 pct = random_int(10, 20);
61
62 if (op->hog == 2)
63 pct = random_int(80, 90);
64
65 if (op->hog >= 3)
66 pct = random_int(100, 110);
67
68 if (swapinfo == 0)
69 size = mem / 100 * pct;
70 else
71 size = swapinfo / 100 * pct + mem;
72
73 size = size / op->incarnations;
74
75 if (getrlimit(RLIMIT_DATA, &rlp) < 0)
76 err(1,"getrlimit");
77 rlp.rlim_cur -= 1024 * 1024;
78
79 if (size > rlp.rlim_cur)
80 size = rlp.rlim_cur;
81 putval(size);
82
83
84 if (op->verbose > 1 && nb == 0)
85 printf("setup: pid %d, %d%%. Total %luMb\n",
86 getpid(), pct, size / 1024 / 1024 * op->incarnations);
87 } else
88 size = getval();
89 return (0);
90 }
91
92 void
cleanup(void)93 cleanup(void)
94 {
95 }
96
97 int
test(void)98 test(void)
99 {
100 char *c;
101 int i, page;
102 unsigned long oldsize = size;
103 time_t start;
104
105 c = malloc(size);
106 while (c == NULL && done_testing == 0) {
107 size -= 1024 * 1024;
108 c = malloc(size);
109 }
110 if (op->verbose > 1 && size != oldsize)
111 printf("Malloc size changed from %ld Mb to %ld Mb\n",
112 oldsize / 1024 / 1024, size / 1024 / 1024);
113 page = getpagesize();
114 start = time(NULL); /* Livelock workaround */
115 while (done_testing == 0 &&
116 (time(NULL) - start) < op->run_time) {
117 i = 0;
118 while (i < size && done_testing == 0) {
119 c[i] = 0;
120 i += page;
121 }
122 #if 0
123 if (op->hog != 1)
124 usleep(1000);
125 #endif
126 }
127 free(c);
128
129 return (0);
130 }
131