Add bit patterns with -P option.
This commit is contained in:
parent
5483748f78
commit
456cc04ff4
@ -1,7 +1,7 @@
|
||||
# $OpenBSD: Makefile,v 1.11 2006/03/25 16:26:52 marco Exp $
|
||||
# $OpenBSD: Makefile,v 1.12 2007/02/06 19:25:04 marco Exp $
|
||||
|
||||
COMMENT= "i/o generator"
|
||||
PKGNAME= iogen-1.06p0
|
||||
PKGNAME= iogen-2.0p0
|
||||
CATEGORIES= sysutils
|
||||
DISTFILES=
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $OpenBSD: iogen.8,v 1.5 2006/03/25 16:26:52 marco Exp $
|
||||
.\" $OpenBSD: iogen.8,v 1.6 2007/02/06 19:25:05 marco Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2005 Marco Peereboom <marco@peereboom.us>
|
||||
.\"
|
||||
@ -68,6 +68,10 @@ The default is 1.
|
||||
This determins the read vs write distribution.
|
||||
The range is from 10% to 90%.
|
||||
The default is 50.
|
||||
.It Fl P Ar pattern
|
||||
Pattern is a whole number that designates the IO pattern. The default is a
|
||||
text pattern that is human readable. Use ? to print out the available
|
||||
patterns.
|
||||
.It Fl r
|
||||
Randomize I/O size between 1 and
|
||||
.Ar max-io-size .
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: iogen.c,v 1.3 2005/12/06 19:03:42 marco Exp $ */
|
||||
/* $OpenBSD: iogen.c,v 1.4 2007/02/06 19:25:05 marco Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2005 Marco Peereboom <marco@peereboom.us>
|
||||
*
|
||||
@ -54,6 +54,27 @@ int randomize;
|
||||
char target_dir[MAXPATHLEN];
|
||||
char result_dir[MAXPATHLEN];
|
||||
|
||||
enum iog_pattern {
|
||||
IOGEN_PAT_BLINK4,
|
||||
IOGEN_PAT_BLINK8,
|
||||
IOGEN_PAT_BLINK16,
|
||||
IOGEN_PAT_BLINK32,
|
||||
IOGEN_PAT_0,
|
||||
IOGEN_PAT_5,
|
||||
IOGEN_PAT_A,
|
||||
IOGEN_PAT_F,
|
||||
IOGEN_PAT_A5,
|
||||
IOGEN_PAT_A5_BLINK,
|
||||
IOGEN_PAT_AA55,
|
||||
IOGEN_PAT_AA55_BLINK,
|
||||
IOGEN_PAT_AAAA5555,
|
||||
IOGEN_PAT_AAAA5555_BLINK,
|
||||
IOGEN_PAT_AAAAAAA55555555,
|
||||
IOGEN_PAT_WALK,
|
||||
IOGEN_PAT_TEXT, /* must be last entry */
|
||||
};
|
||||
enum iog_pattern pattern = IOGEN_PAT_TEXT;
|
||||
|
||||
char *io_pattern[] = {
|
||||
"The quick brown fox jumps over the lazy dog. ",
|
||||
"tHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG. ",
|
||||
@ -88,6 +109,78 @@ killall(void)
|
||||
}
|
||||
}
|
||||
|
||||
u_int64_t
|
||||
get_pattern(int pat)
|
||||
{
|
||||
u_int64_t pa = IOGEN_PAT_TEXT;
|
||||
|
||||
switch (pat) {
|
||||
case IOGEN_PAT_BLINK32:
|
||||
pa = 0xffffffff00000000llu;
|
||||
break;
|
||||
case IOGEN_PAT_BLINK16:
|
||||
pa = 0xffff0000ffff0000llu;
|
||||
break;
|
||||
case IOGEN_PAT_BLINK8:
|
||||
pa = 0xff00ff00ff00ff00llu;
|
||||
break;
|
||||
case IOGEN_PAT_BLINK4:
|
||||
pa = 0xf0f0f0f0f0f0f0f0llu;
|
||||
break;
|
||||
case IOGEN_PAT_0:
|
||||
pa = 0x0000000000000000llu;
|
||||
break;
|
||||
case IOGEN_PAT_5:
|
||||
pa = 0x5555555555555555llu;
|
||||
break;
|
||||
case IOGEN_PAT_A:
|
||||
pa = 0xaaaaaaaaaaaaaaaallu;
|
||||
break;
|
||||
case IOGEN_PAT_F:
|
||||
pa = 0xffffffffffffffffllu;
|
||||
break;
|
||||
case IOGEN_PAT_A5:
|
||||
pa = 0xa5a5a5a5a5a5a5a5llu;
|
||||
break;
|
||||
case IOGEN_PAT_A5_BLINK:
|
||||
pa = 0xa55aa55aa55aa55allu;
|
||||
break;
|
||||
case IOGEN_PAT_AA55:
|
||||
pa = 0xaa55aa55aa55aa55llu;
|
||||
break;
|
||||
case IOGEN_PAT_AA55_BLINK:
|
||||
pa = 0xaa55aa5555aa55aallu;
|
||||
break;
|
||||
case IOGEN_PAT_AAAA5555:
|
||||
pa = 0xaaaa5555aaaa5555llu;
|
||||
break;
|
||||
case IOGEN_PAT_AAAA5555_BLINK:
|
||||
pa = 0xaaaa55555555aaaallu;
|
||||
break;
|
||||
case IOGEN_PAT_AAAAAAA55555555:
|
||||
pa = 0xaaaaaaaa55555555llu;
|
||||
break;
|
||||
case IOGEN_PAT_WALK:
|
||||
pa = 0x8421842184218421llu;
|
||||
break;
|
||||
}
|
||||
|
||||
return (pa);
|
||||
}
|
||||
|
||||
void
|
||||
show_patterns(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("pattern number\tpattern\n");
|
||||
for (i = 0; i < IOGEN_PAT_TEXT; i++)
|
||||
if (get_pattern(i) == 0)
|
||||
printf("%d\t\t0x0000000000000000\n", i);
|
||||
else
|
||||
printf("%d\t\t%#llx\n", i, get_pattern(i));
|
||||
}
|
||||
|
||||
void
|
||||
usage(void)
|
||||
{
|
||||
@ -102,6 +195,7 @@ usage(void)
|
||||
fprintf(stderr, "-f <result directory>; Default = iogen.res\n");
|
||||
fprintf(stderr, "-n <number of io processes>; Default = 1\n");
|
||||
fprintf(stderr, "-t <seconds between update>; Default = 60 seconds\n");
|
||||
fprintf(stderr, "-P <payload pattern>; ? displays patterns, Default = readable text\n");
|
||||
fprintf(stderr, "-k kill all running io processes\n\n");
|
||||
fprintf(stderr, "If parameters are omited defaults will be used.\n");
|
||||
exit(0);
|
||||
@ -175,26 +269,38 @@ err_log(int flags, const char *fmt, ...)
|
||||
}
|
||||
|
||||
void
|
||||
fill_buffer(char *buffer, size_t size)
|
||||
fill_buffer(char *buffer, size_t size, int pat)
|
||||
{
|
||||
long long i = 0, more = 1;
|
||||
char *p = buffer;
|
||||
size_t copy_len;
|
||||
u_int64_t pa;
|
||||
char *pap;
|
||||
|
||||
while (more) {
|
||||
if (io_pattern[i] == NULL)
|
||||
i = 0;
|
||||
pa = get_pattern(pat);
|
||||
if (pa == IOGEN_PAT_TEXT) {
|
||||
while (more) {
|
||||
if (io_pattern[i] == NULL)
|
||||
i = 0;
|
||||
|
||||
copy_len = strlen(io_pattern[i]);
|
||||
if ((p + copy_len) > (buffer + size))
|
||||
copy_len = (buffer + size) - p;
|
||||
memcpy(p, io_pattern[i], copy_len);
|
||||
p += copy_len;
|
||||
i++;
|
||||
if (p == buffer + size)
|
||||
more = 0;
|
||||
else if (p > buffer + size)
|
||||
err(1, "buffer overflow in fill pattern");
|
||||
copy_len = strlen(io_pattern[i]);
|
||||
if ((p + copy_len) > (buffer + size))
|
||||
copy_len = (buffer + size) - p;
|
||||
memcpy(p, io_pattern[i], copy_len);
|
||||
p += copy_len;
|
||||
i++;
|
||||
if (p == buffer + size)
|
||||
more = 0;
|
||||
else if (p > buffer + size)
|
||||
err(1, "buffer overflow in fill pattern");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* fill buffer for non text pattern */
|
||||
for (i = 0; i < size; i++) {
|
||||
pap = ((char *)(&pa)) + (i % sizeof(pa));
|
||||
buffer[i] = *pap;
|
||||
}
|
||||
}
|
||||
|
||||
@ -256,12 +362,12 @@ run_io(void)
|
||||
src = malloc(io_size);
|
||||
if (!src)
|
||||
err(1, "malloc failed in process %i", getpid());
|
||||
fill_buffer(src, io_size);
|
||||
fill_buffer(src, io_size, pattern);
|
||||
|
||||
dst = malloc(io_size);
|
||||
if (!dst)
|
||||
err(1, "malloc failed in process %i", getpid());
|
||||
fill_buffer(dst, io_size);
|
||||
fill_buffer(dst, io_size, pattern);
|
||||
|
||||
if (memcmp(src, dst, io_size) != 0)
|
||||
errx(1, "source and destination buffer not the same");
|
||||
@ -413,7 +519,7 @@ main(int argc, char *argv[])
|
||||
strlcpy(target_dir, "./", sizeof target_dir);
|
||||
strlcpy(result_dir, "./", sizeof result_dir);
|
||||
|
||||
while ((ch = getopt(argc, argv, "b:d:f:kn:p:rs:t:")) != -1) {
|
||||
while ((ch = getopt(argc, argv, "b:d:f:kn:p:rs:t:P:")) != -1) {
|
||||
switch (ch) {
|
||||
case 'b':
|
||||
io_size = atoll(optarg) *
|
||||
@ -482,6 +588,16 @@ main(int argc, char *argv[])
|
||||
if (interval > 3600)
|
||||
errx(1, "time slice too large");
|
||||
break;
|
||||
case 'P':
|
||||
if (optarg[0] == '?') {
|
||||
show_patterns();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
pattern = atoi(optarg);
|
||||
if (pattern >= IOGEN_PAT_TEXT)
|
||||
errx(1, "illegal pattern");
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage();
|
||||
|
Loading…
x
Reference in New Issue
Block a user