test.c revision 782744ef60b7ed47a529d30b9f8e0c528c436fdb
1fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include <stdio.h>
2fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include <stdlib.h>
3fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include <string.h>
4fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
5fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../fio.h"
6fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../gettime.h"
7fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../time.h"
8fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../verify.h"
9fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
10fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/md5.h"
11fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/crc64.h"
12fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/crc32.h"
13fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/crc32c.h"
14fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/crc16.h"
15fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/crc7.h"
16fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/sha1.h"
17fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/sha256.h"
18fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe#include "../crc/sha512.h"
19fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
20f754086950c511d48af21aee5c49e9d7985d3d32Jens Axboe#define CHUNK		131072U
21f754086950c511d48af21aee5c49e9d7985d3d32Jens Axboe#define NR_CHUNKS	  2048U
22fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
23fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestruct test_type {
24fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	const char *name;
25fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	unsigned int mask;
26fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t (*fn)(void);
27fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe};
28fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
29fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboeenum {
30fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_MD5		= 1U << 0,
31fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC64		= 1U << 1,
32fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC32		= 1U << 2,
33fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC32C	= 1U << 3,
34fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC16		= 1U << 4,
35fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC7		= 1U << 5,
36fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_SHA1		= 1U << 6,
37fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_SHA256	= 1U << 7,
38fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_SHA512	= 1U << 8,
39fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe};
40fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
41fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic void randomize_buf(void *buf, unsigned int size, int seed)
42fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
43fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct frand_state state;
44fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
45fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	init_rand_seed(&state, seed);
46fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fill_random_buf(&state, buf, size);
47fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
48fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
49fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_md5(void)
50fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
51fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint32_t digest[4];
52fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_md5_ctx ctx = { .hash = digest };
53fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
54fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
55fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
56fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
57fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
58fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_md5_init(&ctx);
59fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
60fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
61fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
62fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
63fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
64fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
65fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_md5_update(&ctx, buf, CHUNK);
66fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
67fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
68fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
69fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
70fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
71fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
72fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc64(void)
73fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
74fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
75fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
76fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
77fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
78fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
79fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
80fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
81fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
82fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
83fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
84fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc64(buf, CHUNK);
85fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
86fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
87fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
88fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
89fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
90fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
91fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc32(void)
92fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
93fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
94fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
95fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
96fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
97fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
98fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
99fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
100fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
101fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
102fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
103fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc32(buf, CHUNK);
104fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
105fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
106fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
107fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
108fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
109fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
110fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc32c(void)
111fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
112fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
113fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
114fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
115fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
116fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
117fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
118fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
119fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
120fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
121fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
122fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc32c(buf, CHUNK);
123fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
124fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
125fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
126fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
127fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
128fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
129fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc16(void)
130fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
131fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
132fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
133fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
134fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
135fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
136fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
137fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
138fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
139fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
140fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
141fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc16(buf, CHUNK);
142fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
143fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
144fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
145fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
146fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
147fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
148fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc7(void)
149fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
150fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
151fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
152fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
153fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
154fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
155fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
156fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
157fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
158fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
159fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
160fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc7(buf, CHUNK);
161fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
162fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
163fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
164fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
165fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
166fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
167fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_sha1(void)
168fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
169fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint32_t sha[5];
170fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_sha1_ctx ctx = { .H = sha };
171fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
172fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
173fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
174fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
175fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
176fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_sha1_init(&ctx);
177fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
178fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
179fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
180fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
181fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
182fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
183fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_sha1_update(&ctx, buf, CHUNK);
184fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
185fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
186fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
187fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
188fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
189fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
190fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_sha256(void)
191fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
192fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint8_t sha[64];
193fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_sha256_ctx ctx = { .buf = sha };
194fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
195fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
196fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
197fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
198fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
199fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_sha256_init(&ctx);
200fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
201fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
202fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
203fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
204fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
205fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
206fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_sha256_update(&ctx, buf, CHUNK);
207fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
208fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
209fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
210fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
211fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
212fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
213fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_sha512(void)
214fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
215fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint8_t sha[128];
216fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_sha512_ctx ctx = { .buf = sha };
217fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
218fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
219fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
220fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
221fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
222fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_sha512_init(&ctx);
223fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
224fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
225fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
226fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
227fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
228fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
229fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_sha512_update(&ctx, buf, CHUNK);
230fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
231fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
232fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
233fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
234fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
235fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
236fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic struct test_type t[] = {
237fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
238fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "md5",
239fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_MD5,
240fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_md5,
241fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
242fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
243fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc64",
244fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC64,
245fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc64,
246fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
247fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
248fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc32",
249fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC32,
250fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc32,
251fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
252fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
253fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc32c",
254fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC32C,
255fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc32c,
256fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
257fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
258fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc16",
259fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC16,
260fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc16,
261fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
262fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
263fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc7",
264fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC7,
265fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc7,
266fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
267fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
268fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "sha1",
269fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_SHA1,
270fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_sha1,
271fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
272fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
273fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "sha256",
274fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_SHA256,
275fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_sha256,
276fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
277fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
278fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "sha512",
279fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_SHA512,
280fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_sha512,
281fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
282fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
283fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = NULL,
284fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
285fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe};
286fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
287fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic unsigned int get_test_mask(const char *type)
288fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
289fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	char *ostr, *str = strdup(type);
290fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	unsigned int mask;
291fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	char *name;
292fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
293fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
294fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ostr = str;
295fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	mask = 0;
296fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	while ((name = strsep(&str, ",")) != NULL) {
297fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		for (i = 0; t[i].name; i++) {
298f754086950c511d48af21aee5c49e9d7985d3d32Jens Axboe			if (!strcmp(t[i].name, name)) {
299fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe				mask |= t[i].mask;
300fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe				break;
301fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe			}
302fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		}
303fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	}
304fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
305fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(ostr);
306fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return mask;
307fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
308fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
309782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboestatic int list_types(void)
310782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe{
311782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	int i;
312782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
313782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	for (i = 0; t[i].name; i++)
314782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe		printf("%s\n", t[i].name);
315782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
316782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	return 0;
317782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe}
318782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
319fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboeint fio_crctest(const char *type)
320fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
321fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	unsigned int test_mask = 0;
322fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t mb = CHUNK * NR_CHUNKS;
323fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
324fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
325fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	crc32c_intel_probe();
326fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
327fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	if (!type)
328fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		test_mask = ~0U;
329782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	else if (!strcmp(type, "help") || !strcmp(type, "list"))
330782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe		return list_types();
331fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	else
332fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		test_mask = get_test_mask(type);
333fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
334fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; t[i].name; i++) {
335fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		double mb_sec;
336fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		uint64_t usec;
337fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
338fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		if (!(t[i].mask & test_mask))
339fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe			continue;
340fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
341fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		usec = t[i].fn();
342fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		mb_sec = (double) mb / (double) usec;
343fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		mb_sec /= (1.024 * 1.024);
344fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		printf("%s:\t%.2f MB/sec\n", t[i].name, mb_sec);
345fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	}
346782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
347fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return 0;
348fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
349