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"
79e52966eb7e2ba4a0b5cb2afda1aa4b8a48be831Danny Al-Gaaf#include "../fio_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"
19844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe#include "../crc/xxhash.h"
20fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
21ea1f1da3959dac74093013f4bb20320f97000219Jens Axboe#include "test.h"
22ea1f1da3959dac74093013f4bb20320f97000219Jens Axboe
23f754086950c511d48af21aee5c49e9d7985d3d32Jens Axboe#define CHUNK		131072U
24f754086950c511d48af21aee5c49e9d7985d3d32Jens Axboe#define NR_CHUNKS	  2048U
25fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
26fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestruct test_type {
27fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	const char *name;
28fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	unsigned int mask;
29fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t (*fn)(void);
30fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe};
31fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
32fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboeenum {
33fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_MD5		= 1U << 0,
34fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC64		= 1U << 1,
35fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC32		= 1U << 2,
36fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC32C	= 1U << 3,
37fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC16		= 1U << 4,
38fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_CRC7		= 1U << 5,
39fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_SHA1		= 1U << 6,
40fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_SHA256	= 1U << 7,
41fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	T_SHA512	= 1U << 8,
42844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	T_XXHASH	= 1U << 9,
43fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe};
44fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
45fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic void randomize_buf(void *buf, unsigned int size, int seed)
46fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
47fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct frand_state state;
48fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
49fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	init_rand_seed(&state, seed);
50fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fill_random_buf(&state, buf, size);
51fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
52fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
53fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_md5(void)
54fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
55fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint32_t digest[4];
56fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_md5_ctx ctx = { .hash = digest };
57fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
58fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
59fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
60fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
61fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
62fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_md5_init(&ctx);
63fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
64fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
65fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
66fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
67fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
68fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
69fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_md5_update(&ctx, buf, CHUNK);
70fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
71fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
72fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
73fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
74fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
75fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
76fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc64(void)
77fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
78fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
79fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
80fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
81fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
82fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
83fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
84fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
85fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
86fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
87fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
88fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc64(buf, CHUNK);
89fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
90fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
91fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
92fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
93fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
94fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
95fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc32(void)
96fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
97fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
98fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
99fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
100fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
101fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
102fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
103fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
104fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
105fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
106fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
107fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc32(buf, CHUNK);
108fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
109fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
110fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
111fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
112fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
113fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
114fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc32c(void)
115fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
116fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
117fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
118fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
119fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
120fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
121fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
122fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
123fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
124fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
125fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
126fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc32c(buf, CHUNK);
127fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
128fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
129fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
130fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
131fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
132fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
133fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc16(void)
134fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
135fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
136fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
137fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
138fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
139fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
140fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
141fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
142fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
143fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
144fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
145fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc16(buf, CHUNK);
146fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
147fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
148fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
149fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
150fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
151fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
152fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_crc7(void)
153fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
154fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
155fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
156fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
157fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
158fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
159fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
160fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
161fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
162fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
163fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
164fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_crc7(buf, CHUNK);
165fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
166fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
167fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
168fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
169fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
170fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
171fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_sha1(void)
172fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
173fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint32_t sha[5];
174fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_sha1_ctx ctx = { .H = sha };
175fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
176fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
177fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
178fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
179fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
180fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_sha1_init(&ctx);
181fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
182fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
183fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
184fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
185fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
186fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
187fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_sha1_update(&ctx, buf, CHUNK);
188fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
189fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
190fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
191fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
192fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
193fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
194fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_sha256(void)
195fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
196fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint8_t sha[64];
197fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_sha256_ctx ctx = { .buf = sha };
198fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
199fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
200fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
201fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
202fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
203fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_sha256_init(&ctx);
204fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
205fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
206fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
207fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
208fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
209fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
210fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_sha256_update(&ctx, buf, CHUNK);
211fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
212fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
213fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
214fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
215fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
216fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
217fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic uint64_t t_sha512(void)
218fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
219fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint8_t sha[128];
220fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct fio_sha512_ctx ctx = { .buf = sha };
221fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	struct timeval s;
222fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t ret;
223fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	void *buf;
224fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
225fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
226fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_sha512_init(&ctx);
227fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
228fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	buf = malloc(CHUNK);
229fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
230fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
231fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	fio_gettime(&s, NULL);
232fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
233fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		fio_sha512_update(&ctx, buf, CHUNK);
234fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
235fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ret = utime_since_now(&s);
236fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(buf);
237fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return ret;
238fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
239fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
240844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboestatic uint64_t t_xxhash(void)
241844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe{
242844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	void *state;
243844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	struct timeval s;
244844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	uint64_t ret;
245844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	void *buf;
246844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	int i;
247844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
248844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	state = XXH32_init(0x8989);
249844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
250844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	buf = malloc(CHUNK);
251844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	randomize_buf(buf, CHUNK, 0x8989);
252844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
253844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	fio_gettime(&s, NULL);
254844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	for (i = 0; i < NR_CHUNKS; i++)
255844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		XXH32_update(state, buf, CHUNK);
256844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
257844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	XXH32_digest(state);
258844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	ret = utime_since_now(&s);
259844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	free(buf);
260844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	return ret;
261844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe}
262844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
263fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic struct test_type t[] = {
264fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
265fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "md5",
266fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_MD5,
267fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_md5,
268fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
269fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
270fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc64",
271fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC64,
272fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc64,
273fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
274fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
275fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc32",
276fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC32,
277fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc32,
278fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
279fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
280fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc32c",
281fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC32C,
282fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc32c,
283fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
284fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
285fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc16",
286fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC16,
287fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc16,
288fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
289fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
290fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "crc7",
291fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_CRC7,
292fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_crc7,
293fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
294fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
295fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "sha1",
296fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_SHA1,
297fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_sha1,
298fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
299fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
300fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "sha256",
301fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_SHA256,
302fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_sha256,
303fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
304fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
305fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = "sha512",
306fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.mask = T_SHA512,
307fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.fn = t_sha512,
308fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
309fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	{
310844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		.name = "xxhash",
311844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		.mask = T_XXHASH,
312844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		.fn = t_xxhash,
313844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	},
314844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	{
315fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		.name = NULL,
316fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	},
317fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe};
318fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
319fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboestatic unsigned int get_test_mask(const char *type)
320fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
321fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	char *ostr, *str = strdup(type);
322fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	unsigned int mask;
323fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	char *name;
324fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
325fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
326fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	ostr = str;
327fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	mask = 0;
328fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	while ((name = strsep(&str, ",")) != NULL) {
329fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		for (i = 0; t[i].name; i++) {
330f754086950c511d48af21aee5c49e9d7985d3d32Jens Axboe			if (!strcmp(t[i].name, name)) {
331fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe				mask |= t[i].mask;
332fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe				break;
333fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe			}
334fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		}
335fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	}
336fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
337fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	free(ostr);
338fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return mask;
339fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
340fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
341782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboestatic int list_types(void)
342782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe{
343782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	int i;
344782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
345782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	for (i = 0; t[i].name; i++)
346782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe		printf("%s\n", t[i].name);
347782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
348782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	return 0;
349782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe}
350782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
351fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboeint fio_crctest(const char *type)
352fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe{
353fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	unsigned int test_mask = 0;
354fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	uint64_t mb = CHUNK * NR_CHUNKS;
355fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	int i;
356fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
357fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	crc32c_intel_probe();
358fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
359fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	if (!type)
360fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		test_mask = ~0U;
361782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe	else if (!strcmp(type, "help") || !strcmp(type, "list"))
362782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe		return list_types();
363fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	else
364fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		test_mask = get_test_mask(type);
365fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
366fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	for (i = 0; t[i].name; i++) {
367fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		double mb_sec;
368fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		uint64_t usec;
369fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
370fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		if (!(t[i].mask & test_mask))
371fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe			continue;
372fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe
373fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		usec = t[i].fn();
374fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		mb_sec = (double) mb / (double) usec;
375fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		mb_sec /= (1.024 * 1.024);
376fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe		printf("%s:\t%.2f MB/sec\n", t[i].name, mb_sec);
377fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	}
378782744ef60b7ed47a529d30b9f8e0c528c436fdbJens Axboe
379fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe	return 0;
380fec0f21cb04bfd6c94b546998f194baed41fdec5Jens Axboe}
381