41 #include <sys/resource.h> 153 .ca_label =
"fletcher4",
161 .ca_label =
"sha256",
177 static unsigned long long getrnd(
unsigned long long a,
unsigned long long b)
180 unsigned long long scaled;
185 scaled =
r*(b - a + 1.0)/(RAND_MAX+1.0) + a;
186 assert(a <= scaled && scaled <= b);
191 static long long min(
long long a,
long long b)
193 return a < b ? a : b;
196 static long long max(
long long a,
long long b)
198 return a < b ? b : a;
206 while (
t->tv_usec < 0) {
208 t->tv_usec += 1000000;
210 while (
t->tv_usec >= 1000000) {
212 t->tv_usec -= 1000000;
248 pthread_mutex_destroy(&w->
cw_lock);
259 pthread_mutex_lock(&w->
cw_lock);
263 if ((w->
cw_done % 100000) == 0) {
264 struct timeval orate;
265 struct timeval
delay;
267 gettimeofday(&orate,
NULL);
279 percent = opno * 100 / w->
cw_ops;
280 if (percent * w->
cw_ops == opno * 100) {
281 if (percent / 10 * 10 == percent)
282 printf(
"%02i%%", percent);
289 pthread_mutex_unlock(&w->
cw_lock);
300 static const struct {
353 result = pthread_create(&task[
i].wt_pid,
356 err(1,
"cannot create worker thread");
370 result = pthread_join(task[
i].wt_pid,
NULL);
372 warn(
"cannot join worker thread %i",
i);
383 struct timeval wall_start;
384 struct timeval wall_end;
416 getrusage(RUSAGE_SELF, &u0);
418 gettimeofday(&wall_start,
NULL);
421 gettimeofday(&wall_end,
NULL);
422 getrusage(RUSAGE_SELF, &u1);
427 u1.ru_maxrss -= u0.ru_maxrss;
429 u1.ru_ixrss -= u0.ru_ixrss;
431 u1.ru_idrss -= u0.ru_idrss;
433 u1.ru_isrss -= u0.ru_isrss;
435 u1.ru_minflt -= u0.ru_minflt;
436 u1.ru_majflt -= u0.ru_majflt;
437 u1.ru_nswap -= u0.ru_nswap;
438 u1.ru_inblock -= u0.ru_inblock;
439 u1.ru_oublock -= u0.ru_oublock;
440 u1.ru_msgsnd -= u0.ru_msgsnd;
441 u1.ru_msgrcv -= u0.ru_msgrcv;
442 u1.ru_nsignals -= u0.ru_nsignals;
443 u1.ru_nvcsw -= u0.ru_nvcsw;
445 u1.ru_nivcsw -= u0.ru_nivcsw;
447 printf(
"time: (w: %f u: %f s: %f)\n" 448 "\tmaxrss: %6li ixrss: %6li idrss: %6li isrss: %6li\n" 449 "\tminflt: %6li majflt: %6li nswap: %6li\n" 450 "\tinblock: %6li outblock: %6li\n" 451 "\tmsgsnd: %6li msgrcv: %6li\n" 452 "\tnsignals: %6li nvcsw: %6li nivcsw: %6li\n",
453 tsec(&wall_end),
tsec(&u1.ru_utime),
tsec(&u1.ru_stime),
495 unsigned long long fid;
508 pthread_mutex_unlock(&w->
cw_lock);
515 if (
op->wo_task->u.wt_hpcs.th_bind >= 0)
516 dir =
op->wo_task->u.wt_hpcs.th_bind;
518 op->u.wo_hpcs.oh_dirno =
dir;
519 op->u.wo_hpcs.oh_opno = opno;
521 nob = snprintf(
op->u.wo_hpcs.oh_fname,
sizeof op->u.wo_hpcs.oh_fname,
523 if (nob >=
sizeof op->u.wo_hpcs.oh_fname)
524 errx(1,
"buffer [%zi] is too small for %s (%i,%i,%i)",
525 sizeof op->u.wo_hpcs.oh_fname,
528 opno,
op->u.wo_hpcs.oh_fname,
op->wo_size);
549 fname =
op->
u.wo_hpcs.oh_fname;
552 fd = open(fname, O_CREAT|O_WRONLY|w->
cw_oflag, S_IWUSR);
554 err(2,
"cannot create %s", fname);
560 psize = getpagesize();
562 result = fstat(
fd, &st);
564 err(2,
"stat(\"%s\") failed", fname);
565 pthread_mutex_lock(&w->
cw_lock);
575 w->
cw_buf = malloc(toalloc);
577 errx(3,
"cannot allocate buffer (%llu)",
580 pthread_mutex_unlock(&w->
cw_lock);
586 buf -= ((
unsigned long)
buf) % psize;
588 while (nob < op->wo_size) {
591 towrite =
max(towrite / psize * psize, psize);
593 result = write(
fd,
buf, towrite);
595 err(2,
"write on \"%s\" failed (%p, %llu)", fname,
599 "thread %i wrote %llu of %llu on \"%s\"\n",
620 struct timeval t_open;
621 struct timeval t_write;
622 struct timeval wall_start;
623 struct timeval wall_end;
627 memset(&t_open, 0,
sizeof t_open);
628 memset(&t_write, 0,
sizeof t_write);
634 errx(1,
"no directories");
636 gettimeofday(&wall_start,
NULL);
646 gettimeofday(&wall_end,
NULL);
660 printf(
" time ops c-rate " 662 printf(
" wall open write wall proc" 666 printf(
"%7.0f %7.0f %7.0f %6u %6.0f %6.0f %10llu %6.0f %6.0f\n",
667 tsec(&wall_end) * 100.,
tsec(&t_open) * 100.,
670 rate(nob, &wall_end, 1000000),
rate(nob, &t_write, 1000000));
691 err(1,
"cannot duplicate pattern");
712 s->c_dev[
i].d_fd = -1;
713 s->c_dev[
i].d_csum_fd = -1;
724 struct csum_dev *dev;
730 if (dev->d_csum_fd >= 0)
731 close(dev->d_csum_fd);
733 free(dev->d_csum_name);
754 pthread_mutex_unlock(&w->
cw_lock);
756 op->u.wo_csum.oc_type = otype;
771 uint32_t *ipend = ip + (
size /
sizeof (uint32_t));
772 volatile uint32_t word;
774 for (; ip < ipend; ip++)
785 const uint64_t *ip =
buf;
786 const uint64_t *ipend = ip + (
size /
sizeof (uint64_t));
787 uint64_t a0, b0, a1, b1;
789 for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
799 const uint32_t *ip =
buf;
800 const uint32_t *ipend = ip + (
size /
sizeof (uint32_t));
803 for (a = b =
c = d = 0; ip < ipend; ip++) {
815 ((in & 0xff00) >> 8) |
817 ((in & 0xff000000) >> 8) |
818 ((in & 0xff0000) << 8);
824 ((in & 0xff00ULL) >> 8) |
825 ((in & 0xffULL) << 8) |
826 ((in & 0xff000000ULL) >> 8) |
827 ((in & 0xff0000ULL) << 8) |
828 ((in & 0xff0000000000ULL) >> 8) |
829 ((in & 0xff00000000ULL) << 8) |
830 ((in & 0xff00000000000000ULL) >> 8) |
831 ((in & 0xff000000000000ULL) << 8);
838 uint32_t *ip32 =
buf;
839 uint32_t *ipend32 = ip32 + (
count /
sizeof (uint32_t));
840 volatile uint32_t word32;
842 uint64_t *ip64 =
buf;
843 uint64_t *ipend64 = ip64 + (
count /
sizeof (uint64_t));
844 volatile uint64_t word64;
862 for (; ip32 < ipend32; ip32++)
866 for (; ip32 < ipend32; ip32++)
870 for (; ip64 < ipend64; ip64++)
874 for (; ip64 < ipend64; ip64++)
892 bsize =
s->c_blocksize;
893 for (
i = 0;
i <
s->c_nr_devs; ++
i) {
894 for (j = 0; j <
count / bsize; ++j)
905 bcnt_t csum_count = csum_blocks *
s->c_csum_size;
906 int nr_devs =
s->c_nr_devs;
910 struct task_csum *tc;
911 struct csum_dev *dev;
917 tc = &
op->wo_task->u.wt_csum;
920 csum_buf = tc->tc_csum_buf;
922 memset(cb, 0,
sizeof *cb);
927 for (
ops = 0,
i = 0, dev =
s->c_dev;
i < nr_devs; ++
i, ++dev) {
929 if (dev->d_fd >= 0) {
930 cb[
i].aio_fildes = dev->d_fd;
934 cb[
i].aio_buf = tc->tc_buf +
i*
count;
939 cb[
i].aio_lio_opcode = LIO_NOP;
941 rag[
i + nr_devs] = &cb[
i + nr_devs];
942 if (dev->d_csum_fd >= 0) {
943 cb[
i + nr_devs].aio_fildes = dev->d_csum_fd;
944 cb[
i + nr_devs].aio_lio_opcode =
opcode;
945 cb[
i + nr_devs].aio_buf = &csum_buf[csum_count *
i];
946 cb[
i + nr_devs].aio_nbytes = csum_count;
947 cb[
i + nr_devs].aio_offset = csum_offset;
950 cb[
i + nr_devs].aio_lio_opcode = LIO_NOP;
954 rc = lio_listio(LIO_WAIT,
rag, nr_devs * 2,
NULL);
956 for (
i = 0;
i < nr_devs * 2; ++
i) {
961 name =
s->c_dev[
i].d_name;
964 name =
s->c_dev[
i-nr_devs].d_csum_name;
967 nob = aio_return(&cb[
i]);
970 "short async %s %s%s: " 974 warn(
"async %s%s failed on %s with %i",
978 err(1,
"async %s failed",
opname);
992 op->wo_task->wt_total +=
op->wo_size;
999 if (strcmp(dev_name,
"/dev/zero")) {
1000 fd = open(dev_name, O_RDWR|O_CREAT|w->
cw_oflag,
1003 err(2,
"open(\"%s\")", dev_name);
1012 struct timeval wall_start;
1013 struct timeval wall_end;
1014 struct csum_dev *dev;
1023 if (!
s->c_dev[
i].d_name != !
s->c_dev[
i].d_csum_name)
1024 errx(1,
"wrong checksum configuration");
1025 if (!
s->c_dev[
i].d_name && !
s->c_dev[
i].d_csum_name)
1028 nr_devs =
s->c_nr_devs =
i;
1031 errx(1,
"No devices specified.");
1033 for (
i = 0, dev =
s->c_dev;
i < nr_devs; ++
i, ++dev) {
1038 if (
s->c_dev_size == 0) {
1039 if (
s->c_dev[0].d_fd >= 0) {
1042 seek = lseek(
s->c_dev[0].d_fd, 0, SEEK_END);
1043 if (seek == (off_t)-1)
1044 err(2,
"lseek(\"%s\", 0, SEEK_END)",
1045 s->c_dev[0].d_name);
1046 s->c_dev_size = seek;
1048 s->c_dev_size = ~0ULL >> 1;
1055 w->
cw_buf = malloc(bufsize);
1058 memset(w->
cw_buf,
'!', bufsize);
1061 struct task_csum *tc = &task[
i].
u.
wt_csum;
1062 tc->tc_cb = malloc(2 * nr_devs *
sizeof(
struct aiocb));
1063 tc->tc_rag = malloc(2 * nr_devs *
sizeof(
struct aiocb *));
1064 tc->tc_csum_buf = malloc(w->
cw_max /
s->c_blocksize *
1065 s->c_csum_size * nr_devs);
1066 if (tc->tc_cb ==
NULL || tc->tc_rag ==
NULL ||
1067 tc->tc_csum_buf ==
NULL)
1070 tc->tc_buf = w->
cw_buf + bufsize0 *
i;
1076 for (
i = 0, dev =
s->c_dev;
i < nr_devs; ++
i, ++dev) {
1078 dev->d_name, dev->d_fd);
1080 dev->d_csum_name, dev->d_csum_fd);
1085 s->c_async ?
"on" :
"off");
1090 gettimeofday(&wall_start,
NULL);
1093 gettimeofday(&wall_end,
NULL);
1099 free(task[
i].
u.wt_csum.tc_cb);
1100 free(task[
i].
u.wt_csum.tc_rag);
1101 free(task[
i].
u.wt_csum.tc_csum_buf);
1103 printf(
"%7.0f %10llu %6.0f\n",
1104 tsec(&wall_end) * 100., nob,
rate(nob, &wall_end, 1000000));
1110 struct cr_csum *csw;
1116 if (csw->c_nr_devs ==
ARRAY_SIZE(csw->c_dev))
1117 errx(1,
"Too many devices.");
1118 csw->c_dev[csw->c_nr_devs].d_name = strdup(
optarg);
1122 if (csw->c_nr_devs ==
ARRAY_SIZE(csw->c_dev))
1123 errx(1,
"Too many checksum devices.");
1124 csw->c_dev[csw->c_nr_devs].d_csum_name = strdup(
optarg);
1139 errx(1,
"wrong checksum (%s)",
optarg);
1145 errx(1,
"wrong byte swapping type (%i)", csw->c_swab);
1160 "Usage: crate GENERIC OPTIONS -W WORKLOAD_TYPE WORKLOAD_OPTIONS ...\n" 1161 " Benchmarks various workloads. Each workload is specified \n" 1162 " by -W option, multiple workloads are executed consecutively.\n\n" 1163 " Possible workload types are:\n" 1164 " \"hpcs\" (file creation),\n" 1165 " \"csum\" (check-summing device),\n" 1166 " \"db\" (db meta-data back-end),\n" 1167 " and \"stob\" (Motr storage object).\n" 1169 "Options with [defaults]: \n" 1170 " Generic options\n" 1171 "-v increase verbosity level. Can be given multiple times.\n" 1172 "-h print this help message.\n\n" 1173 " Options common for all workload types\n" 1174 "-s SEED set pseudo-random number generator seed to \n" 1175 " a given value. See srand(3).\n" 1176 "-o NR_OPERATIONS execute given number of operations [%i].\n" 1177 "-t NR_THREAD number of threads to use [%i].\n" 1178 "-p indicate workload execution progress.\n" 1179 "-H print header.\n" 1180 "-U output resource usage summary on workload completion.\n" 1181 " See getrusage(2).\n" 1182 "-b BUFFER_SIZE IO buffer size for hpcs and stob. If 0, then st_blksize\n" 1183 " is used for hpcs, see stat(2). For csum---IO size to\n" 1184 " use. If 0, generate IO size randomly, see next options.\n" 1185 " For db---page size, if non-0 [%llu].\n" 1186 "-a AVERAGE_SIZE average file size for hpcs and stob, average\n" 1187 " IO size for csum, log file size for db [%llu].\n" 1188 "-M MAXIMAL_SIZE maximal file size for hpcs and stob, maximal\n" 1189 " IO size for csum, cache size if non-0 for db [%llu].\n" 1190 "-i use O_DIRECT flag when opening files [off].\n" 1191 "-e use O_EXCL flag when opening files [off].\n\n" 1192 "-B bound threads mode. For hpcs: NR_THREADS work in\n" 1193 " each of NR_DIR directories; for csum---every thread\n" 1194 " works with its own buffer. For stob: NR_THREADS do IO\n" 1195 " against each storage object (NR_LINUX or \n" 1196 " NR_LINUX*NR_AD). [off].\n" 1197 "-r PERCENT percentage of reads in read-write work-loads [%i].\n" 1198 " \"hpcs\" workload specific options\n" 1199 "-f FILE_PATTERN file name pattern for sprintf(3). It is formatted with\n" 1200 " three unsigned int arguments:\n" 1201 " . a directory index;\n" 1202 " . a randomly selected file index;\n" 1203 " . a sequential operation index.\n" 1204 " (Positional arguments %%nn$ can be used.) [%s]\n" 1205 "-d NR_DIR number of directories [%i].\n" 1206 " \"csum\" workload specific options\n" 1207 "-D DEVICE path to main device. If not set, stdio is used.\n" 1208 "-C CSUM_DEVICE path to check-summing device. No check-summing if\n" 1210 " Up to %i (device, checksum device) pair can be\n" 1212 "-c LABEL check-sum algorithm to use, see below [%s].\n" 1213 "-S CSUM_BLOCK_SIZE size of block to check-sum [%llu].\n" 1214 "-z CSUM_SIZE size of a checksum [%llu].\n" 1215 "-w TYPE byte swapping. Valid types are:\n" 1216 " 0 no byte swapping;\n" 1217 " 1 32bit swapping;\n" 1218 " 2 32bit swapping with writeback;\n" 1219 " 3 64bit swapping;\n" 1220 " 4 64bit swapping with writeback\n" 1222 " \"db\" workload specific options\n" 1223 "-f, -d have the same meaning as in \"hpcs\".\n" 1224 "-k NR_PAGES kill NR_PAGES pages from db pool every 1s with\n" 1225 " ->mem_trickle().\n" 1226 "-R REC_SIZE date-base record size [use structure size.\n" 1227 "-l instead of populating data-base with records,\n" 1228 " dump records from existing data-base, checking their\n" 1230 "-z {FLAG} set locking flag:\n" 1231 " d automatically detect and resolve\n" 1232 " deadlocks by aborting yongest transactions;\n" 1233 " o{NR} use internal locking instead of db one\n" 1234 " with NR locks per directory.\n" 1235 "-F {TYPE}{FLAG} specify db flag. TYPE can be one of \n" 1239 " FLAG of 0 clears all flags. Valid flags for each type\n" 1240 " are listed below.\n" 1241 " \"stob\" workload specific options\n" 1242 "-d NR_LINUX number of storage objects in linux storage domain [%i].\n" 1243 "-D OBJECT path to an existing file (or device) to be used for\n" 1244 " benchmarking. Can be given multiple times. If fewer\n" 1245 " than NR_LINUX objects are given, missing objects are\n" 1246 " created. Extra objects are ignored.\n" 1247 "-A NR_AD number of ad (allocation data) objects to be created\n" 1248 " in each linux object. If this option is not specified,\n" 1249 " no ad domains are created.\n" 1250 " (with -D option) [0].\n" 1251 "-q Generate sequential offsets in workload.\n" 1252 "-T Parse trace log produced by crashed stob workload.\n" 1253 "-S <filename> Read workload options from a yaml file.\n" 1255 "Numerical values can be in decimal, octal and hexadecimal as understood\n" 1256 "by strtoull(3), optionally followed by a suffix \'b\', \'k\', \'m\', \'g\',\n" 1257 "\'B\', \'K\', \'M\', \'G\', where lower-case multipliers are binary and\n" 1258 "upper-case---decimal ('b' means 512 and 'B' means 500).\n" 1260 "All sizes are in bytes. Available checksum algorithms:\n",
1276 printf(
"%s ",
csums[
i].ca_label);
1284 for(
i = 0;
i <= idx;
i++) {
1287 w[
i].
u.cw_io))->cwi_filename);
1300 uint64_t nr_segments;
1303 static const char opts[] =
1304 "k:s:o:f:t:W:a:r:R:ez:D:UM:BA:S:Hw:iF:d:C:c:pqb:Thvl";
1308 return EXIT_FAILURE;
1322 while ((
ch = getopt(argc, argv, opts)) != -1) {
1331 errx(1,
"-W must precede workload options");
1344 errx(1,
"too many workloads (%i)", idx);
1350 errx(1,
"unknown workload type (%s)",
optarg);
1354 errx(1,
"failed to init the workload: %d",
rc);
1362 fprintf(stderr,
"Unable to parse workload:" 1370 cwi =
load->u.cw_io;
1375 "greater than block size " 1377 " BLOCK_SIZE =%" PRIu64 "\n",
1384 "IOSIZE/BLOCK_SIZE\n");
1437 if (rfrac < 0 || rfrac > 100)
1438 errx(1,
"invalid percentage (%s)",
optarg);
1447 errx(1,
"unknown option '%c' for workload type %s",
1455 for (
i = 0;
i <= idx; ++
i) {
static uint32_t csum_shuffle32(uint32_t in)
void m0_op_run_index(struct workload *w, struct workload_task *task, const struct workload_op *op)
const int cr_default_nr_dir
#define M0_ALLOC_ARR(arr, nr)
static void fletcher_2_native(void *buf, uint64_t size)
M0_INTERNAL int struct dentry struct kstat * stat
struct workload::@328::cr_csum cw_csum
const bcnt_t cr_default_csum_size
struct workload * wt_load
double tsec(const struct timeval *tval)
static void csum_run(struct workload *w, struct workload_task *task)
void m0_op_run(struct workload *w, struct workload_task *task, const struct workload_op *op)
void run_index(struct workload *w, struct workload_task *tasks)
double rate(bcnt_t items, const struct timeval *tval, int scale)
const char cr_default_fpattern[]
const bcnt_t cr_default_max_ksize
static int hpcs_fini(struct workload *w)
M0_INTERNAL void m0_instance_setup(struct m0 *instance)
static unsigned long long getrnd(unsigned long long a, unsigned long long b)
static const struct workload_type_ops w_ops[CWT_NR]
static const struct csum_alg csums[]
static void csum_touch(void *buf, uint64_t size)
static void csum_csum(struct workload *w, struct cr_csum *s, char *buf, bcnt_t count)
void print_workload_detail(struct workload *w, int idx)
void workload_start(struct workload *w, struct workload_task *task)
struct workload_task * wo_task
void timeval_norm(struct timeval *t)
static int hpcs_parse(struct workload *w, char ch, const char *optarg)
void(* wto_op_run)(struct workload *w, struct workload_task *task, const struct workload_op *op)
unsigned long long getnum(const char *str, const char *msg)
static int csum_init(struct workload *w)
const short cr_default_read_frac
static void csum_compute(struct workload *w, void *buf, size_t count)
static void csum_op_run(struct workload *w, struct workload_task *task, const struct workload_op *op)
static void csum_check(struct workload *w)
uint32_t cwi_bcount_per_op
static void hpcs_check(struct workload *w)
static struct cr_csum * w2csum(struct workload *w)
return M0_ERR(-EOPNOTSUPP)
const bcnt_t cr_default_avg
int workload_init(struct workload *w, enum cr_workload_type wtype)
void workload_join(struct workload *w, struct workload_task *task)
static void hpcs_op_get(struct workload *w, struct workload_op *op)
void timeval_sub(struct timeval *end, struct timeval *start)
union workload_task::@329 u
static struct m0_addb2_callback c
static struct m0_thread t[8]
static void csum_op_get(struct workload *w, struct workload_op *op)
void cr_set_debug_level(enum cr_log_level level)
struct workload_task::@329::task_csum wt_csum
static void hpcs_op_run(struct workload *w, struct workload_task *task, const struct workload_op *op)
static long long max(long long a, long long b)
const bcnt_t cr_default_blocksize
const bcnt_t cr_default_key_size
struct workload_task::@329::task_hpcs wt_hpcs
static void workload_fini(struct workload *w)
int(* wto_init)(struct workload *w)
static m0_bindex_t offset
unsigned long long bcnt_t
const bcnt_t cr_default_max
void(* wto_run)(struct workload *w, struct workload_task *task)
static void workload_run(struct workload *w)
static int workload_op_get(struct workload *w, struct workload_op *op)
static void hpcs_run(struct workload *w, struct workload_task *task)
static void csum_io(struct workload *w, struct cr_csum *s, const struct workload_op *op, bcnt_t offset, bcnt_t count, int opcode, const char *opname)
void(* wto_check)(struct workload *w)
void timeval_add(struct timeval *sum, struct timeval *term)
int parse_yaml_file(struct workload *load, int max_workload, int *index, char *config_file)
const int cr_default_nr_thread
int init(struct workload *w)
static int csum_dev_open(struct workload *w, const char *dev_name)
static long long min(long long a, long long b)
void(* wto_op_get)(struct workload *w, struct workload_op *op)
static int csum_fini(struct workload *w)
int(* wto_fini)(struct workload *w)
static void fletcher_4_native(void *buf, uint64_t size)
static int csum_parse(struct workload *w, char ch, const char *optarg)
static int hpcs_init(struct workload *w)
static struct cr_hpcs * w2hpcs(struct workload *w)
void cr_log(enum cr_log_level lev, const char *fmt,...)
static const struct @324 optable[COT_NR]
static void csum_none(void *buf, uint64_t size)
static void * worker_thread(void *datum)
M0_INTERNAL int m0_threads_once_init(void)
static const struct workload_type_ops * wop(struct workload *w)
const bcnt_t cr_default_max_vsize
static struct m0 instance
struct m0t1fs_filedata * fd
int fini(struct workload *w)
static enum csum_op_type rw_get(const struct workload *w)
void check(struct workload *w)
int main(int argc, char **argv)
const char * cr_workload_name[CWT_NR]
enum cr_workload_type cw_type
static uint64_t csum_shuffle64(uint64_t in)
static struct m0_sns_cm_repair_ag rag
void(* ca_func)(void *buf, uint64_t size)
static bcnt_t w_size(const struct workload *w)
static struct m0_addb2_source * s
const bcnt_t cr_default_block
void timeval_diff(const struct timeval *start, const struct timeval *end, struct timeval *diff)
struct workload::@328::cr_hpcs cw_hpcs