Blame


1 a0d146ed 2005-07-12 devnull #include <u.h>
2 a0d146ed 2005-07-12 devnull #include <libc.h>
3 a0d146ed 2005-07-12 devnull #include <venti.h>
4 a0d146ed 2005-07-12 devnull #include <libsec.h>
5 a0d146ed 2005-07-12 devnull #include <thread.h>
6 a0d146ed 2005-07-12 devnull
7 a0d146ed 2005-07-12 devnull
8 a0d146ed 2005-07-12 devnull enum { STACK = 32768 };
9 a0d146ed 2005-07-12 devnull void xxxsrand(long);
10 a0d146ed 2005-07-12 devnull long xxxlrand(void);
11 a0d146ed 2005-07-12 devnull
12 a0d146ed 2005-07-12 devnull Channel *cw;
13 a0d146ed 2005-07-12 devnull Channel *cr;
14 a0d146ed 2005-07-12 devnull char *host;
15 a0d146ed 2005-07-12 devnull int blocksize, seed, randpct;
16 a0d146ed 2005-07-12 devnull int doread, dowrite, packets, permute;
17 a0d146ed 2005-07-12 devnull vlong totalbytes, cur;
18 a0d146ed 2005-07-12 devnull VtConn *z;
19 a0d146ed 2005-07-12 devnull int multi;
20 a0d146ed 2005-07-12 devnull int maxpackets;
21 a0d146ed 2005-07-12 devnull int sequence;
22 a0d146ed 2005-07-12 devnull int doublecheck = 1;
23 a0d146ed 2005-07-12 devnull uint *order;
24 a0d146ed 2005-07-12 devnull
25 a0d146ed 2005-07-12 devnull void
26 a0d146ed 2005-07-12 devnull usage(void)
27 a0d146ed 2005-07-12 devnull {
28 a0d146ed 2005-07-12 devnull fprint(2, "usage: randtest [-q] [-h host] [-s seed] [-b blocksize] [-p randpct] [-n totalbytes] [-M maxblocks] [-P] [-r] [-w]\n");
29 a0d146ed 2005-07-12 devnull threadexitsall("usage");
30 a0d146ed 2005-07-12 devnull }
31 a0d146ed 2005-07-12 devnull
32 a0d146ed 2005-07-12 devnull void
33 a0d146ed 2005-07-12 devnull wr(char *buf, char *buf2)
34 a0d146ed 2005-07-12 devnull {
35 a0d146ed 2005-07-12 devnull uchar score[VtScoreSize], score2[VtScoreSize];
36 a0d146ed 2005-07-12 devnull DigestState ds;
37 a0d146ed 2005-07-12 devnull
38 27d28098 2007-04-21 devnull USED(buf2);
39 a0d146ed 2005-07-12 devnull memset(&ds, 0, sizeof ds);
40 a0d146ed 2005-07-12 devnull if(doublecheck)
41 a0d146ed 2005-07-12 devnull sha1((uchar*)buf, blocksize, score, &ds);
42 a0d146ed 2005-07-12 devnull if(vtwrite(z, score2, VtDataType, (uchar*)buf, blocksize) < 0)
43 a0d146ed 2005-07-12 devnull sysfatal("vtwrite %V at %,lld: %r", score, cur);
44 a0d146ed 2005-07-12 devnull if(doublecheck && memcmp(score, score2, VtScoreSize) != 0)
45 a0d146ed 2005-07-12 devnull sysfatal("score mismatch! %V %V", score, score2);
46 a0d146ed 2005-07-12 devnull }
47 a0d146ed 2005-07-12 devnull
48 a0d146ed 2005-07-12 devnull void
49 a0d146ed 2005-07-12 devnull wrthread(void *v)
50 a0d146ed 2005-07-12 devnull {
51 a0d146ed 2005-07-12 devnull char *p;
52 a0d146ed 2005-07-12 devnull
53 a0d146ed 2005-07-12 devnull USED(v);
54 a0d146ed 2005-07-12 devnull while((p = recvp(cw)) != nil){
55 a0d146ed 2005-07-12 devnull wr(p, nil);
56 a0d146ed 2005-07-12 devnull free(p);
57 a0d146ed 2005-07-12 devnull }
58 a0d146ed 2005-07-12 devnull }
59 a0d146ed 2005-07-12 devnull
60 a0d146ed 2005-07-12 devnull void
61 a0d146ed 2005-07-12 devnull rd(char *buf, char *buf2)
62 a0d146ed 2005-07-12 devnull {
63 a0d146ed 2005-07-12 devnull uchar score[VtScoreSize];
64 a0d146ed 2005-07-12 devnull DigestState ds;
65 a0d146ed 2005-07-12 devnull
66 a0d146ed 2005-07-12 devnull memset(&ds, 0, sizeof ds);
67 a0d146ed 2005-07-12 devnull sha1((uchar*)buf, blocksize, score, &ds);
68 a0d146ed 2005-07-12 devnull if(vtread(z, score, VtDataType, (uchar*)buf2, blocksize) < 0)
69 a0d146ed 2005-07-12 devnull sysfatal("vtread %V at %,lld: %r", score, cur);
70 a0d146ed 2005-07-12 devnull if(memcmp(buf, buf2, blocksize) != 0)
71 a0d146ed 2005-07-12 devnull sysfatal("bad data read! %V", score);
72 a0d146ed 2005-07-12 devnull }
73 a0d146ed 2005-07-12 devnull
74 a0d146ed 2005-07-12 devnull void
75 a0d146ed 2005-07-12 devnull rdthread(void *v)
76 a0d146ed 2005-07-12 devnull {
77 a0d146ed 2005-07-12 devnull char *p, *buf2;
78 a0d146ed 2005-07-12 devnull
79 a0d146ed 2005-07-12 devnull buf2 = vtmalloc(blocksize);
80 a0d146ed 2005-07-12 devnull USED(v);
81 a0d146ed 2005-07-12 devnull while((p = recvp(cr)) != nil){
82 a0d146ed 2005-07-12 devnull rd(p, buf2);
83 a0d146ed 2005-07-12 devnull free(p);
84 a0d146ed 2005-07-12 devnull }
85 a0d146ed 2005-07-12 devnull }
86 a0d146ed 2005-07-12 devnull
87 a0d146ed 2005-07-12 devnull char *template;
88 a0d146ed 2005-07-12 devnull
89 a0d146ed 2005-07-12 devnull void
90 a0d146ed 2005-07-12 devnull run(void (*fn)(char*, char*), Channel *c)
91 a0d146ed 2005-07-12 devnull {
92 a0d146ed 2005-07-12 devnull int i, t, j, packets;
93 a0d146ed 2005-07-12 devnull char *buf2, *buf;
94 a0d146ed 2005-07-12 devnull
95 a0d146ed 2005-07-12 devnull buf2 = vtmalloc(blocksize);
96 a0d146ed 2005-07-12 devnull buf = vtmalloc(blocksize);
97 a0d146ed 2005-07-12 devnull cur = 0;
98 a0d146ed 2005-07-12 devnull packets = totalbytes/blocksize;
99 72281ecd 2007-09-25 rsc if(maxpackets > 0 && maxpackets < packets)
100 72281ecd 2007-09-25 rsc packets = maxpackets;
101 72281ecd 2007-09-25 rsc totalbytes = (vlong)packets * blocksize;
102 a0d146ed 2005-07-12 devnull order = vtmalloc(packets*sizeof order[0]);
103 a0d146ed 2005-07-12 devnull for(i=0; i<packets; i++)
104 a0d146ed 2005-07-12 devnull order[i] = i;
105 a0d146ed 2005-07-12 devnull if(permute){
106 a0d146ed 2005-07-12 devnull for(i=1; i<packets; i++){
107 a0d146ed 2005-07-12 devnull j = nrand(i+1);
108 a0d146ed 2005-07-12 devnull t = order[i];
109 a0d146ed 2005-07-12 devnull order[i] = order[j];
110 a0d146ed 2005-07-12 devnull order[j] = t;
111 a0d146ed 2005-07-12 devnull }
112 a0d146ed 2005-07-12 devnull }
113 72281ecd 2007-09-25 rsc for(i=0; i<packets; i++){
114 a0d146ed 2005-07-12 devnull memmove(buf, template, blocksize);
115 a0d146ed 2005-07-12 devnull *(uint*)buf = order[i];
116 a0d146ed 2005-07-12 devnull if(c){
117 a0d146ed 2005-07-12 devnull sendp(c, buf);
118 a0d146ed 2005-07-12 devnull buf = vtmalloc(blocksize);
119 a0d146ed 2005-07-12 devnull }else
120 a0d146ed 2005-07-12 devnull (*fn)(buf, buf2);
121 a0d146ed 2005-07-12 devnull cur += blocksize;
122 a0d146ed 2005-07-12 devnull }
123 a0d146ed 2005-07-12 devnull free(order);
124 a0d146ed 2005-07-12 devnull }
125 a0d146ed 2005-07-12 devnull
126 a0d146ed 2005-07-12 devnull #define TWID64 ((u64int)~(u64int)0)
127 a0d146ed 2005-07-12 devnull
128 a0d146ed 2005-07-12 devnull u64int
129 a0d146ed 2005-07-12 devnull unittoull(char *s)
130 a0d146ed 2005-07-12 devnull {
131 a0d146ed 2005-07-12 devnull char *es;
132 a0d146ed 2005-07-12 devnull u64int n;
133 a0d146ed 2005-07-12 devnull
134 a0d146ed 2005-07-12 devnull if(s == nil)
135 a0d146ed 2005-07-12 devnull return TWID64;
136 a0d146ed 2005-07-12 devnull n = strtoul(s, &es, 0);
137 a0d146ed 2005-07-12 devnull if(*es == 'k' || *es == 'K'){
138 a0d146ed 2005-07-12 devnull n *= 1024;
139 a0d146ed 2005-07-12 devnull es++;
140 a0d146ed 2005-07-12 devnull }else if(*es == 'm' || *es == 'M'){
141 a0d146ed 2005-07-12 devnull n *= 1024*1024;
142 a0d146ed 2005-07-12 devnull es++;
143 a0d146ed 2005-07-12 devnull }else if(*es == 'g' || *es == 'G'){
144 a0d146ed 2005-07-12 devnull n *= 1024*1024*1024;
145 a0d146ed 2005-07-12 devnull es++;
146 a0d146ed 2005-07-12 devnull }else if(*es == 't' || *es == 'T'){
147 a0d146ed 2005-07-12 devnull n *= 1024*1024;
148 a0d146ed 2005-07-12 devnull n *= 1024*1024;
149 a0d146ed 2005-07-12 devnull }
150 a0d146ed 2005-07-12 devnull if(*es != '\0')
151 a0d146ed 2005-07-12 devnull return TWID64;
152 a0d146ed 2005-07-12 devnull return n;
153 a0d146ed 2005-07-12 devnull }
154 a0d146ed 2005-07-12 devnull
155 a0d146ed 2005-07-12 devnull void
156 a0d146ed 2005-07-12 devnull threadmain(int argc, char *argv[])
157 a0d146ed 2005-07-12 devnull {
158 a0d146ed 2005-07-12 devnull int i, max;
159 a0d146ed 2005-07-12 devnull vlong t0;
160 a0d146ed 2005-07-12 devnull double t;
161 a0d146ed 2005-07-12 devnull
162 a0d146ed 2005-07-12 devnull blocksize = 8192;
163 a0d146ed 2005-07-12 devnull seed = 0;
164 a0d146ed 2005-07-12 devnull randpct = 50;
165 a0d146ed 2005-07-12 devnull host = nil;
166 a0d146ed 2005-07-12 devnull doread = 0;
167 a0d146ed 2005-07-12 devnull dowrite = 0;
168 a0d146ed 2005-07-12 devnull totalbytes = 1*1024*1024*1024;
169 a0d146ed 2005-07-12 devnull fmtinstall('V', vtscorefmt);
170 a0d146ed 2005-07-12 devnull fmtinstall('F', vtfcallfmt);
171 a0d146ed 2005-07-12 devnull
172 a0d146ed 2005-07-12 devnull ARGBEGIN{
173 a0d146ed 2005-07-12 devnull case 'b':
174 a0d146ed 2005-07-12 devnull blocksize = unittoull(EARGF(usage()));
175 a0d146ed 2005-07-12 devnull break;
176 a0d146ed 2005-07-12 devnull case 'h':
177 a0d146ed 2005-07-12 devnull host = EARGF(usage());
178 a0d146ed 2005-07-12 devnull break;
179 a0d146ed 2005-07-12 devnull case 'M':
180 a0d146ed 2005-07-12 devnull maxpackets = unittoull(EARGF(usage()));
181 a0d146ed 2005-07-12 devnull break;
182 a0d146ed 2005-07-12 devnull case 'm':
183 a0d146ed 2005-07-12 devnull multi = atoi(EARGF(usage()));
184 a0d146ed 2005-07-12 devnull break;
185 a0d146ed 2005-07-12 devnull case 'n':
186 a0d146ed 2005-07-12 devnull totalbytes = unittoull(EARGF(usage()));
187 a0d146ed 2005-07-12 devnull break;
188 a0d146ed 2005-07-12 devnull case 'p':
189 a0d146ed 2005-07-12 devnull randpct = atoi(EARGF(usage()));
190 a0d146ed 2005-07-12 devnull break;
191 a0d146ed 2005-07-12 devnull case 'P':
192 a0d146ed 2005-07-12 devnull permute = 1;
193 a0d146ed 2005-07-12 devnull break;
194 a0d146ed 2005-07-12 devnull case 'S':
195 a0d146ed 2005-07-12 devnull doublecheck = 0;
196 a0d146ed 2005-07-12 devnull ventidoublechecksha1 = 0;
197 a0d146ed 2005-07-12 devnull break;
198 a0d146ed 2005-07-12 devnull case 's':
199 a0d146ed 2005-07-12 devnull seed = atoi(EARGF(usage()));
200 a0d146ed 2005-07-12 devnull break;
201 a0d146ed 2005-07-12 devnull case 'r':
202 a0d146ed 2005-07-12 devnull doread = 1;
203 a0d146ed 2005-07-12 devnull break;
204 a0d146ed 2005-07-12 devnull case 'w':
205 a0d146ed 2005-07-12 devnull dowrite = 1;
206 a0d146ed 2005-07-12 devnull break;
207 a0d146ed 2005-07-12 devnull case 'V':
208 a0d146ed 2005-07-12 devnull chattyventi++;
209 a0d146ed 2005-07-12 devnull break;
210 a0d146ed 2005-07-12 devnull default:
211 a0d146ed 2005-07-12 devnull usage();
212 a0d146ed 2005-07-12 devnull }ARGEND
213 a0d146ed 2005-07-12 devnull
214 a0d146ed 2005-07-12 devnull if(doread==0 && dowrite==0){
215 a0d146ed 2005-07-12 devnull doread = 1;
216 a0d146ed 2005-07-12 devnull dowrite = 1;
217 a0d146ed 2005-07-12 devnull }
218 a0d146ed 2005-07-12 devnull
219 a0d146ed 2005-07-12 devnull z = vtdial(host);
220 a0d146ed 2005-07-12 devnull if(z == nil)
221 a0d146ed 2005-07-12 devnull sysfatal("could not connect to server: %r");
222 a0d146ed 2005-07-12 devnull if(vtconnect(z) < 0)
223 a0d146ed 2005-07-12 devnull sysfatal("vtconnect: %r");
224 a0d146ed 2005-07-12 devnull
225 a0d146ed 2005-07-12 devnull if(multi){
226 a0d146ed 2005-07-12 devnull cr = chancreate(sizeof(void*), 0);
227 a0d146ed 2005-07-12 devnull cw = chancreate(sizeof(void*), 0);
228 a0d146ed 2005-07-12 devnull for(i=0; i<multi; i++){
229 a0d146ed 2005-07-12 devnull proccreate(wrthread, nil, STACK);
230 a0d146ed 2005-07-12 devnull proccreate(rdthread, nil, STACK);
231 a0d146ed 2005-07-12 devnull }
232 a0d146ed 2005-07-12 devnull }
233 a0d146ed 2005-07-12 devnull
234 a0d146ed 2005-07-12 devnull template = vtmalloc(blocksize);
235 a0d146ed 2005-07-12 devnull xxxsrand(seed);
236 a0d146ed 2005-07-12 devnull max = (256*randpct)/100;
237 a0d146ed 2005-07-12 devnull if(max == 0)
238 a0d146ed 2005-07-12 devnull max = 1;
239 a0d146ed 2005-07-12 devnull for(i=0; i<blocksize; i++)
240 a0d146ed 2005-07-12 devnull template[i] = xxxlrand()%max;
241 a0d146ed 2005-07-12 devnull if(dowrite){
242 a0d146ed 2005-07-12 devnull t0 = nsec();
243 a0d146ed 2005-07-12 devnull run(wr, cw);
244 a0d146ed 2005-07-12 devnull for(i=0; i<multi; i++)
245 a0d146ed 2005-07-12 devnull sendp(cw, nil);
246 a0d146ed 2005-07-12 devnull t = (nsec() - t0)/1.e9;
247 a0d146ed 2005-07-12 devnull print("write: %lld bytes / %.3f seconds = %.6f MB/s\n",
248 a0d146ed 2005-07-12 devnull totalbytes, t, (double)totalbytes/1e6/t);
249 a0d146ed 2005-07-12 devnull }
250 a0d146ed 2005-07-12 devnull if(doread){
251 a0d146ed 2005-07-12 devnull t0 = nsec();
252 a0d146ed 2005-07-12 devnull run(rd, cr);
253 a0d146ed 2005-07-12 devnull for(i=0; i<multi; i++)
254 a0d146ed 2005-07-12 devnull sendp(cr, nil);
255 a0d146ed 2005-07-12 devnull t = (nsec() - t0)/1.e9;
256 a0d146ed 2005-07-12 devnull print("read: %lld bytes / %.3f seconds = %.6f MB/s\n",
257 a0d146ed 2005-07-12 devnull totalbytes, t, (double)totalbytes/1e6/t);
258 a0d146ed 2005-07-12 devnull }
259 a0d146ed 2005-07-12 devnull threadexitsall(nil);
260 a0d146ed 2005-07-12 devnull }
261 a0d146ed 2005-07-12 devnull
262 a0d146ed 2005-07-12 devnull
263 a0d146ed 2005-07-12 devnull /*
264 a0d146ed 2005-07-12 devnull * algorithm by
265 a0d146ed 2005-07-12 devnull * D. P. Mitchell & J. A. Reeds
266 a0d146ed 2005-07-12 devnull */
267 a0d146ed 2005-07-12 devnull
268 a0d146ed 2005-07-12 devnull #define LEN 607
269 a0d146ed 2005-07-12 devnull #define TAP 273
270 a0d146ed 2005-07-12 devnull #define MASK 0x7fffffffL
271 a0d146ed 2005-07-12 devnull #define A 48271
272 a0d146ed 2005-07-12 devnull #define M 2147483647
273 a0d146ed 2005-07-12 devnull #define Q 44488
274 a0d146ed 2005-07-12 devnull #define R 3399
275 a0d146ed 2005-07-12 devnull #define NORM (1.0/(1.0+MASK))
276 a0d146ed 2005-07-12 devnull
277 a0d146ed 2005-07-12 devnull static ulong rng_vec[LEN];
278 a0d146ed 2005-07-12 devnull static ulong* rng_tap = rng_vec;
279 a0d146ed 2005-07-12 devnull static ulong* rng_feed = 0;
280 a0d146ed 2005-07-12 devnull
281 a0d146ed 2005-07-12 devnull static void
282 a0d146ed 2005-07-12 devnull isrand(long seed)
283 a0d146ed 2005-07-12 devnull {
284 a0d146ed 2005-07-12 devnull long lo, hi, x;
285 a0d146ed 2005-07-12 devnull int i;
286 a0d146ed 2005-07-12 devnull
287 a0d146ed 2005-07-12 devnull rng_tap = rng_vec;
288 a0d146ed 2005-07-12 devnull rng_feed = rng_vec+LEN-TAP;
289 a0d146ed 2005-07-12 devnull seed = seed%M;
290 a0d146ed 2005-07-12 devnull if(seed < 0)
291 a0d146ed 2005-07-12 devnull seed += M;
292 a0d146ed 2005-07-12 devnull if(seed == 0)
293 a0d146ed 2005-07-12 devnull seed = 89482311;
294 a0d146ed 2005-07-12 devnull x = seed;
295 a0d146ed 2005-07-12 devnull /*
296 a0d146ed 2005-07-12 devnull * Initialize by x[n+1] = 48271 * x[n] mod (2**31 - 1)
297 a0d146ed 2005-07-12 devnull */
298 a0d146ed 2005-07-12 devnull for(i = -20; i < LEN; i++) {
299 a0d146ed 2005-07-12 devnull hi = x / Q;
300 a0d146ed 2005-07-12 devnull lo = x % Q;
301 a0d146ed 2005-07-12 devnull x = A*lo - R*hi;
302 a0d146ed 2005-07-12 devnull if(x < 0)
303 a0d146ed 2005-07-12 devnull x += M;
304 a0d146ed 2005-07-12 devnull if(i >= 0)
305 a0d146ed 2005-07-12 devnull rng_vec[i] = x;
306 a0d146ed 2005-07-12 devnull }
307 a0d146ed 2005-07-12 devnull }
308 a0d146ed 2005-07-12 devnull
309 a0d146ed 2005-07-12 devnull void
310 a0d146ed 2005-07-12 devnull xxxsrand(long seed)
311 a0d146ed 2005-07-12 devnull {
312 a0d146ed 2005-07-12 devnull isrand(seed);
313 a0d146ed 2005-07-12 devnull }
314 a0d146ed 2005-07-12 devnull
315 a0d146ed 2005-07-12 devnull long
316 a0d146ed 2005-07-12 devnull xxxlrand(void)
317 a0d146ed 2005-07-12 devnull {
318 a0d146ed 2005-07-12 devnull ulong x;
319 a0d146ed 2005-07-12 devnull
320 a0d146ed 2005-07-12 devnull rng_tap--;
321 a0d146ed 2005-07-12 devnull if(rng_tap < rng_vec) {
322 a0d146ed 2005-07-12 devnull if(rng_feed == 0) {
323 a0d146ed 2005-07-12 devnull isrand(1);
324 a0d146ed 2005-07-12 devnull rng_tap--;
325 a0d146ed 2005-07-12 devnull }
326 a0d146ed 2005-07-12 devnull rng_tap += LEN;
327 a0d146ed 2005-07-12 devnull }
328 a0d146ed 2005-07-12 devnull rng_feed--;
329 a0d146ed 2005-07-12 devnull if(rng_feed < rng_vec)
330 a0d146ed 2005-07-12 devnull rng_feed += LEN;
331 a0d146ed 2005-07-12 devnull x = (*rng_feed + *rng_tap) & MASK;
332 a0d146ed 2005-07-12 devnull *rng_feed = x;
333 a0d146ed 2005-07-12 devnull
334 a0d146ed 2005-07-12 devnull return x;
335 a0d146ed 2005-07-12 devnull }