X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=options.c;h=7a4e7b5773c4fb675779addb179d0a8863a26400;hb=45f944b907acf5c8aeb6bca72c8932ea3ead258e;hp=8a8f24cb1ea29c246db248357c3a216f555bb7be;hpb=cf3a0518329fc341427fb9d81de5d7cb7cdd372c;p=fio.git diff --git a/options.c b/options.c index 8a8f24cb..7a4e7b57 100644 --- a/options.c +++ b/options.c @@ -376,6 +376,23 @@ static int str_rwmix_write_cb(void *data, unsigned long long *val) return 0; } +static int str_perc_rand_cb(void *data, unsigned long long *val) +{ + struct thread_data *td = data; + + td->o.perc_rand = *val; + return 0; +} + +static int str_perc_seq_cb(void *data, unsigned long long *val) +{ + struct thread_data *td = data; + + td->o.perc_rand = 100 - *val; + return 0; +} + + static int str_exitall_cb(void) { exitall_on_terminate = 1; @@ -805,7 +822,7 @@ static int str_verify_pattern_cb(void *data, const char *input) { struct thread_data *td = data; long off; - int i = 0, j = 0, len, k, base = 10; + int i = 0, j = 0, len, k, base = 10, pattern_length; char *loc1, *loc2; loc1 = strstr(input, "0x"); @@ -844,10 +861,23 @@ static int str_verify_pattern_cb(void *data, const char *input) * Fill the pattern all the way to the end. This greatly reduces * the number of memcpy's we have to do when verifying the IO. */ + pattern_length = i; while (i > 1 && i * 2 <= MAX_PATTERN_SIZE) { memcpy(&td->o.verify_pattern[i], &td->o.verify_pattern[0], i); i *= 2; } + + /* + * Fill remainder, if the pattern multiple ends up not being + * MAX_PATTERN_SIZE. + */ + while (i > 1 && i < MAX_PATTERN_SIZE) { + unsigned int b = min(pattern_length, MAX_PATTERN_SIZE - i); + + memcpy(&td->o.verify_pattern[i], &td->o.verify_pattern[0], b); + i += b; + } + if (i == 1) { /* * The code in verify_io_u_pattern assumes a single byte pattern @@ -936,38 +966,6 @@ static int gtod_cpu_verify(struct fio_option *o, void *data) return 0; } -static int kb_base_verify(struct fio_option *o, void *data) -{ - struct thread_data *td = data; - - if (td->o.kb_base != 1024 && td->o.kb_base != 1000) { - log_err("fio: kb_base set to nonsensical value: %u\n", - td->o.kb_base); - return 1; - } - - return 0; -} - -static int unit_base_verify(struct fio_option *o, void *data) -{ - struct thread_data *td = data; - - /* 0 = default, pick based on engine - * 1 = use bits - * 8 = use bytes - */ - if (td->o.unit_base != 0 && - td->o.unit_base != 1 && - td->o.unit_base != 8) { - log_err("fio: unit_base set to nonsensical value: %u\n", - td->o.unit_base); - return 1; - } - - return 0; -} - /* * Option grouping */ @@ -1661,6 +1659,32 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .category = FIO_OPT_C_IO, .group = FIO_OPT_G_RANDOM, }, + { + .name = "percentage_random", + .lname = "Percentage Random", + .type = FIO_OPT_INT, + .cb = str_perc_rand_cb, + .maxval = 100, + .help = "Percentage of seq/random mix that should be random", + .def = "100", + .interval = 5, + .inverse = "percentage_sequential", + .category = FIO_OPT_C_IO, + .group = FIO_OPT_G_RANDOM, + }, + { + .name = "percentage_sequential", + .lname = "Percentage Sequential", + .type = FIO_OPT_INT, + .cb = str_perc_seq_cb, + .maxval = 100, + .help = "Percentage of seq/random mix that should be sequential", + .def = "0", + .interval = 5, + .inverse = "percentage_random", + .category = FIO_OPT_C_IO, + .group = FIO_OPT_G_RANDOM, + }, { .name = "nrfiles", .lname = "Number of files", @@ -2372,7 +2396,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .lname = "Lock memory", .type = FIO_OPT_STR_VAL, .off1 = td_var_offset(lockmem), - .help = "Lock down this amount of memory", + .help = "Lock down this amount of memory (per worker)", .def = "0", .interval = 1024 * 1024, .category = FIO_OPT_C_GENERAL, @@ -2649,12 +2673,16 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .type = FIO_OPT_STR, .cb = str_numa_cpunodes_cb, .help = "NUMA CPU nodes bind", + .category = FIO_OPT_C_GENERAL, + .group = FIO_OPT_G_INVALID, }, { .name = "numa_mem_policy", .type = FIO_OPT_STR, .cb = str_numa_mpol_cb, .help = "NUMA memory policy setup", + .category = FIO_OPT_C_GENERAL, + .group = FIO_OPT_G_INVALID, }, #endif { @@ -2794,7 +2822,6 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .type = FIO_OPT_BOOL, .off1 = td_var_offset(group_reporting), .help = "Do reporting on a per-group basis", - .def = "1", .category = FIO_OPT_C_STAT, .group = FIO_OPT_G_INVALID, }, @@ -3091,20 +3118,42 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .lname = "KB Base", .type = FIO_OPT_INT, .off1 = td_var_offset(kb_base), - .verify = kb_base_verify, .prio = 1, .def = "1024", + .posval = { + { .ival = "1024", + .oval = 1024, + .help = "Use 1024 as the K base", + }, + { .ival = "1000", + .oval = 1000, + .help = "Use 1000 as the K base", + }, + }, .help = "How many bytes per KB for reporting (1000 or 1024)", .category = FIO_OPT_C_GENERAL, .group = FIO_OPT_G_INVALID, }, { .name = "unit_base", + .lname = "Base unit for reporting (Bits or Bytes)", .type = FIO_OPT_INT, .off1 = td_var_offset(unit_base), - .verify = unit_base_verify, .prio = 1, - .def = "0", + .posval = { + { .ival = "0", + .oval = 0, + .help = "Auto-detect", + }, + { .ival = "8", + .oval = 8, + .help = "Normal (byte based)", + }, + { .ival = "1", + .oval = 1, + .help = "Bit based", + }, + }, .help = "Bit multiple of result summary data (8 for byte, 1 for bit)", .category = FIO_OPT_C_GENERAL, .group = FIO_OPT_G_INVALID,